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.

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?


Arduino Forum > International > Deutsch (Moderator: uwefed) > Arduino Uno, 434Mhz Empfänger und Dekodierung von Manchester kodierten Daten.


arduino

Comments

Popular posts from this blog

Convierte tu Raspberry en un NAS. Firmware fvdw-sl 15.3 - Raspberry Pi Forums

How to format a Get Request

avrdude: verification error, first mismatch at byte 0x0000 0x0c != 0x62