Forum: Mikrocontroller und Digitale Elektronik ATmega32 / USART / Verständnisproblem / TX- Interrupt


von Tho W. (tommyprog)


Angehängte Dateien:

Lesenswert?

Grüß euch,

hab nen ATmega32 ca. 14Mhz mit nen externen quartz, (verbunden mit einen
MAX232 ÄHNLICHEN bauteil) und nen Atmel Studio 6.

Darüber habe ich eine USART- Verbindung mit RS232 von Seriell auf USB
aufgebaut, die wunderbar funktioniert. Als Terminal benutze ich das
empfohlene HTerm über windows.

Das empfangen von Daten klappt scheinbar irgendwie nicht, da ich nicht
ganz weiß, zu welchen Zeitpunkt ich den TXCIE-VECTbenutzen muss, oder
wofür der da ist.
Der RXCIE_vect ist ja dafür da, dass, wenn ein Zeichen erfolgreich
empfangen worden ist, der Interrupt ausgelöst wird.
Somit habe ich immer dieses Zeichen in einen Speicher gepackt^^.

Neben diesem habe ich mich an eine vorgabe gehalten, in der ich auch
eine Prüfsumme berechnen muss.

Das system soll so funktionieren:

PC ----schickt vier chars, davon das dritte die prüfsumme --> µC

µC ---- schickt befehl, wobei die Prüfsumme über alle anderen Bits
verodert sind (haut auch hin)--> PC

D.h. nur wenn der PC frägt, dann antwortet der µC, SONST NICHT.

Nun, per interrupt gesteuert haut das ganze nicht so hin, es werden
fremde zeichen eingefügt, wenn ich nur etwas senden will.

Mir fehlt scheinbar wissen über die Interrupts, wie in
http://www.roboternetz.de/community/threads/27556-...
beschrieben.
Ich weiß nicht, an welchen Stellen ich diese einfügen muss,  weil nach
dem Senden muss er in den Empfangsmodus schalten, aber es ist eine
Vollduplex leitung, da ich für Tx als auch Rx jeweils EINE Leitung
habe.

Der *teil*Code ist im Anhang.
Ich glaube, dass in den TXCIE interrupt ein Fehler ist, und der da nicht
hingehört, aber ich weiß auch nicht, wo ich es sonst hinsetzen soll.

von spess53 (Gast)


Lesenswert?

Hi

>Das empfangen von Daten klappt scheinbar irgendwie nicht, da ich nicht
>ganz weiß, zu welchen Zeitpunkt ich den TXCIE-VECTbenutzen muss, oder
>wofür der da ist.

Ein Interrupt wird ausgelöst, wenn eine bestimmte Bedingung erfüllt ist.

Beim TXC-Interrupt ist das, wenn ein Zeichen vollständig gesendet wurde 
und in UDR kein Zeichen mehr vorhanden ist.

Wenn du du nur etwas senden willst reicht der UDRE-Interrupt. Der wird 
ausgelöst, wenn ein Zeichen von UDR in das Schieberegister übernommen 
wurde und ein neues Zeichen nach UDR geschrieben werden kann.

Senden (und auch Empfangen) kann man mit der USART auch komplett ohne 
Interrupts.

MfG Spess

von Tho W. (tommyprog)


Lesenswert?

Danke dir Spess,

hab bei mir u.a. AUCH das TXCIE Bit gelöscht, und nun (nach einigen 
stunden) hauts hin.

Ah okay, d.h. den UDRE interrupt benutze ich dann immer, wenn ein 
Zeichen erfolgreich übertragen worden ist, und ich noch zeichen zum 
senden habe.

Wenn ich keine zeichen mehr habe, die zum senden da sind, so benutze ich 
dann TXCI.

Mfg,
tommyProg

von spess53 (Gast)


Lesenswert?

Hi

>Ah okay, d.h. den UDRE interrupt benutze ich dann immer, wenn ein
>Zeichen erfolgreich übertragen worden ist, und ich noch zeichen zum
>senden habe.

Was verstehst du hier unter 'übertragen'? Übertragen von UDR ins 
Schieberegister oder übertragen aus dem Schieberegister heraus?

MfG Spess

von Bernd K. (prof7bit)


Lesenswert?

Tho Wes schrieb:
> Das empfangen von Daten klappt scheinbar irgendwie nicht, da ich nicht
> ganz weiß, zu welchen Zeitpunkt ich den TXCIE-VECTbenutzen muss, oder
> wofür der da ist.

Der wird aufgerufen wenn ein Byte gesendet wurde und Du nun das nächste 
senden kannst. Du startest den Vorgang indem Du das erste Byte nach UDR 
schreibst (und die restlichen in ein globales array).

Danach kann sich Deine main() sofort wieder anderen Beschäftigungen 
zuwenden während dein Telegramm sich quasi Zeichen für Zeichen im 
Hintergrund selbst versendet.

Wenn das soeben geschriebene Byte gesendet wurde löst der interrupt aus, 
in der ISR schaust Du nach ob noch weitere Zeichen zu senden sind 
(brauchst noch globale Variablen für den index und die Länge), schreibst 
das nächste Byte aus dem array nach UDR, erhöhst den Index, 
dekrementiertst die Länge und fertig. Der Interrupt wird nach jedem Byte 
auslösen, solange bis die Länge null ist und er nichts mehr ins UDR zu 
schreiben hat, danach kommt nichts mehr.

von Tho W. (tommyprog)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Ah okay, d.h. den UDRE interrupt benutze ich dann immer, wenn ein
>>Zeichen erfolgreich übertragen worden ist, und ich noch zeichen zum
>>senden habe.
>
> Was verstehst du hier unter 'übertragen'? Übertragen von UDR ins
> Schieberegister oder übertragen aus dem Schieberegister heraus?
>
> MfG Spess

UDR in das Schieberegister.

Und Daten über das Schieberegister hinaus zu übertragen benutze ich dann 
TXC.

Mfg,
tommyProg
 (entschuldige für die späte antwort)

von Tho W. (tommyprog)


Lesenswert?

Danke, bernd.

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.