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.
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
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
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
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.
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)
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.