Probleme mit Interrupt Variablenübergabe

Gast #3313145
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
}
Gast #3320356
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."

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.