mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik uart interrupt geziehlt ausschalten


Autor: LUK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: LUK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph Budelmann (Firma: Budelmann Elektronik GmbH) (christophbudelmann) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: LUK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Detlef (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.