Wasserkäfer
10.07.2008, 20:58
Hallo,
bin gerade dabei mir eine Funkuhr zu bauen. Das Signal empfange ich mittlerweile problemlos. Jetzt wollte ich das empfangene Signal umwandeln aber das klappt überhaupt nicht.
Ich speichere die ganzen 59 Bits in char dcf[60];
Nun wollte ich das aber über eine Struktur lösen. In meinem Programm zählt eine Variable dcf_ctr die einzelnen Bits des Signals hoch. Habe mal mit einer Struktur angefangen um die Wetterinformationen zu speichern aber habs nicht geschafft die ersten 15 bits in der Struktur zu speichern. Hier mal mein Code:
#include "avr/io.h"
#include "function.h"
#include <avr/interrupt.h>
volatile uint16_t dcf_time = 0; //Zählvariable DCF Pausen
uint8_t dcf_before = 1; //DCF Signal zuvor
uint8_t dcf_flag = 0; //DCF Signal aktuell
uint8_t dcf_ctr = 0; //DCF Bitzähler
char dcf[60]; //Codiertes DCF Signal 59 bit
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
if(dcf_time > 770 && dcf_time < 830) //Erkenne Pause von 800 ms = logisch 1
{
dcf[dcf_ctr] = '1';
dcf_ctr++;
}
if(dcf_time > 870 && dcf_time < 930) //Erkenne Pause von 900 ms = logisch 0
{
dcf[dcf_ctr] = '0';
dcf_ctr++;
}
if(dcf_time > 1770 && dcf_time < 1830) //Erkenne Pause von 1800 ms = logisch 1, Ende der Übertragung
{
dcf[dcf_ctr] = '1';
sendUSART(dcf);
sendUSART("\r\n");
dcf_ctr = 0;
}
if(dcf_time > 1870 && dcf_time < 1930) //Erkenne Pause von 1900 ms = logisch 0, Ende der Übertragung
{
sendUSART(dcf);
sendUSART("\r\n");
dcf_ctr = 0;
}
dcf_time = 0; //Zeitvariable zurücksetzen
}
}
dcf_before = dcf_flag; //Alten Pegel in der Variable dcf_before speichern
}
Alles was mit der Struktur zu tun hatte wurde entfernt da das Programm sonst nimmer korrekt funktionierte.
Meine Struktur sah so aus:
Mit voran gestellten typedef hat mir AVR Studio gleich nen Fehler ausgespuckt. Kann mir einer sagen warum?
struct
{
weather[15];
}dcf_struct;
Und zum speichern habe ich bei jeder Pausenerkennung eine if-Abfrage eingebaut. Hier das Beispiel für ne 1 erkannt.
if(dcf_ctr <=14){
dcf_struct.weather |= (1<<dcf_ctr);
}
Der richtig Emfpangene DCF String hat nie mit dcf_struct.weather übereingestimmt. Hab auch Probleme dcf_struct.weather über USART auszugeben. Sendet nur wirres Zeug und itoa geht auch nicht.
Das man USART nicht in Interrupts aufruft ist mir klar, ist nur zum Debuggen drinn :)
Wäre um jede Hilfe froh wie ich das mit Strukturen lösen kann.
Vielen Dank schonmal
bin gerade dabei mir eine Funkuhr zu bauen. Das Signal empfange ich mittlerweile problemlos. Jetzt wollte ich das empfangene Signal umwandeln aber das klappt überhaupt nicht.
Ich speichere die ganzen 59 Bits in char dcf[60];
Nun wollte ich das aber über eine Struktur lösen. In meinem Programm zählt eine Variable dcf_ctr die einzelnen Bits des Signals hoch. Habe mal mit einer Struktur angefangen um die Wetterinformationen zu speichern aber habs nicht geschafft die ersten 15 bits in der Struktur zu speichern. Hier mal mein Code:
#include "avr/io.h"
#include "function.h"
#include <avr/interrupt.h>
volatile uint16_t dcf_time = 0; //Zählvariable DCF Pausen
uint8_t dcf_before = 1; //DCF Signal zuvor
uint8_t dcf_flag = 0; //DCF Signal aktuell
uint8_t dcf_ctr = 0; //DCF Bitzähler
char dcf[60]; //Codiertes DCF Signal 59 bit
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
if(dcf_time > 770 && dcf_time < 830) //Erkenne Pause von 800 ms = logisch 1
{
dcf[dcf_ctr] = '1';
dcf_ctr++;
}
if(dcf_time > 870 && dcf_time < 930) //Erkenne Pause von 900 ms = logisch 0
{
dcf[dcf_ctr] = '0';
dcf_ctr++;
}
if(dcf_time > 1770 && dcf_time < 1830) //Erkenne Pause von 1800 ms = logisch 1, Ende der Übertragung
{
dcf[dcf_ctr] = '1';
sendUSART(dcf);
sendUSART("\r\n");
dcf_ctr = 0;
}
if(dcf_time > 1870 && dcf_time < 1930) //Erkenne Pause von 1900 ms = logisch 0, Ende der Übertragung
{
sendUSART(dcf);
sendUSART("\r\n");
dcf_ctr = 0;
}
dcf_time = 0; //Zeitvariable zurücksetzen
}
}
dcf_before = dcf_flag; //Alten Pegel in der Variable dcf_before speichern
}
Alles was mit der Struktur zu tun hatte wurde entfernt da das Programm sonst nimmer korrekt funktionierte.
Meine Struktur sah so aus:
Mit voran gestellten typedef hat mir AVR Studio gleich nen Fehler ausgespuckt. Kann mir einer sagen warum?
struct
{
weather[15];
}dcf_struct;
Und zum speichern habe ich bei jeder Pausenerkennung eine if-Abfrage eingebaut. Hier das Beispiel für ne 1 erkannt.
if(dcf_ctr <=14){
dcf_struct.weather |= (1<<dcf_ctr);
}
Der richtig Emfpangene DCF String hat nie mit dcf_struct.weather übereingestimmt. Hab auch Probleme dcf_struct.weather über USART auszugeben. Sendet nur wirres Zeug und itoa geht auch nicht.
Das man USART nicht in Interrupts aufruft ist mir klar, ist nur zum Debuggen drinn :)
Wäre um jede Hilfe froh wie ich das mit Strukturen lösen kann.
Vielen Dank schonmal