Arduino Due - Serial AND Interrupt = FREEZE

Gast #6059511
Lesenswert?
• ▲
▼
Guten Tag.
Ich möchte mit dem Arduino Due ein 8-Bit breites Signal über den 
Serial-Port übertragen der über den Serial-Monitor in der Arduino-IDE 
empfangen wird. Dazu benutze ich an einem digitalen Eingang einen 
Interrupt der auf FALLING reagiert. Das ganze funktioniert auch nach ein 
paar übertragenen Bytes super. Dann allerdings kommt keine serielle 
Übertragung mehr zustande. Nach einem Reset des DUEs funktioniert es 
wieder für wenige Bytes. Dann ist wieder Schluss. Wer kann sich das 
erklären?

Lieben Gruß
Tom
1
const int Data_Bit_7 = 11;
2
const int Data_Bit_6 = 10;
3
const int Data_Bit_5 = 9;
4
const int Data_Bit_4 = 8;
5
const int Data_Bit_3 = 7;
6
const int Data_Bit_2 = 6;
7
const int Data_Bit_1 = 5;
8
const int Data_Bit_0 = 4;
9

10
const int Control_STROBE = 32;
11

12
byte data_register = 0;
13

14
void setup() {
15
  // put your setup code here, to run once:
16
  
17
  pinMode(Control_STROBE, INPUT_PULLUP);
18
  
19
  pinMode(Data_Bit_7, INPUT);
20
  pinMode(Data_Bit_6, INPUT);
21
  pinMode(Data_Bit_5, INPUT);
22
  pinMode(Data_Bit_4, INPUT);
23
  pinMode(Data_Bit_3, INPUT);
24
  pinMode(Data_Bit_2, INPUT);
25
  pinMode(Data_Bit_1, INPUT);
26
  pinMode(Data_Bit_0, INPUT);
27

28
  Serial.begin(19200);
29

30
  attachInterrupt(digitalPinToInterrupt(Control_STROBE), strobe_INT, FALLING);  
31
  
32
}
33

34
void loop() {
35
  
36
}
37

38
void strobe_INT() {    
39
    noInterrupts();
40
    
41
    incomming_Data();    
42
    Serial.print(data_register, HEX);
43
    Serial.print(' ');
44
    
45
    interrupts();
46
}
47

48
void incomming_Data() {  
49
  bitWrite(data_register, 0, digitalRead(Data_Bit_0));
50
  bitWrite(data_register, 1, digitalRead(Data_Bit_1));
51
  bitWrite(data_register, 2, digitalRead(Data_Bit_2));
52
  bitWrite(data_register, 3, digitalRead(Data_Bit_3));
53
  bitWrite(data_register, 4, digitalRead(Data_Bit_4));
54
  bitWrite(data_register, 5, digitalRead(Data_Bit_5));
55
  bitWrite(data_register, 6, digitalRead(Data_Bit_6));
56
  bitWrite(data_register, 7, digitalRead(Data_Bit_7));
57
}
Gast #6059538
Lesenswert?
• ▲
▼
noInterrupts() und interrupts() benötigst du nicht, dass sollte der 
Arduino Rahmen für dich erledigen.

Serial wurde schon gesagt.


Und für byte data_register = 0; könnte volatile von Nutzen sein.
Beitrag #6059602 wurde von einem Moderator gelöscht.
Beitrag #6059609 wurde von einem Moderator gelöscht.
Gast #6059690
Lesenswert?
• ▲
▼
Tom schrieb:
> Vor dem Due hatte ich einen Uno. Der war auf jeden Fall langsam.

Lass dich nicht verarschen re Arduino Speed.

> Schon
> schade dass noInterrupts() hier nicht hilfreich ist.

Interrupts sind sowieso disabled in einer ISR. Das Problem ist, dass 
Serial.print() selber Interrupts verwendet, um den Sendebuffer zu 
leeren. Da diese aber ausbleiben, haengt dein Programm.
S. auch e.g. https://forum.arduino.cc/index.php?topic=131801.0

Setze also in der ISR ein (volatile) Flag, dass was zu tun ist und 
verwende dieses in loop().

Als naechstes kannst du mal ueber den Vorteil von Schleifen nachdenken.

leo
Gast #6059852
Lesenswert?
• ▲
▼
Kaj schrieb:
> Der Due ist ein Cortex-M3

Und auch der disabled mindestens den gleichen Interrupt im Handler. Da 
das Interrupt-Flag in SW zurückgesetzt werden muß, würde er sonst nie 
den ersten C-Befehl des Handlers erreichen. Er käme noch nicht mal dazu, 
ein paar Register zu retten.

MfG Klaus

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.