Forum: Mikrocontroller und Digitale Elektronik RX-TX-Assembler-Programm macht nicht das was es soll


von Martin Vojtek (Gast)


Angehängte Dateien:

Lesenswert?

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          ;

von Hauke Sattler (Gast)


Lesenswert?

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

von Hauke Sattler (Gast)


Lesenswert?

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

von Martin Vojtek (Gast)


Lesenswert?

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

von Martin Vojtek (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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

von Martin Vojtek (Gast)


Lesenswert?

@Rahul

Nein, ich habe geschaut: es werden 8 Datenbits initialisiert.

von Uwe (Gast)


Lesenswert?

Hi!
"ldi    akku, takt/(16*baud)-1;"
Gebe mal den gewünschten Teiler direkt ein, manche Assembler bringen
das einfach nicht.

MFG Uwe

von Martin Vojtek (Gast)


Lesenswert?

@Uwe

Das war es leider auch nicht. :-(
Der Fehler besteht weiterhin.

Trotzdem danke.

von Hauke Sattler (Gast)


Lesenswert?

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

von Martin Vojtek (Gast)


Lesenswert?

@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?

von Martin Vojtek (Gast)


Lesenswert?

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

von Hauke Sattler (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.