Arduino Uno, 434Mhz Empfänger und Dekodierung von Manchester kodierten Daten.
ich versuche mittels arduino und einem 434mhz empfänger die daten eines funkthermometers zu dekodieren.
was ich bereits weiss:
das thermometer sendet alle 12 sekunden manchester kodierte daten unter verwendung von on-off keying.
jede Übetragung startet mit 8 kurzen pulsen von etwa 250us breite und mit einem abstand von 5ms.
danach folgen 12 byte manchester kodierte daten mit einer vierfachen wiederholung der gesamten Übetragung.
ich habe mir nun diesen sketch mehr oder weniger zusammengebaut unter zur hilfenahme anderen funkempfänger projekte.
wäre toll wenn sich das mal jemand anschauen könnte, da ich bzgl. der timer sache und dem interrupt nicht themenfest bin.
als anhang beigefügt die mit audacity mitgeschnittenen daten.
irgendwas mit dem timer scheint noch nicht ganz richtig zu sein, da ich hier unter duration nicht auf die ermittelten 250us breite mit 5ms abstand komme.
schimpft bitte mit mir, wenn irgendwelche infos fehlen oder ich etwas vergessen habe.
danke
was ich bereits weiss:
das thermometer sendet alle 12 sekunden manchester kodierte daten unter verwendung von on-off keying.
jede Übetragung startet mit 8 kurzen pulsen von etwa 250us breite und mit einem abstand von 5ms.
danach folgen 12 byte manchester kodierte daten mit einer vierfachen wiederholung der gesamten Übetragung.
ich habe mir nun diesen sketch mehr oder weniger zusammengebaut unter zur hilfenahme anderen funkempfänger projekte.
wäre toll wenn sich das mal jemand anschauen könnte, da ich bzgl. der timer sache und dem interrupt nicht themenfest bin.
code: [select]
#define set_input_capture_rising_edge() (tccr1b |= _bv(ices1))
#define set_input_capture_falling_edge() (tccr1b &= ~_bv(ices1))
#define state_start_pulses 0
#define state_first_bit 1
#define state_data 2
typedef unsigned int uint; //16bit
typedef signed int sint; //16bit
uint current_time;
uint duration;
uint previous_duratiom;
uint start_pulse_counter=0;
uint detection_state=0;
isr(timer1_ovf_vect)
{
}
isr(timer1_capt_vect){
current_time = icr1;
duration = (current_time - previous_duratiom);
previous_duratiom = current_time;
if (detection_state == state_start_pulses)
{
if ((duration >= 1255) && (duration <= 1315)) {
start_pulse_counter++;
serial.print(start_pulse_counter);
serial.print(" ");
serial.println(duration);
if (start_pulse_counter == 8) {
detection_state = state_first_bit;
start_pulse_counter = 0;
}
} else {
start_pulse_counter = 0;
}
}
else if (detection_state == state_first_bit)
{
detection_state = state_data;
}
else if (detection_state == state_data)
{
//serial.println(duration);
}
}
void setup() {
serial.begin(115200);
ddrb = 0x2f; // b00101111
ddrb &= ~(1<<ddb0); // pbo(icp1) input = pin8
portb &= ~(1<<portb0); // ensure pullup resistor disabled
ddrd |= b11000000; // (1<<portd6); //ddrd |= (1<<portd7); (example of b prefix)
tccr1a = b00000000; //normal mode of operation, top = 0xffff, tov1 flag set on max
tccr1b = ( _bv(icnc1) | _bv(cs11) | _bv(cs10) );
set_input_capture_rising_edge();
timsk1 = ( _bv(icie1) | _bv(toie1) );
serial.println("ready receive data");
}
void loop() {}
als anhang beigefügt die mit audacity mitgeschnittenen daten.
irgendwas mit dem timer scheint noch nicht ganz richtig zu sein, da ich hier unter duration nicht auf die ermittelten 250us breite mit 5ms abstand komme.
schimpft bitte mit mir, wenn irgendwelche infos fehlen oder ich etwas vergessen habe.
danke
im interrupt-handler darfst du keine ausgaben auf die serielle schnittstelle machen. dies wäre zum einen viel zu langsam, aber noch viel wichtiger ist, dass es zu einem deadlock führen kann, einem einfrieren des arduinos (weil die interrupts gesperrt sind und nur ein interrupt den seriellen puffer leeren kann).
versuche, soviel wie möglich aus dem interrupt herauszunehmen und im loop() abzuhandeln, der interrupt-handler sollte kurz wie möglich sein.
alle variablen, die du im normalen code und im interrupt-handler verwenden willst, musst du "volatile" deklarieren.
habe ich das richtig verstanden, die dekodierung der daten hast du dich noch nicht gemacht, weil die start-pulse noch nicht richtig erkannt werden?
versuche, soviel wie möglich aus dem interrupt herauszunehmen und im loop() abzuhandeln, der interrupt-handler sollte kurz wie möglich sein.
alle variablen, die du im normalen code und im interrupt-handler verwenden willst, musst du "volatile" deklarieren.
habe ich das richtig verstanden, die dekodierung der daten hast du dich noch nicht gemacht, weil die start-pulse noch nicht richtig erkannt werden?
Arduino Forum > International > Deutsch (Moderator: uwefed) > Arduino Uno, 434Mhz Empfänger und Dekodierung von Manchester kodierten Daten.
arduino
Comments
Post a Comment