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
> während des empfangs habe ich bisher die interrups ausgeschaltet
und warum machst du das?
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.
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
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.
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.
> 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. ...
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.