mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frame Error mit FUM DCF77 Empfänger


Autor: Robert N. (robbse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich versuche gerade das Funkuhrmodul von HKW ans laufen zu bekommen:
http://www.hkw-elektronik.de/deutsch/produkte/baug...

Nach Aktivierung der Eingangsleitung des Moduls beginnt dieses auch 
fleißig Daten zu senden, dummerweise erkennt mein AVR ständig nur Frame 
Errors...

Hier mal eine Zusammenfassung, so wie ich die Dokumentation von HKW 
verstanden habe: 300 Baud, 7 Daten- & 2 Stopbits, gerade Parität. In der 
Software soll man aber 8 Datenbits und keine Parität einstellen, da man 
das paritätsbit später von Hand auswerten kann.

Wieso bekomme ich dann bei diesem Code einen Frame Error gezeigt?
#include "main.h"
#include "fum.h"

U8 fum_rx_buffer[FUM_RX_BYTES];
U8 fum_rx_pointer;
U8 fum_rx_state;


void fum_init(void)
{
   // UBBRn = [f_CPU / (16 x baud)] -1
   UBRR1 = 207;
   // enable receiver & interrupt
   UCSR1B = ((1<<RXEN1)|(1<<RXCIE1));
   // set frame format: 8 data bits, 2 stop bits, no parity
   UCSR1C = ((1<<USBS1)|(1<<UCSZ11)|(1<<UCSZ10));
   
   // activate data transmission
   DDRD |= (1<<PORTD3);
   PORTD |= PORTD3; 
   
   fum_rx_state |= FUM_RX_DATA_LOST;
}


// RX INTERRUPT
#ifdef __GNUC__
  ISR (USART1_RX_vect)
#elif __ICCAVR__
  #pragma  vector = USART1_RX_vect
  __interrupt void rx_int(void)
#else
  #error Compiler not supported
#endif
{
   U8 status = UCSR1A;
   U8 data = UDR1;
   
   if(status & RX_FRAME_ERROR)
   {
      fum_rx_state |= FUM_RX_DATA_LOST;
      fum_rx_state |= FUM_RX_FRAME_ERR;
   }      
   
   if(fum_rx_state & FUM_RX_DATA_LOST)
   {
      if(data == FUM_RX_EOT)
      {
         fum_rx_state &= ~FUM_RX_DATA_LOST;
         fum_rx_state &= ~FUM_RX_FRAME_ERR;
         fum_rx_pointer = 0;
      }      
   }
   
   else
   {
      if(fum_rx_pointer < FUM_RX_BYTES)
      {
         fum_rx_buffer[fum_rx_pointer] = data;
         fum_rx_pointer++;
      }
      
      else
      {
         if(data == FUM_RX_EOT)
         {
            fum_rx_state |= FUM_RX_DATA_READY;         
            fum_rx_pointer = 0;
            UCSR1B &= ~((1<<RXEN1)|(1<<RXCIE1));
         }
         else
            fum_rx_state |= FUM_RX_DATA_LOST;
      }
   }
}

Nachtrag: AVR läuft bei 1MHz

MfG,
robbse

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.