Hallo,
bin auch noch Anfänger und versuche gerade das DCF Signal zu verarbeiten. Ich Frage den Portzustand über einen Interrupt alle 20ms ab. Das erkennen der Pausen 800/900/1800/1900 klappt soweit auch sehr gut. Bekomme immer Werte +- 20 ms per RS232 am PC angezeigt.
Wie ich jetzt die Pausenlänge den 0/1en zuordnen soll usw. versteh ich jetzt aber net. Hab schon bissl was probiert aber nichts hat geklappt. Per if im Hauptprogramm mit <= und >= Abfragen hat das nicht geklappt. Wäre sehr nett wenn ihr mir da einen Tipp geben könntet und euch mal das Programm bis jetzt anschaut.
Lässt sich bestimmt einiges noch verbessern aber bin schonmal ganz glücklich das die richtigen Pausen erkannt werden ^^
Hier mal ein Ausschnitt vom PC und den ZeitenCode:#include "avr/io.h" #include "function.h" #include <avr/interrupt.h> volatile uint16_t dcf_time = 0; uint8_t dcf_before = 1; uint8_t dcf_flag = 0; char dcf_t[4]; int main (void) { //Port Konfiguration DCF77 Empfänger dcf_ddr &= ~(1<<dcf_bit); //PinX als Eingang definieren dcf_port |= (1<<dcf_bit); //Pullup Widerstand für diesen Pin aktivieren //Debug Konfiguration, LED1, LED2 DDRC |= (1<<0) | (1<<1); //Bit0 PortC Ausgang PORTC |= (1<<0) | (1<<1); //Led an PortC aus //Timer 1 starten, Globale Interrups aktivieren init_timer(); //USART initialisieren init_USART(); /*############################################### # # # Hauptprogramm # # # ################################################*/ while(1) { //##################### DEBUG ### LED1 zeigt DCF77 Signal##################### if (dcf_pin & (1<<dcf_bit)) PORTC |= (1<<0); // Ausführen wenn HIGH else PORTC &= ~(1<<0); // Ausführen wenn LOW //############################################################################ } return 0; } //Portzustand DCF77 einlesen und in dcf_flag schreiben int get_dcf_bit() { if (dcf_pin & (1<<dcf_bit)) { dcf_flag = 1; }else{ dcf_flag = 0; } return(dcf_flag); } SIGNAL (SIG_OUTPUT_COMPARE1A) { PORTC ^= (1<<1); //DEBUG Zeige Frequenz vom Timer-Interrupt an LED2 get_dcf_bit(); //Pegel vom DCF Signal einlesen und in dcf_flag speichern if(dcf_flag == 1) //Wenn DCF Signal HIGH > Zeit messen { if(dcf_flag == dcf_before) //Führe aus, wenn sich Pegel nicht geändert hat { dcf_time += 20; //Zeit +20ms }else{ //Führe aus bei Pegeländerung itoa(dcf_time, dcf_t, 10); sendUSART(dcf_t); sendUSART(" \r\n"); dcf_time = 0; //Zeitvariable zurücksetzen } } dcf_before = dcf_flag; //Alten Pegel in der Variable dcf_before speichern }
lgCode:800 920 800 880 900 900 800 900 780 900 800 880 900 880 900 880 800 880 800 800 900 900 900 920 880 800 900 900 900 900 1900 900 800 800 880 880
Wasserkäfer







Zitieren

Lesezeichen