Forum: Compiler & IDEs Probleme mit Interrupt Variablenübergabe


von Katy (Gast)


Lesenswert?

Hallo,

ich programmiere derzeit mit dem Xmega 128a1 und Versuche Daten zu 
Empfangen, das funktioniert derzeit soweit auch, leider kommt in der ISR 
die gesendeten Daten richtig an und nach der Übergabe in die Main ist 
alles wieder auf 0 gesetzt.

Leider lassen sich so empfangene Daten nicht verarbeiten und ich weiß 
einfach nicht an was das liegen könnte.

Hoffe es hat vll jemand eine Idee
und ich bedanke mich schonmal für die Antworten.

Hier noch der Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include "delay.h"
4
5
void PMIC_init(void);
6
void USART_init(void);
7
8
#define LED_GREEN PIN6_bm;
9
#define LED_RED PIN5_bm;
10
11
volatile char Data;
12
volatile int e;
13
14
ISR(USARTE0_RXC_vect)
15
{
16
  PORTA.DIR = 0xff;
17
  Data = USARTE0_DATA;
18
  if (Data == 0b11000111)
19
  {
20
    PORTA.OUTSET = LED_RED;
21
    delay(10);
22
    PORTA.OUTCLR = LED_RED;
23
  }
24
  e=1;
25
}
26
27
28
29
int main(void)
30
{
31
  PMIC_init();
32
  USART_init();
33
  
34
  
35
  PORTA.DIR = 0xff;
36
  
37
  sei();
38
  
39
    while(1)
40
    {
41
42
    if (e == 1)
43
    {
44
      if (Data == 0b11000111)
45
      {
46
        PORTA.OUTSET = LED_GREEN;
47
        delay(10);
48
        PORTA.OUTCLR = LED_GREEN;
49
             }
50
      e = 0;
51
    }
52
    }
53
}
54
55
void PMIC_init (void)
56
{
57
  PMIC_CTRL = PMIC_HILVLEN_bm;
58
}
59
60
void USART_init (void)
61
{
62
  USARTE0.BAUDCTRLA = 0xC;
63
  USARTE0.BAUDCTRLB = 0;
64
  
65
  USARTE0.CTRLA = USART_RXCINTLVL_HI_gc;
66
  USARTE0.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
67
  
68
  PORTE.DIRCLR = PIN2_bm;
69
  PORTE.DIRSET = PIN3_bm;
70
  PORTE.DIRSET = PIN4_bm;
71
  PORTE.OUTSET = PIN4_bm;
72
}

von Klaus F. (kfalser)


Lesenswert?

Schaut eigentlich nicht falsch aus, kann vielleicht an der Funktion 
delay() liegen.
Sind das ms, µs, oder gar sekunden?
Wartezeiten in der Interrupt Routine sind eigentlich eine schlechte 
Idee.

von benedikt (Gast)


Lesenswert?

Wo kommen die Daten denn her? Und was wird gesendet, d.h. wird wenn 
nicht gerade 0b11000111 gesendet wird u.U. was anderes übertragen (\r 
oder \n z. B.)? Wenn das der Fall ist könnte das Problem darin liegen, 
dass während des delays in der ISR bereits das nächste (von 0b11000111 
verschiedene Byte) ankommt. Dann würde das UART RX Complete Flag noch 
während der ISR erneut gesetzt, diese also unmittelbar (könnte sein dass 
da noch einige Takte Verzögerung durch die Interruptlogik reinkommen) 
nach ihrem Ende erneut aufgerufen werden.
1
    if (e == 1)
2
    {
3
      if (Data == 0b11000111)
4
      {
würde dadurch irgendwo zwischendrin unterbrochen, und das zweite if 
möglicherweise schon mit dem nächsten Byte (oder sogar noch neueren, je 
nach Baudrate und delay) ausgeführt, welches aber nicht 0b11000111.

TL;DR
siehe eins über mir
"Wartezeiten in der Interrupt Routine sind eigentlich eine schlechte 
Idee."

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.