Forum: Compiler & IDEs ISR() wird dauernd aufgerufen?


von tim (Gast)


Angehängte Dateien:

Lesenswert?

hi,
ich lasse im Hauptprogramm nur LEDs blinken.
Wenn ich mit einem Terminalprogramm ein Zeichen über RS232 schicke wird 
auch die ISR(USART_RXC_vect) aufgerufen.Nur,jetzt ist es so das die 
ISR() dauerhaft aufgerufen wird.
Freue mich über jeden Beitrag

von Hmm (Gast)


Lesenswert?

Hole das Zeichen direkt im interrupt aus dem UDR-Register. Lies mal im 
Datenblatt nach, was genau passiert, wenn der Interrupt auftritt und 
warum der Interrupt auftritt.

Und mache auch keine delays im interrupt.

von Rolf Magnus (Gast)


Lesenswert?

tim schrieb:
> Nur,jetzt ist es so das die ISR() dauerhaft aufgerufen wird.

Ist doch auch logisch. Die ISR wird aufgerufen, weil ein Zeichen zur 
Abholung bereitsteht. Nach Ablauf deiner ISR hat sich daran nichts 
geändert.

von Uwe (de0508)


Lesenswert?

Hallo,

noch eine weitere Anmerkung; lass doch den Compiler / Präprozessor die 
Uartwert für UBRR ausrechnen.

Zumindest das ist falsch :
1
//UCSZ0(Bit1) und UCSZ1(Bit2) : 8Bit Datenlänge  
2
  UBRRH = 0;                  
3
  UBRRL = 68;                    //8MHz ; 14400 Baurate

Passender wäre so etwas:
1
const uint16_t BAUDRATE = 19200;
2
const uint16_t UBRR = (uint16_t)(1.0 * F_CPU / 16 / BAUDRATE -0.5);

Du solltes auch die Fehler der Baudrate bzgl. der gewählten 
Quarzfrequenz beachten !

Für einen 8MHz Quarz ist 19200 optimal:
1
const uint16_t BAUDRATE = 19200;
2
const uint16_t UBBR = 25u; // aus obiger Rechnung !
3
const float Taktfehler = (1.0 * F_CPU) / (16ul * BAUDRATE * (UBBR +1)) -1; // 0,16%

von tim (Gast)


Lesenswert?

Danke
RXC ist solange 1 bis UDR ausgelesen wurde.

von Rolf Magnus (Gast)


Lesenswert?

Uwe S. schrieb:
> const uint16_t BAUDRATE = 19200;
> const uint16_t UBRR = (uint16_t)(1.0 * F_CPU  16  BAUDRATE -0.5);

Warum Variablen? Die belegen dann nur unnötig RAM. Mit einem Makro geht 
das doch genaus gut.

von Uwe (de0508)


Lesenswert?

Hallo,

das ist ein Beispiel und der Compiler legt hier keine Variablen an, da 
sie vom type "const" sind - also unveränderlich !
Der Vorteil ist, man(n) sieht sofort die Datentypen und der Compiler ist 
in der Lage einen Typeüberprüfung durch zu führen.

Ich denke, diese Umstände waren Dir nicht bekannt.

von Jonas B. (jibi)


Lesenswert?

ISR Flag wird gelöscht sobald du UDR ausliest also

unsigned char newChar;
newChar = UDR; //löscht das Flag

Gruß Jonas

von Karl H. (kbuchegg)


Lesenswert?

Uwe S. schrieb:
> Hallo,
>
> das ist ein Beispiel und der Compiler legt hier keine Variablen an, da
> sie vom type "const" sind - also unveränderlich !

Doch. Das sind Variablen.
Das const bedeutet nur, dass der Compiler überwacht, dass du nicht den 
Wert änderst (was man aber auch umgehen kann) und das er den Wert auch 
direkt verwenden kann, wenn er das will.
Aber erst mal sind das Variablen, wie alle anderen auch. Unter anderem 
auch daran erkennbar, dass man auf sie einen Adressoperator anwenden 
kann und sich aus anderen Files mittels extern auf sie beziehen kann.

Ob der Compiler in weiterer Folge in der Lage ist, diese Variablen 
wegzuoptimieren, steht auf einem anderen Blatt. Im gegenständlichen Fall 
muss das nicht unbedingt so sein. Wären die Dinger static, würden die 
Chancen steigen, dass der Compiler/Linker die Variablen tatsächlich 
eliminiert.


> Der Vorteil ist, man(n) sieht sofort die Datentypen und der Compiler ist
> in der Lage einen Typeüberprüfung durch zu führen.

Das zweifellos.

von Rolf Magnus (Gast)


Lesenswert?

Uwe S. schrieb:
> Hallo,
>
> das ist ein Beispiel und der Compiler legt hier keine Variablen an, da
> sie vom type "const" sind - also unveränderlich !

Mit dem const versprichst du dem Compiler, daß du sie nicht änderst, 
aber Variablen sind es trotzdem. In C gibt es keine echten Konstanten. 
Das ist ja auch der Grund, warum man meistens Makros benutzt und eben 
nicht const.

> Der Vorteil ist, man(n) sieht sofort die Datentypen und der Compiler ist
> in der Lage einen Typeüberprüfung durch zu führen.

Auch bei einem #define hat der Wert einen Typ, also kann der Compiler 
den auch prüfen, genauso, als ob es eine Variable wäre. Man sieht der 
Makro-Definition den Typ vielleicht nicht unbedingt so leicht an, was 
man aber mit einem Cast beheben könnte. Den hat dein Beispiel eh schon. 
Das könnte mit einem #define so aussehen:
1
#define UBRR (uint16_t) (1.0 * F_CPU / 16 / BAUDRATE -0.5)

Da erkennt man den Typ genauso schnell wie bei deinem
1
const uint16_t UBRR = (uint16_t)(1.0 * F_CPU / 16 / BAUDRATE -0.5);

> Ich denke, diese Umstände waren Dir nicht bekannt.

Mir sind die Umstände schon bekannt, dir aber anscheinend nicht so ganz.

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.