aboutsummaryrefslogtreecommitdiff
path: root/software/main.c
blob: 9e2cb5da870ab5c7c0cb9b5ac364054c648b9aca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// vim:set et sw=2 ts=2 tw=120:
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#include "inc/int/dcf77.h"

#define CTC_MATCH_OVERFLOW ((F_CPU / 1000) / 8)

// set bit
static inline void BIT_SET(volatile uint8_t* target, uint8_t bit) __attribute__((always_inline));
static inline void BIT_SET(volatile uint8_t* target, uint8_t bit) { *target |= (1 << bit); };

// set clear
static inline void BIT_CLEAR(volatile uint8_t* target, uint8_t bit) __attribute__((always_inline));
static inline void BIT_CLEAR(volatile uint8_t* target, uint8_t bit) { *target &= ~(1 << bit); };


/*
 * 
 * PB2        : connected to ShiftClock on Port 11
 * PB3        : connected to MemoryClock on Port 12 (shows content of memory)
 * PB4 (PIN3) : connected to SERIAL_IN on pin 14
 *
 */

void print_data(uint16_t data)
{
  BIT_CLEAR(&PORTB, PB3);
  for (char i = 0; i < 16; i++)
  {
    data & 0x1 << i
      ? BIT_SET(&PORTB, PB4)
      : BIT_CLEAR(&PORTB, PB4);
    // pulse sck...
    BIT_SET(&PORTB, PB2);
    BIT_CLEAR(&PORTB, PB2);
  }
  BIT_SET(&PORTB, PB3);
}

int main(void)
{

  BIT_CLEAR(&PORTB, PB5);
  _delay_ms(20);
  BIT_SET(&PORTB, PB5);
  BIT_CLEAR(&PORTB, PB5);
  _delay_ms(20);
  BIT_SET(&PORTB, PB5);



  // make all pins output pins...
  // DDRB  = 0xFF;
  DDRB   = 0b11111110;
  PORTB |= 1<<PB0; // activate pullup
  PORTB |= 1<<PB1; // activate receiver
  PORTB &= ~(1<<PB1);

  // DDRB &= ~(1 << PB0); // makes PB0 an input pin (INT0)
  // PORTB |= (1 << PB0); // activate input resistor

  // activate dcf77-receiver...
  // PORTB &=  (1 << PB1); // sets PB1 to low
  // _delay_ms(20);
  // PORTB &= ~(1 << PB1); // sets PB1 to low


  cli();

  GIMSK |= (1<<INT0); // External Interrupt Request 0 Enable
  GIMSK |= (1<<PCIE); // Pin Change Interrupt Enable

  // MCU Control Register (controls CPU-behaviours like interrupts & sleepmode)
  // MCUCR |= ~(1<<ISC01) | (1<<ISC00); // any logical change generates interrupt
  PCMSK |= (1<<PCINT0);
  // INT0_CONTROL = INT0_RISING_EDGE; // going to toggle int0-behaviour

  TCCR0A |= (1 << WGM01);              // CTC mode
  // TCCR0B |= (1 << CS00);
  TCCR0B |= (1 << CS01);               // Prescaler 8
  // TCCR0B |= (1 << CS02);               // Prescaler 256
  // OCR0A  |= (1 << WGM01);              // CTC mode

  // OCR0A   = 149;
  OCR0A   = 125;
  // OCR0A   = CTC_MATCH_OVERFLOW;
  TIMSK  |= (1 << OCIE0A);             // if you want interrupt

  sei();

  for(uint8_t i=0; i<16; i++)
  {
    print_data(3<<i);
    _delay_ms(5);
  }

  while (1)
  {
    //print_data(lastinterval<<1 | (PINB & PB0));

    print_data(
        (uint16_t) 0
        | ((uint16_t) (PINB & 0x0001))<<15
        | t_current.h<<8
        | t_current.m
        );
    // print_data(interval | ((PINB & PB0) == 1 ? 2 : 0));
    //print_data(PINB);
  }
  return 0;
}


/*
for(uint16_t hour=0; hour<24; hour++)
  for(uint16_t minute=0; minute<60; minute++)
    for (uint16_t second = 1; second < 60; second++)
    {
      // clear register (reset)
      // print_data(hour<< 12 | minute << 6 | second);
      // print_data((int64_t) dcf77);
      // dcf77[dcf77_bit].bit == 1
      //   ? print_data(0xFFFF)
      //   : print_data(0x0000);
    }A
*/
..