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


von Olaf :. (opetersen)


Angehängte Dateien:

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.
1
for(;;)
2
  {
3
4
    receive();  // über das Funkmodul empfangen
5
    
6
    if(Gettime() >= (zeit + 100))    // alle 100ms
7
    {  
8
      zeit = Gettime();                // ruft die aktuelle systemzeit ab  
9
      /******  Eingänge Lesen *********/
10
      
11
      //batteryVoltage = ReadChannel(PA3);    // Liest die BatterieSpannung
12
      
13
      // *************  Motorregelung ***************
14
      //regelung(LEFT);      // linken Motor regeln
15
      //regelung(RIGHT);    // rechten Motor regeln  
16
      
17
      // *************  Serielle Kommunikation ******
18
      if(rfm12_getc(&buf) == 1)
19
      { // pcc_rx(buf);    // PC Kommunikation
20
      }
21
      //pcc(); // Befehlsinterpreter
22
      
23
      LED2_TOG;
24
    
25
    } // end every 100ms
26
    
27
  } // end endlesloop
28
29
// Über funk empfangen
30
void receive(void)
31
{  
32
  uint8_t tmp_sreg;
33
  tmp_sreg = SREG;
34
  //cli();
35
  
36
  // Empfangen
37
  if(rf12_rxdata(test))
38
  {
39
40
    LED1_TOG;
41
    
42
    // über Uart ausgeben
43
    uart_puts((char*)test);
44
    
45
    // Pause
46
    for(long a = 0;a<10000;a++){asm("nop");}
47
    
48
    // zurücksenden
49
    rf12_txdata(test,100);
50
    
51
    fifo_put(&infifo, test[0]);
52
    
53
    LED1_TOG;
54
  }
55
56
  //SREG = tmp_sreg;
57
58
}
59
60
// empfangene daten ausgeben
61
uint8_t rfm12_getc(uint8_t *date)
62
{
63
  uint8_t data = 0;
64
  
65
  if (fifo_get(&infifo, &data)==0){
66
    *date = data;
67
    return 1;
68
  } else {
69
    return 0;
70
  }
71
}
72
// Aus der nbot_lib\Timer.c
73
/****************************************************************************/
74
/*!
75
  \brief
76
  Gibt die aktuelle Zeit in ms zurueck.
77
78
  Die vergangene Zeit seit dem Einschalten\n
79
  Genauer: nachdem der Interrupt Timer2 aktiviert wurde.\n
80
81
  \param
82
  keine
83
84
  \return
85
  Einschaltzeit in Millisekunden (Bereich: unsigned long 0..286331153)\n
86
  Das sind ca. 79.5 Stunden. Diese Zeitangabe reicht bis der Accu leer ist.
87
88
  \par  Beispiel:
89
  (Nur zur Demonstration der Parameter/Returnwerte)
90
  \code
91
  // Alle 500 ms die Front-LED umschalten.
92
  unsigned long zeit;
93
  unsigned char on_off = TRUE;
94
95
  zeit = Gettime ();
96
  while (1)
97
  {
98
    if (Gettime () > zeit + 500)
99
    {
100
      zeit = Gettime ();
101
      FrontLED (on_off);
102
      on_off ^= 1;
103
    }
104
  }
105
  \endcode
106
*****************************************************************************/
107
unsigned long Gettime (void)
108
{
109
  return ((timebase * 256) + count36kHz) / 36;
110
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.