Hallo zusammen, ich grübele schon seit ein paar Tagen über unten stehendem Programm. Ich bin noch Anfänger und habe das Programm aus einem Buch abgeschrieben. Und zwar versuche ich einfach über das Hypterterminal ein Zeichen zu senden und gleich wieder zurück zu senden. Das Programm verändert aber den gesendeten Code und ich weiss nicht warum. Wenn ich z.B. $86 sende bekomme ich $06 zurück. Das Programm ist für mich interessant, weil es mit einem Interrupt arbeitet. Wäre super, wenn mir jemand einen Tip geben könnte, voran es liegt, dass ich nicht das Zeichen zurückbekomme, welches ich sende. Schonmal vielen Dank für die Hilfe. Gruß Martin .include "tn2313def.inc" ;Definitionsdatei laden .EQU baud = 9600 ; .EQU takt = 3686400 ; .DEF akku = r16 ; .CSEG ; rjmp start ; .ORG $07 ; rjmp igetch ; .ORG $10 ; start: ldi akku, low(ramend); out SPL,akku ; ldi akku,$ff ; out DDRB,akku ; rcall initi ; ldi ZL,LOW(prompt*2); ldi ZH,HIGH(prompt*2) rcall putsf sei haupt: rjmp haupt ; putsf: push r0 ; in r0, SREG ; push r0 ; push ZL ; push ZH ; putsf1: lpm ; adiw ZL,1 ; tst r0 ; breq putsf3 ; putsf2: sbis USR,UDRE ; rjmp putsf2 ; out UDR,r0 ; rjmp putsf1 ; putsf3: pop ZH ; pop ZL ; pop r0 ; out sreg,r0 ; pop r0 ; ret ; initi: push akku ; ldi akku, takt/(16*baud)-1; out UBRR,akku ; sbi UCR,RXEN ; sbi UCR,TXEN ; sbi UCR, RXCIE ; pop akku ; ret ; igetch: push akku ; in akku,UDR ; igetch1: sbis USR,UDRE ; rjmp igetch1 ; out UDR,akku ; out PORTB,akku ; pop akku ; reti ; prompt: .DB 10,13,"Ihre Eingabe bitte > ",0 ; .EXIT ;
Da Frag ich mich doch aus welchem Sadistenbuch dieser Code stammt. Die Syntax ist echt grausam. Aber ich glaube ich sehe schon warum der code nicht funktioniert. Du hast oben .include "tn2313def.inc" angeben, also nimmst du vermutlich den ATtiny2313 Weiter unten verwendest du die Register UCR USR und UBRR. Diese kamen jedoch nur im vorgänger dem AT90S2313 vor. Dieser hatte nur einen UART. Der Tiny2313 wie du ihn in der Include datei angibst hat jedoch einen USART welcher mehr funktionen anbietet als der UART. Unter Anderem auch Frame Formate mit weniger als 8 bit. Ich werde mal versuchen mich durch diesen Foltercode zu wurschteln um ihn korrekt auf den T2313 umzusetzen. cu Hauke
Ok Ersetze einfach mal deine initi: Unterroutine gegen das hier: initi: push akku ;###################################################### ; Das Baudraten Register ist jetzt ein 16 Bit Register ;###################################################### ldi akku,high(takt/(16*baud)-1) out UBRRH,akku ldi akku,low(takt/(16*baud)-1) out UBRRL,akku ;###################################################### ; UCR heißt jetzt UCSRB ;###################################################### ldi akku,(1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(0<<UCSZ2)|(0< <RXB8)|(0<<TXB8) out UCSRB,akku ;###################################################### ; UCSRC fehlte bisher ;###################################################### ldi akku,(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(0<< UCPOL) out UCSRB,akku pop akku ret Damit sollte es eigendlich funtionieren (habe grade keine t2313 da) cu Hauke P.S. Falls du noch Fragen hast und Skype oder ICQ benutzt, dann kannst du mich ja per Mail kontaktieren
Hallo Hauke, ersteinmal vielen Dank, dass du dir diese Mühe gemacht hast. Leider funktioniert dein Code nicht. Mit deinem Code macht er gar nichts. Es kommt nichts beim Tiny an. Cu Martin
P.S: ich habe einen Fehler gefunden ;###################################################### ; UCSRC fehlte bisher ;###################################################### ldi akku,(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(0<< UCPOL) out UCSRB,akku Hier muss UCSRC stehen - damit funktioniert das ganze zwar wieder, aber der Fehler ist immernoch da. Ich bin inzwischen ein kleines Stückchen weitergekommen: wenn z.B. ich $01 sende bekomme ich $81 zurück. Das passiert bei $0x bis $7x. Da werden immer $80 dazuaddiert. Wenn ich $9x bis $Fx eingebe, wird nichts dazu addiert, dann gilt gesendet = zurückgesendet. Jetzt habe ich zumindest einen kleinen Anhaltspunkt, wo ich suchen muss. :-)
Kann es sein, dass die USART auf 7 Bit initialisiert wird? Das MSB wird ja als letztes Übertragen, und wenn man nur 7 Bits überträgt, dann wird das Stoppbit (log. 1) als 8. beim Empfänger "erkannt".
@Rahul Nein, ich habe geschaut: es werden 8 Datenbits initialisiert.
Hi! "ldi akku, takt/(16*baud)-1;" Gebe mal den gewünschten Teiler direkt ein, manche Assembler bringen das einfach nicht. MFG Uwe
@Uwe Das war es leider auch nicht. :-( Der Fehler besteht weiterhin. Trotzdem danke.
Hmmmmm Welches Terminal Programm verwendest du? Evt. ist die Stopbit oder Parity einstellung nicht korrekt. cu Hauke P.S. Das mit dem UCSRB und UCSRC war nen blöder copy and paste Fehler
@Hauke ich probiere momentan mit dem HyperTerminal von Windows. Parität ist aus, 8 Datenbits ist eingestllt, Flusssteuerung aus, Stoppbits 1... gibt es irgendwo ein Testprogramm, welches einfach nur Zeichen zum PC sendet?
nochmals hallo, ich habe herausgefunden, dass wenn ich beim Hyperterminal 7 Datenbits einstelle, es dann funktioniert. Allerdings habe ich 8 Datenbits in meinem Programm eingestellt und ich bräuchte auch 8 Datenbits - kann mir jemand sagen, wo der Fehler liegt? 8 Datenbits: (0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0) Gruß Martin
Probier es mal mit Bray Terminal. http://bray.velenje.cx/avr/terminal/ Das ist erheblich besser als dieser Hyperterminal Schrott cu Hauke
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.