www.mikrocontroller.net

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


Autor: Martin Vojtek (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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          ;

Autor: Hauke Sattler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hauke Sattler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Vojtek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Vojtek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Martin Vojtek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul

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

Autor: Uwe (Gast)
Datum:

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

MFG Uwe

Autor: Martin Vojtek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Uwe

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

Trotzdem danke.

Autor: Hauke Sattler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Vojtek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Martin Vojtek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hauke Sattler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier es mal mit Bray Terminal.

http://bray.velenje.cx/avr/terminal/

Das ist erheblich besser als dieser Hyperterminal Schrott

cu
Hauke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.