Hallo zusammen, ich verwende den ATMEGA16. Nun möchte ich das Senden von Daten über die serielle Schnittstelle zum Computer per Interrupt lösen. Die zu sendenden Daten lege ich in einem Buffer ab. Sobald Daten in diesem Buffer sind, möchte ich den Interrupt aktivieren. Das Problem ist nun, dass ich (bis anhin) zuerst "von Hand" ein Byte schreibe (mit UDR = 5;) und erst dann wird der erste Intrrupt ausgelöst. (ist ja auch logisch). Meine frage ist nun, kann ich denn Interrupt selber (also softwaremässig) auslösen? Mein erster Ansatz war, im UCSRA das TXC Bit zu setzen, das funktioniert aber nicht, da es nur gelöscht werden kann. mit freundlichen Grüssen chrigu
Hi In Assembler wäre eine Möglichkeit , die Interruptroutine beim ersten mal per 'call' aufzurufen. Aber es sieht nicht so aus, als ob du in Assembler programmierst. MfG Spess
Deine Vorgehensweise ist nicht ganz logisch. Du legst also Daten in einem Buffer ab, was hindert dich darauf, sofort die Daten rauszuschreiben, sobald sie vorliegen? Wann ist denn der Zeitpunkt an dem du "den IRQ aktivieren" möchtest? Zeitlich gesteuert?
Die Daten sollen sofort raus. Aber damit ein Interrupt ausgelöst wird, muss 1 Byte gesendet werden (soweit mein Wissensstand zur Zeit ist). Mit anderen Worten: wenn ich den Interrupt aktiviere, dann werden noch keine Daten gesendet, da kein Interrupt ausgelöst werden kann. Muss ich jetzt manuell das erste Byte senden damit dann der Rest der Interrupt übernimmt? mfg chrigu
Du brauchst das Bit UDRE nicht zu setzten, es ist nach dem Reset schon gesetzt. Und wenn Du das letzte Byte sendest, disablest Du den Interrupt, dann ist es fürs nächste Senden auch gesetzt. Das macht jeder so. Peter
das wird möglicherweise das Problem sein. Denn ich verwende den TX Complete Interrupt, und nicht den USART Data Register Emtpy Interrupt. Leider verstehe ich den unterschied auch nicht ganz!
> In Assembler wäre eine Möglichkeit , die Interruptroutine beim ersten > mal per 'call' aufzurufen. Alternativ könntest Du den Inhalt der ISR nicht direkt in diese schreiben, sondern in eine Funktion welche in der ISR aufgerufen wird. Diese Funktion kannst du nämlich dann auch von Hand aufrufen. Gruß, Thomas
@OP: Schau dir mal die Lib von http://jump.to/fleury (UART-Lib für AVR-GCC) an. Da geht es so: - Immer wenn Daten zum senden in den Puffer geschrieben werden, wird der UDRE-Interrupt aktiviert. - die UDRE-ISR schaut jedes mal nach, ob noch mehr gesendet werden soll: - wenn ja: wird das Byte ins UDR geschrieben - wenn nicht: wird der UDRE interrupt abgeschaltet ( Optional : der TXC-Interrupt kann anschließend z.b. bei Halb-duplex den sender abstellen ) hth. Jörg
Danke Jörg, du hast den Knoten in meinem Knopf gelöst, ich war einfach auf der falschen Fährte! mfg chrigu
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.