RX-TX-Assembler-Programm macht nicht das was es soll

Gast #322410
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          ;
Angehängte Dateien:
Gast #322411
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
Gast #322412
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
Gast #322413
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
Gast #322414
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. :-)
Gast #322415
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".
Gast #322419
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
Gast #322420
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?
Gast #322421
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.