diff options
| author | Max Christian Pohle | 2017-05-26 00:02:32 +0200 |
|---|---|---|
| committer | Max Christian Pohle | 2017-05-26 00:02:32 +0200 |
| commit | 9cbb0d04bba30988d6e814726800444fa020e845 (patch) | |
| tree | ff458deb367a98fb718f722d05980ac3310a3070 | |
| parent | 25d1f4326cce046b245cd224f3e6335c1a6f76b0 (diff) | |
| download | binwatch-mini-9cbb0d04bba30988d6e814726800444fa020e845.tar.bz2 binwatch-mini-9cbb0d04bba30988d6e814726800444fa020e845.zip | |
Time decoding works.
| -rwxr-xr-x | inc/int/dcf77.c | 58 | ||||
| -rwxr-xr-x | inc/int/dcf77.h | 15 | ||||
| -rw-r--r-- | main.c | 42 |
3 files changed, 48 insertions, 67 deletions
diff --git a/inc/int/dcf77.c b/inc/int/dcf77.c index 13af50d..31f1663 100755 --- a/inc/int/dcf77.c +++ b/inc/int/dcf77.c | |||
| @@ -1,10 +1,14 @@ | |||
| 1 | // vim:set et sw=2 ts=2 tw=120: | 1 | // vim:set et sw=2 ts=2 tw=120: |
| 2 | #include "dcf77.h" | 2 | #include "dcf77.h" |
| 3 | 3 | ||
| 4 | // 7372800/a=10000 | ||
| 5 | // 115200 / a * x = 10000 | ||
| 6 | // 7372800/8/150 | ||
| 7 | |||
| 4 | // returns -1 on error | 8 | // returns -1 on error |
| 5 | unsigned char getBits(const DCF start, const char len) | 9 | unsigned char getBits(const DCF start, const char len) |
| 6 | { | 10 | { |
| 7 | static const unsigned char mult[] = {1, 2, 4, 8, 10, 20 ,40 ,80}; | 11 | static const unsigned char mult[] = {1, 2, 4, 8, 10, 20, 40, 80}; |
| 8 | /// unsigned char p = 1; //parity | 12 | /// unsigned char p = 1; //parity |
| 9 | unsigned char r = 0; // retval | 13 | unsigned char r = 0; // retval |
| 10 | unsigned char i; | 14 | unsigned char i; |
| @@ -15,32 +19,13 @@ unsigned char getBits(const DCF start, const char len) | |||
| 15 | return r; | 19 | return r; |
| 16 | } | 20 | } |
| 17 | 21 | ||
| 18 | void set_dcf_value() | ||
| 19 | { | ||
| 20 | t_current.m = (getBits(DCF_MIN, 7)) - 1; | ||
| 21 | t_current.h = (getBits(DCF_HOUR, 6)); | ||
| 22 | t_current.dd = (getBits(DCF_DAY, 6)); | ||
| 23 | t_current.wd = (getBits(DCF_WEEKDAY, 3)); | ||
| 24 | t_current.mm = (getBits(DCF_MONTH, 5)); | ||
| 25 | t_current.yy = (getBits(DCF_YEAR, 8)); | ||
| 26 | } | ||
| 27 | |||
| 28 | // 7372800/a=10000 | ||
| 29 | // 115200 / a * x = 10000 | ||
| 30 | // 7372800/8/150 | ||
| 31 | |||
| 32 | // interrupt service routine (ISR) for timer 0 A compare match | 22 | // interrupt service routine (ISR) for timer 0 A compare match |
| 33 | /* | ||
| 34 | ISR(TIMER0A_COMP_vect) // called 10000 times per second (12000000/8/150) | ||
| 35 | { | ||
| 36 | |||
| 37 | } | ||
| 38 | */ | ||
| 39 | ISR(TIMER0_COMPB_vect) | 23 | ISR(TIMER0_COMPB_vect) |
| 40 | { | 24 | { |
| 41 | 25 | ||
| 42 | } | 26 | } |
| 43 | 27 | ||
| 28 | // ISR(TIMER0A_COMP_vect) | ||
| 44 | ISR(TIMER0_COMPA_vect) | 29 | ISR(TIMER0_COMPA_vect) |
| 45 | { | 30 | { |
| 46 | interval++; | 31 | interval++; |
| @@ -69,43 +54,42 @@ ISR(INT0_vect) | |||
| 69 | 54 | ||
| 70 | ISR(PCINT0_vect) | 55 | ISR(PCINT0_vect) |
| 71 | { | 56 | { |
| 72 | interval = 1; | ||
| 73 | /// stdout_put_int(interval, uart_putc); | ||
| 74 | /// stdout_put_string("INT0 call\n", uart_putc); | ||
| 75 | // cli(); | ||
| 76 | |||
| 77 | // if(INT0_CONTROL == INT0_RISING_EDGE) | 57 | // if(INT0_CONTROL == INT0_RISING_EDGE) |
| 78 | // if(MCUCR & (1<<ISC00)) | 58 | // if(MCUCR & (1<<ISC00)) |
| 79 | // { | 59 | // { |
| 80 | if (interval > 1000 && interval < 2000) // 59th second - no rising edge at the beginning | 60 | if (interval > 1000 && interval < 2000) // 59th second - no rising edge at the beginning |
| 81 | { | 61 | { |
| 82 | /// if(dcf77_bit == 59) // check if every bit has been transfered | 62 | if(dcf77_bit == 59) // check if every bit has been transfered |
| 83 | // set_dcf_value(); // completely received- apply new time data | 63 | { |
| 64 | t_current.m = getBits(DCF_MIN, 7); | ||
| 65 | t_current.h = getBits(DCF_HOUR, 6); | ||
| 66 | t_current.dd = getBits(DCF_DAY, 6); | ||
| 67 | t_current.wd = getBits(DCF_WEEKDAY, 3); | ||
| 68 | t_current.mm = getBits(DCF_MONTH, 5); | ||
| 69 | t_current.yy = getBits(DCF_YEAR, 8); | ||
| 70 | } | ||
| 84 | 71 | ||
| 85 | // 59th second: synchronize with receiver... | 72 | // 59th second: synchronize with receiver... |
| 86 | TCNT0 = 0; | ||
| 87 | dcf77_bit = 0; | 73 | dcf77_bit = 0; |
| 88 | t_current.s = 0; | 74 | t_current.s = 0; |
| 89 | t_current.ms = 0; | 75 | t_current.ms = 0; |
| 90 | // t_current.us = 0; | 76 | |
| 91 | // falling edge causes interrupt... | 77 | // falling edge causes interrupt... |
| 92 | // MCUCR &= ~(1 << ISC00); | ||
| 93 | // MCUCR |= (1 << ISC01); | ||
| 94 | // INT0_CONTROL = INT0_FALLING_EDGE; | 78 | // INT0_CONTROL = INT0_FALLING_EDGE; |
| 95 | } | 79 | } |
| 96 | else // INT0_FALLING_EDGE | 80 | else // INT0_FALLING_EDGE |
| 97 | { | 81 | { |
| 98 | dcf77[dcf77_bit++].bit = interval >= 200 ? 1 : 0; | 82 | if(interval > 50 && interval < 150) |
| 83 | dcf77[dcf77_bit++].bit = 0; | ||
| 84 | else if(interval > 150 && interval < 250) | ||
| 85 | dcf77[dcf77_bit++].bit = 1; | ||
| 99 | 86 | ||
| 100 | // rising edge causes interrupt... | 87 | // rising edge causes interrupt... |
| 101 | // MCUCR |= (1 << ISC00); | ||
| 102 | // MCUCR |= (1 << ISC01); | ||
| 103 | // INT0_CONTROL = INT0_RISING_EDGE; | 88 | // INT0_CONTROL = INT0_RISING_EDGE; |
| 104 | // interval = 0; // reset interval to count next interval | ||
| 105 | } | 89 | } |
| 106 | 90 | ||
| 91 | TCNT0 = 0; | ||
| 107 | interval = 0; | 92 | interval = 0; |
| 108 | // sei(); | ||
| 109 | } | 93 | } |
| 110 | 94 | ||
| 111 | /* | 95 | /* |
diff --git a/inc/int/dcf77.h b/inc/int/dcf77.h index e47ca4e..2d79cdd 100755 --- a/inc/int/dcf77.h +++ b/inc/int/dcf77.h | |||
| @@ -9,7 +9,6 @@ | |||
| 9 | */ | 9 | */ |
| 10 | #include <avr/io.h> | 10 | #include <avr/io.h> |
| 11 | #include <avr/interrupt.h> | 11 | #include <avr/interrupt.h> |
| 12 | |||
| 13 | #include <stdint.h> | 12 | #include <stdint.h> |
| 14 | 13 | ||
| 15 | #define INT0_CONTROL MCUCR | 14 | #define INT0_CONTROL MCUCR |
| @@ -26,14 +25,14 @@ | |||
| 26 | 25 | ||
| 27 | typedef struct | 26 | typedef struct |
| 28 | { | 27 | { |
| 29 | uint16_t h ; // hour | 28 | uint16_t h; // hour |
| 30 | uint16_t m ; // minute | 29 | uint16_t m; // minute |
| 31 | uint16_t s ; // second | 30 | uint16_t s; // second |
| 32 | uint16_t ms; // milli second | 31 | uint16_t ms; // milli second |
| 33 | uint8_t yy; // year | 32 | uint8_t yy; // year |
| 34 | uint8_t mm; // month | 33 | uint8_t mm; // month |
| 35 | uint8_t dd; // day | 34 | uint8_t dd; // day |
| 36 | uint8_t wd; // weekday | 35 | uint8_t wd; // weekday |
| 37 | } Time; | 36 | } Time; |
| 38 | 37 | ||
| 39 | typedef enum | 38 | typedef enum |
| @@ -84,7 +84,7 @@ int main(void) | |||
| 84 | // OCR0A |= (1 << WGM01); // CTC mode | 84 | // OCR0A |= (1 << WGM01); // CTC mode |
| 85 | 85 | ||
| 86 | // OCR0A = 149; | 86 | // OCR0A = 149; |
| 87 | OCR0A = 124; | 87 | OCR0A = 125; |
| 88 | // OCR0A = CTC_MATCH_OVERFLOW; | 88 | // OCR0A = CTC_MATCH_OVERFLOW; |
| 89 | TIMSK |= (1 << OCIE0A); // if you want interrupt | 89 | TIMSK |= (1 << OCIE0A); // if you want interrupt |
| 90 | 90 | ||
| @@ -92,27 +92,25 @@ int main(void) | |||
| 92 | 92 | ||
| 93 | while (1) | 93 | while (1) |
| 94 | { | 94 | { |
| 95 | // uint16_t t = 1; | 95 | //print_data(lastinterval<<1 | (PINB & PB0)); |
| 96 | // for (uint16_t i=0; i<16; i++) | 96 | // uint16_t data = 0; |
| 97 | // { | 97 | // for(int i=0; i<16; i++) |
| 98 | // print_data(t_current.s); | 98 | // { |
| 99 | // uint16_t p = 0; | 99 | // if(i<4) |
| 100 | // for(int i=0; i<sizeof(t_current.s)*__CHAR_BIT__; i++) | 100 | // data |= (t_current.s & (1<<i)); |
| 101 | // p |= t_current.s & (1<<i); | 101 | // else if(i <= 10) |
| 102 | 102 | // data |= t_current.m & (1<<(i-4)); | |
| 103 | print_data(t_current.s); | 103 | // else |
| 104 | // print_data(t_current.s<<10 | interval | ((PINB & PB0) == 1 ? 2 : 0)); | 104 | // data |= t_current.h & (1<<(i-11)); |
| 105 | // t = t<<1; | 105 | // } |
| 106 | // } | 106 | // print_data(data); |
| 107 | // print_data(t_current.s); | 107 | |
| 108 | 108 | print_data( | |
| 109 | 109 | (uint64_t) 0 | |
| 110 | /* | 110 | | t_current.h<<8 |
| 111 | print_data(0xFFFF); | 111 | | t_current.m); |
| 112 | _delay_ms(1000); | 112 | //print_data(interval | ((PINB & PB0) == 1 ? 2 : 0)); |
| 113 | print_data(0x0000); | 113 | // print_data(PINB); |
| 114 | _delay_ms(1000); | ||
| 115 | */ | ||
| 116 | } | 114 | } |
| 117 | return 0; | 115 | return 0; |
| 118 | } | 116 | } |
