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