So, also hier nochmal mein kompletter code, jegliche Kritik und Verbesserung ist erwünscht, ich bin ja auch noch Anfänger in dieser Sache:
GrußCode:#include <avr/io.h> #include <avr/interrupt.h> #define BAUD 9600UL #include "../classes/rs232/UART/UART.h" volatile uint32_t t,t2; volatile unsigned char dcf=0xff; volatile unsigned char dcf_buf[128]; volatile unsigned char r; SIGNAL(SIG_OUTPUT_COMPARE2) { if(!(PINC & (1<<PC0))) //Kein Impuls==Pause { if(t>78000 && t<82000) //Wenn kleiner 900ms { if(dcf!='0') dcf='1'; } if(t>88000 && t<92000) //Wenn größer gleich 900ms { dcf='0'; } if(t>170000 && t<180000) //PAUSE für ENDEBIT { dcf_buf[t2]='1'; dcf_buf[t2+1]='\0'; t2=0; r='2'; } if(t>180000 && t<190000) //Pause für ENDEBIT { dcf_buf[t2]='0'; dcf_buf[t2+1]='\0'; t2=0; r='2'; } t++; } else //Impuls==timer zurücksetzen { if(dcf=='0' || dcf=='1') //Wenn Zeichen empfangen { dcf_buf[t2]=dcf; dcf_buf[t2+1]='\0'; dcf=0xff; t2++; } t=0; //Timer zurücksetzen } } void timer_init(void) { t2=0; t=0; r='0'; TCCR2=(1<<CS22) | (1<<WGM21); OCR2=160; //0,01ms (?) TIMSK|=(1<<OCIE2); sei(); } int main(void) { DDRC&=~(1<<PC0); //Eingangspin DCF-Signal PORTC|=(1<<PC0); //Pullups aktivieren timer_init(); //Timer initialisieren uart_init(); //UART inititalisieren while(1) { if(r=='2') //Wenn Signal zum Senden gesetzt { dcf=0xff; //Bit zurücksetzen r='0'; //Signal zurücksetzen send("DCF: "); send(dcf_buf); //Daten an PC senden send("\r\n"); } } return 0; }
cesupa
P.S.: Mein Atmega8 läuft mit einem externen 16MHz Quarz.







Zitieren

Lesezeichen