Forum: Mikrocontroller und Digitale Elektronik uart interrupt geziehlt ausschalten


von LUK (Gast)


Lesenswert?

hallo,

ich empfange über uart zeichen die dann weiterverarbeitet werden sollen. 
das funktioniert auch schon wunderbar. während des empfangs habe ich 
bisher die interrups ausgeschaltet. ich möchte jedoch mit einem taster 
einen weiteren interrupt auslösen. das funktioniert nur leider nicht da 
die interrupt deaktiviert wurden. lässt sich geziehlt der uart interrupt 
ausschalten?
programmiert wird das projekt in c!
danke schon mal für die antworten!

mfg

von Peter (Gast)


Lesenswert?

> während des empfangs habe ich bisher die interrups ausgeschaltet
und warum machst du das?

von Karl H. (kbuchegg)


Lesenswert?

LUK wrote:
> hallo,
>
> ich empfange über uart zeichen die dann weiterverarbeitet werden sollen.
> das funktioniert auch schon wunderbar. während des empfangs habe ich
> bisher die interrups ausgeschaltet. ich möchte jedoch mit einem taster
> einen weiteren interrupt auslösen. das funktioniert nur leider nicht da
> die interrupt deaktiviert wurden. lässt sich geziehlt der uart interrupt
> ausschalten?
> programmiert wird das projekt in c!
> danke schon mal für die antworten!

Aus deiner  ganzen Beschreibung geht hervor, dass dein Programmaufbau 
darin besteht, dass auf irgendwelche Ereignisse gewartet wird. Das ist 
der falsche Weg!

Dein Programm soll im wesentlichen so aussehen, dass es in main eine 
sog. Hauptschleife gibt.
In dieser Hauptschleife werden ständig alle möglichen Ereignisse 
abgefragt und entsprechend darauf reagiert. Kurze Reaktionszeit - der µC 
arbeitet scheinbar an mehreren Dingen gleichzeitig.

PS: Taster über Interrupt abzufragen, ist (ausser wenn der Taster den µC 
aufwecken muss) meistens sowieso eine schlechte Idee


Kurz und gut: Am wahrscheinlichsten ist es, dass deine komplette 
Programmstruktur nicht stimmt. Mit ein paar kleinen Änderungen dort und 
da ist es da in so einem Fall nicht getan.

von LUK (Gast)


Lesenswert?

danke schon mal für die antworten.
programm muss ich noch mal gucken.
muss aber auf jedenfall den uart interrupt deaktivieren während der 
andere interrupt noch aktiv ist.

ist das nicht irgendwie möglich?

mfg

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

LUK wrote:
> danke schon mal für die antworten.
> programm muss ich noch mal gucken.
> muss aber auf jedenfall den uart interrupt deaktivieren während der
> andere interrupt noch aktiv ist.
>
> ist das nicht irgendwie möglich?

Ich verstehe dein Problem nicht ganz: Wenn die Interrupts des UART nicht 
aktiviert wurden, loesen die auch nicht aus. Um einen Interrupt zu 
nutzen,
musst du das entsprechende Bit in den jeweiligen Registern setzen. 
Welche das sind, steht im Datenblatt des Controllers.

Zusaetzlich muessen die Interrupts global aktiviert werden (sei();).

Ansonsten fehlt auch irgendwie die Angabe des Controllers, ich bin jetzt 
mal von AVR ausgegangen.

von Karl H. (kbuchegg)


Lesenswert?

LUK wrote:
> danke schon mal für die antworten.
> programm muss ich noch mal gucken.
> muss aber auf jedenfall den uart interrupt deaktivieren während der
> andere interrupt noch aktiv ist.
>
> ist das nicht irgendwie möglich?

Möglich ist alles.
Wie hast du ihn denn eingeschaltet? Die Umkehrung davon ist dann 
ausschalten.

Aber es gilt immer noch: Normalerweise braucht man keine Interrupts zu 
deaktivieren. Die einzige Ausnahme ist es, wenn atomar auf globale 
Variablen zugegriffen wird, oder man tatsächlich gezielt irgendwelche 
Funktionalität abgeschaltet werden muss.
Aber innerhalb einer ISR musst du keinen Interrupt abschalten, da in 
einer ISR per Default die Interrupts sowieso deaktiviert sind, solange 
die ISR läuft.

Edit: Ach ja. Gehe auch davon aus, dass du einen AVR programmierst.

von Hannes Lux (Gast)


Lesenswert?

> muss aber auf jedenfall den uart interrupt deaktivieren während der
> andere interrupt noch aktiv ist.

Das musst Du nicht. Interrupts abschalten ist wie Klingel abstellen...

Du musst nur dafür sorgen, dass nirgendwo auf ein "Ereignis" gewartet 
wird.

Der UART-Interrupt legt das ankommende Byte in einen Puffer und meldet 
es per Merker (Jobflag) dem Hauptprogramm. Dieses pollt in der Mainloop 
die Merker und reagiert darauf.
Taster werden zyklisch abgefragt und dabeinebenher Entprellt. Siehe 
Entprellung.

...

von LUK (Gast)


Lesenswert?

ich mache was mit funkmodulen. immer wenn ich nen zeichen zum modul 
sende, schickt mir das modul das zeichen noch mal zurück. das bring mein 
problem total durcheinander wenn ich den interrupt nicht ausschaltet.

hiermit initialsiere ich men uart:

UCSRB = 0b10011000;

danke schon mal!

mfg

von Johannes M. (johnny-m)


Lesenswert?

LUK wrote:
> hiermit initialsiere ich men uart:
>
> UCSRB = 0b10011000;
Das ist schonmal ein erster Schritt zu völlig unlesbarem und 
wartungsunfreundlichem Code! Bitte benutze bei der Initialisierung der 
Steuerregister die Bitnamen! Du solltest Dich mal eingehend mit 
Bitmanipulation befassen.

von Karl H. (kbuchegg)


Lesenswert?

LUK wrote:
> ich mache was mit funkmodulen. immer wenn ich nen zeichen zum modul
> sende, schickt mir das modul das zeichen noch mal zurück. das bring mein
> problem total durcheinander wenn ich den interrupt nicht ausschaltet.

Warum sollte es?
Wenn du sowieso weißt, das das Modul alles was du ihm schickst 
zurückschickt, brauchst du doch nur auf das was zurückkommt nicht 
reagieren (wenn du dem Modul das Echo nicht anderweitig abdrehen kannst)
(Aber doch nicht in der Form, dass man den Interrupt abschaltet)

Du zäumst das Pferd immer noch am falschen Ende auf.

von Detlef (Gast)


Lesenswert?

Ich vermute mal, dass nicht das Modul Dir das Zeichen zurücksendet, 
sondern dass es sich hier um ein Echo handelt.

Der Sender selbst empfängt also die ausgesendete Botschaft. Das ist 
eigentlich normal.

Man kann das Echo einfach ignorieren, indem Du dir merkst, dass Du 
gerade selber gesendet hast. Wäre besser, als Interrupts "abzuschalten"

Detlef

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.