mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RF12 funktioniert bei timerinterrupts nicht mehr


Autor: Olaf :-) (opetersen)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich bastel gerade an meinem Robi rum.
Ich habe zwei rfm12 funkmodule und auch erfolgreich, dankt dem programm 
von Benedikt, Eckert und Ulrich Radig, damit versendet.

ich habe so eine art echo kommunikation aufgebaut. Dabei sende ich über 
UART vom PC an das erste Board. Dieses versendet die Nachricht dann per 
Funk.
Das zweite Board ist mein Roboter. Er lauscht immer und sendet, wenn er 
etwas empfangen hat, an den PC zurück(LED1 blinkt).

Nun soll mei roboter aber auch noch etwas anderes machen als nur 
lauschen.
Dafür habe ich einen Timer eingebaut, der alle 100ms (LED2 blinkt) etwas 
machen soll.

Leider Funktioniert beides zusammen nicht. Ich kann über funkt nichts 
empfangen.

Wenn ich jedoch in der Funktion receive() die globalen Interrupts 
deaktiviere, dann kann ich funken. Das führt aber dazu, dass mein Timer 
nicht mehr geht (LED2 blinkt nicht).

Ich weiß leider nicht so recht was ich da jetzt machen soll und woran 
das liegen kann.

ich hab mal ganz viel unnützen kram auskommentiert und das komplette 
Programm als Zipp angehängt.
for(;;)
  {

    receive();  // über das Funkmodul empfangen
    
    if(Gettime() >= (zeit + 100))    // alle 100ms
    {  
      zeit = Gettime();                // ruft die aktuelle systemzeit ab  
      /******  Eingänge Lesen *********/
      
      //batteryVoltage = ReadChannel(PA3);    // Liest die BatterieSpannung
      
      // *************  Motorregelung ***************
      //regelung(LEFT);      // linken Motor regeln
      //regelung(RIGHT);    // rechten Motor regeln  
      
      // *************  Serielle Kommunikation ******
      if(rfm12_getc(&buf) == 1)
      { // pcc_rx(buf);    // PC Kommunikation
      }
      //pcc(); // Befehlsinterpreter
      
      LED2_TOG;
    
    } // end every 100ms
    
  } // end endlesloop

// Über funk empfangen
void receive(void)
{  
  uint8_t tmp_sreg;
  tmp_sreg = SREG;
  //cli();
  
  // Empfangen
  if(rf12_rxdata(test))
  {

    LED1_TOG;
    
    // über Uart ausgeben
    uart_puts((char*)test);
    
    // Pause
    for(long a = 0;a<10000;a++){asm("nop");}
    
    // zurücksenden
    rf12_txdata(test,100);
    
    fifo_put(&infifo, test[0]);
    
    LED1_TOG;
  }

  //SREG = tmp_sreg;

}

// empfangene daten ausgeben
uint8_t rfm12_getc(uint8_t *date)
{
  uint8_t data = 0;
  
  if (fifo_get(&infifo, &data)==0){
    *date = data;
    return 1;
  } else {
    return 0;
  }
}
// Aus der nbot_lib\Timer.c
/****************************************************************************/
/*!
  \brief
  Gibt die aktuelle Zeit in ms zurueck.

  Die vergangene Zeit seit dem Einschalten\n
  Genauer: nachdem der Interrupt Timer2 aktiviert wurde.\n

  \param
  keine

  \return
  Einschaltzeit in Millisekunden (Bereich: unsigned long 0..286331153)\n
  Das sind ca. 79.5 Stunden. Diese Zeitangabe reicht bis der Accu leer ist.

  \par  Beispiel:
  (Nur zur Demonstration der Parameter/Returnwerte)
  \code
  // Alle 500 ms die Front-LED umschalten.
  unsigned long zeit;
  unsigned char on_off = TRUE;

  zeit = Gettime ();
  while (1)
  {
    if (Gettime () > zeit + 500)
    {
      zeit = Gettime ();
      FrontLED (on_off);
      on_off ^= 1;
    }
  }
  \endcode
*****************************************************************************/
unsigned long Gettime (void)
{
  return ((timebase * 256) + count36kHz) / 36;
}

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.