So, also hier nochmal mein kompletter code, jegliche Kritik und Verbesserung ist erwünscht, ich bin ja auch noch Anfänger in dieser Sache
:
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;
}
Gruß
cesupa
P.S.: Mein Atmega8 läuft mit einem externen 16MHz Quarz.
Lesezeichen