Forum: Mikrocontroller und Digitale Elektronik UART - Beispiel aus dem Tutorial will einfach nicht laufen :-(


von Rudolf M. (rudolf_58)


Lesenswert?

Hallo, ja ich bin ein Anfänger und habe mich bereits hier in den Foren 
umgeschaut.
Beschreibung: STK 500 und Windows Rechner 7(64) verbunden über USB / 232
Adapter. Hab ich, wie hier im Forum beschrieben getestet und paßt.
Auch die Programmierung funktioniert. Hardwareseitig ist da noch ein 
Baudratenquartz mit 1,8432 MHz, Jumper sind gesetzt und an XTAL 1 kommen 
die 1,843 MHz auch an. Weiters habe ich das STK500 mit einem ATtiny2313 
bestückt.
Die Fusebits sind auf extern Osc mit 0.9 bis 3 MHZ 14CK 65ms. DIV/8 ist 
nicht aktiv, ansonsten ist nur bei HIGH.SPIEN der Haken gesetzt.
Den Code hab ich an den 2313 angepasst und da komm ich einfach nicht 
weiter.
Was festzustellen ist, dass beim Ein / Ausschalten des Boards ein 
Zeichen (meistens das gleiche) am Terminal ausgegeben wird. 
Möglicherweise ist das für Fachleute ein Hinweis.

Frage1: Wenn ich im Simulator den Code durchgehe dann werden in manchen 
Registern die Werte nicht angezeigt z.B. in UDR, - Was könnte die 
Ursache sein ?
Frage2: Beim Durchlauf des Programms werden die Zeichen nacheinander 
nach UDR geschoben. Allerdings funktioniert das immer nur bis zum 3. 
Zeichen, danach wird UDRE nicht mehr hochgesetzt, entsprechend läuft das 
Programm in der Endlosschleife und wartet auf UDRE - Gibt es dafür eine 
Erklärung ?
Frage3: Wo kann ich nachsehen ob z.B. der 2313 nicht nur im 
Simulationsmodus sondern auch auf der Hardwareseite im Debugmodus läuft 
?

Bin natürlich für alle Hinweise dankbar und hoffe dass ich soweit die 
Umgegung und möglich Fehlerquellen bereits ausreichend beschrieben habe.
Vielen Dank !

von Falk B. (falk)


Lesenswert?


von c-hater (Gast)


Lesenswert?

Rudolf M. schrieb:

> Was festzustellen ist, dass beim Ein / Ausschalten des Boards ein
> Zeichen (meistens das gleiche) am Terminal ausgegeben wird.
> Möglicherweise ist das für Fachleute ein Hinweis.

Ein Hinweis darauf, dass die Hardware zumindest leicht suboptimal ist. 
Aber die normale Funktion der UART-Schnittstelle wird durch diesen 
"Einschalteffekt" nicht gestört. Nur die Software muss natürlich damit 
klarkommen, dass der Gegenüber auch mal Müll produzieren kann. Das löst 
man über die Verwendung geeigneter Protokolle.

> Frage1: Wenn ich im Simulator den Code durchgehe dann werden in manchen
> Registern die Werte nicht angezeigt z.B. in UDR, - Was könnte die
> Ursache sein ?

Der Simulator ist weit davon weg, perfekt zu sein. Insbesondere auch UDR 
ist schlecht auf der Oberfläche abgebildet, denn diese Abbildung trägt 
in keinster Weise der Tatsache Rechnung, dass UDR eigentlich vier 
Register sind, von denen immerhin zwei unter dem Namen UDR wirklich 
ansprechbar sind, allerdings eins halt nur schreibend und eins nur 
lesend.

> Frage2: Beim Durchlauf des Programms werden die Zeichen nacheinander
> nach UDR geschoben. Allerdings funktioniert das immer nur bis zum 3.
> Zeichen, danach wird UDRE nicht mehr hochgesetzt, entsprechend läuft das
> Programm in der Endlosschleife und wartet auf UDRE - Gibt es dafür eine
> Erklärung ?

Ja: Dein Programm macht Mist. Es schreibt häufiger auf UDR, als es 
dürfte. Sprich: es schreibt auch zu Zeitpunkten, wenn UDRE nicht 
gesetzt ist. Genau solche fehlerhaften Programme erzeugen dieses (nur 
scheinbare!) Fehlerbild. Wenn man richtig debuggen kann, kann man 
übrigens auch sichtbar machen, was da tatsächlich passiert...

> Frage3: Wo kann ich nachsehen ob z.B. der 2313 nicht nur im
> Simulationsmodus sondern auch auf der Hardwareseite im Debugmodus
> läuft.

Nirgendwo. Es gibt nämlich überhaupt keinen "Debugmodus" beim AVR8. Oder 
hast du in irgendeinem Datenblatt einen solchen auch nur erwähnt 
gefunden? Tja, das liegt, wie gesagt, daran, dass es keinen gibt. 
Entweder läuft das Teil oder es steht. Dazwischen gibt's nix.

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Hi @Rudolf,
kannst Du den verwendeten Code posten? Wenn es möglich ist, in *.asm.
Dann kann ich 'mal schauen.
(Die Reihe von "gängigen" Fehlerquellen hat @Falk ja schon gelinkt.)

Bei mir war es tatsächlich ein falscher Beispiel-Code-Schnipsel in der
ATMEL Doku. beim Portieren vom ATiny 2313 auf ATmega32U2. Also habe hier 
ein UART-Proggi für den 2313 vorliegen. Könnte dann direkt vergleichen.

Vorab bitte schon selber einmal prüfen, wie der UART tatsächlich 
initialisiert wird. Welches Include-File (def.inc) wurde tatsächlich 
verwendet? ("tn2313def.inc" oder "2313def.inc")
Manchmal ändern sich die Bezeichnungen für die Register.

Beispiel:

.equ  USR  = UCSRA  ; For compatibility
.equ  UCR  = UCSRB  ; For compatibility

ok.

ciao
gustav

P.S.: Port D hat ein Bit weniger, also PD0 bis PD6 nicht PD7.
Wenn die Pullups auch für RXD-Eingang gesetzt werden sollen,
macht er es mit 0x7F und nicht mit 0xFE wie im Code oben angegeben.
OK?

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Hallo,

wenn man einen Quarz verwendet, dann sollte man nicht "extern Osc." 
einstellen, das ist eine andere Baugruppe.

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Karl M. schrieb:
> Hallo,
>
> wenn man einen Quarz verwendet, dann sollte man nicht "extern Osc."
> einstellen, das ist eine andere Baugruppe.

Hi,
hab auch testweise ein 4,096 MHz "Baudraten"-Quarz drin.
Aber Fuses auf Ext. Oszi.

Bist Du Dir mit deiner Einschätzung oben sicher?

ciao
gustav

P.S.: Ähh, da ist noch das FE drin soll doch 7F heissen.

: Bearbeitet durch User
von Sebastian S. (amateur)


Lesenswert?

Wenn das UART-Beispiel nicht läuft, geh' doch mal zurück zum Standard 
Hello World-Programm.
Da blinkt zwar nur eine LED, aber so kannst Du den ganzen Rest 
(Compilerinstallation, Verbindung zum STK, Brenner) erst mal überprüfen.
Erst wenn "super simpel" läuft, kannst Du was Weitergehendes überprüfen.

von soundso (Gast)


Lesenswert?

es gibt einen grossen unterschied ob xtal oder osc am AVR hängen.

wenn du die einstellung ext. osc nimmst, sollte die pufferstuffe im avr 
ausgeschaltet sein und die takterzeugung mit einem quarz funktioniert 
nicht! evtl. geht der avr dann zurück auf den internen takt, das weiss 
ich aber nicht.

wenn du einen quarz verwendest stell sicher, dass der interne puffer des 
avr's auch aktiviert und der oszillator eingeschwungen ist. kann in den 
fuses mittels einschwingzeit eingestellt werden.

gruess

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

soundso schrieb:
> es gibt einen grossen unterschied ob xtal oder osc am AVR hängen.

Hi,
ok. ok.
Siehe Bild.

ciao
gustav

P.S.: Quarz hat 4.096 MHz

von Michael U. (amiga)


Lesenswert?

Hallo,

beim STK500 ist es ein externer Oszillator.
Aber: bei allen von mir gemutzten AVR (2313/8515/Mega8/16/32 usw.) geht 
die Einstellung "ext. Quarz" zuverlässig. Ich habe die AVR üblicherweise 
so gefused auch auf dem STK so benutzt, damit ich auf der externen 
Schaltung mit Quarz die Fuses schon passend hatte.

Gruß aus Berlin
Michael

von Rudolf M. (rudolf_58)


Lesenswert?

Zunächst mal vielen Dank an alle die sich die Mühe machen mir zu 
antworten.
Den Code habe ich unten angeschlossen, wie gesagt es ist das Beispiel 
aus dem Tutorial mit den Änderungen die ich wegen des Wechsels vom 
atmega8 auf den ATtiny2313 gemacht habe. Den Originalcode hab ich hinter 
ein Semikolon
gestellt um einen Vergleich zu haben. Im übrigen, hier im Forum kann man 
auch den Code formatieren wie ich sehe .... nur ich ... ein Tip zum how 
to wäre hilfreich.

Die Beiträge bezüglich externer Quarz. Ich fürchte ich war da etwas zu 
schwammig. Eingestellt habe ich Ext. Crystal Osc 0.9 - 3.0 MHz 14CK + 
65ms.
Nach dem was ich darüber gelesen habe, müßte das eigentlich passen.

Der Tip bezüglich "Hello World" ist absolut nachvollziehbar, ich hab das 
Tut von Anfang an durchgearbeitet und bis dato hat das auch 
funktioniert.

avrasm

; .include "m8def.inc";
.include "tn2313def.inc"

.def temp    = r16                              ; Register für kleinere 
Arbeiten
.def zeichen = r17                              ; in diesem Register 
wird das Zeichen an die
                                                ; Ausgabefunktion 
übergeben

;.equ F_CPU = 4000000                            ; Systemtakt in Hz
.equ F_CPU = 1843200              ; Quarzfrequenz

.equ BAUD  = 9600                               ; Baudrate

; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille

.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille 
Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit 
zu hoch!"
.endif

    ; Stackpointer initialisieren

  ;ldi     temp, HIGH(RAMEND)
  ;out     SPH, temp
    ldi     temp, LOW(RAMEND)
    out     SPL, temp

    ; Baudrate einstellen

    ldi     temp, HIGH(UBRR_VAL)
    out     UBRRH, temp
    ldi     temp, LOW(UBRR_VAL)
    out     UBRRL, temp                 ; lt. Datenblatt Seite 134 - 
"11"

    ; Frame-Format: 8 Bit

;    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
     ldi     temp, (1<<UCSZ1)|(1<<UCSZ0)   ; lt. Datenblatt Seite 132
    out     UCSRC, temp

    sbi     UCSRB,TXEN                  ; TX aktivieren

loop:
    ldi     zeichen, 'T'
    rcall   serout                      ; Unterprogramm aufrufen
    ldi     zeichen, 'e'
    rcall   serout                      ; Unterprogramm aufrufen
    ldi     zeichen, 's'
    rcall   serout                      ; ...
    ldi     zeichen, 't'
    rcall   serout
    ldi     zeichen, '!'
    rcall   serout
    ldi     zeichen, 10
    rcall   serout
    ldi     zeichen, 13
    rcall   serout
    rcall   sync
    rjmp    loop

serout:
    sbis    UCSRA,UDRE                  ; Warten bis UDR für das nächste
                                        ; Byte bereit ist
    rjmp    serout
    out     UDR, zeichen
    ret                                 ; zurück zum Hauptprogramm

; kleine Pause zum Synchronisieren des Empfängers, falls 
zwischenzeitlich
; das Kabel getrennt wurde

sync:
    ldi     r16,0
sync_1:
    ldi     r17,0
sync_loop:
    dec     r17
    brne    sync_loop
    dec     r16
    brne    sync_1
    ret

/avrasm

von Holger74 (Gast)


Lesenswert?

Ist der USB/RS232-Adpater direkt an die PortPins angeschlossen oder an 
die 9-pol. SubDBuchse?
Wenn letzeres der Fall ist, müssen die beiden TXD und RXD(RS232 SPARE) 
über den LEDs mit den jeweiligen PortPins des Prozessors verbunden 
werden.
Anderfalls ist die SubDBuchse nicht an den Prozessor angeschlossen.

von S. Landolt (Gast)


Lesenswert?

Welchen Wert hat das Fuse Low Byte? CKDIV8 muss 'unprogrammed' sein.

von Rudolf M. (rudolf_58)


Lesenswert?

VIELEN DANK !
so ist das mit den Anfängern ...
Es funktioniert ! (nur der Zeilenvorschub wird nicht durchgeführt, 
sondern ein exotisches Zeichen, aber das wird wohl selbst zu finden sein 
:-) )

Dank an alle, die sich am Thema beteiligt haben !

von Rudolf M. (rudolf_58)


Lesenswert?

Nachfrage zum Thema richtig debuggen - ist hier ein Beitrag (Tut o.ä. ) 
besonders zu empfehlen ?

von Karl B. (gustav)


Lesenswert?

Hi,
erst einmal Glückwunsch!
(Also mit der 2313def.inc geht's bei mir nicht.)
Du hast ja schon die "aktuellere" tn2313def.inc genommen.
OK. Die nimmt UCSRA etc...
Und auch Glückwunsch, dass die automatische Baudratenberechnung  so auf 
Anhieb geklappt hat. Das funktioniert manchmal eben auch nicht. In dem 
Falle müsste man eben den Wert selbst errechnen und direkt eintragen.

Nun zur Frage:
Rudolf M. schrieb:
> m übrigen, hier im Forum kann man
> auch den Code formatieren wie ich sehe .... nur ich ... ein Tip zum how
> to wäre hilfreich.

Lade das *.asm-File in einen Texteditor und speichere es unter "alle 
Dateien"  mit Endung *.asm ab. Dann lade es so hier als Attachment hoch.
Die Forensoftware erledigt alles andere von selbst.

ciao
gustav

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Rudolf M. schrieb:
> (nur der Zeilenvorschub wird nicht durchgeführt,
> sondern ein exotisches Zeichen, aber das wird wohl selbst zu finden sein
Hi,
die ASCII-Zeichen in hex sehen so aus:
ldi temp, 0x0A; Zeilenvorschub (line feed /LF)
ldi temp, 0x0D; Wagenrücklauf  (carriage return /CR ...oder "nur" ENTER)

Es hängt auch von den Terminaleinstellungen ab.
Ich benutze Teraterm.

ciao
gustav

: Bearbeitet durch User
von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Hi @Rudolf,
probier doch einmal das angehängte Proggi aus:

Es liefert mir bei Teraterm das dazugehörige Bild.

Also, es soll kein "Fließtext" entstehen, sondern definitiv an den 
Anfang der Zeile gesprungen,
dann eine Leerzeile eingefügt werden
und der Cursor sogar auf den Anfang derselben Zeile  hier Text Zeile 2 
(obwohl es ja Zeile 3 ist) springen.
Und das abhängig von den als Tabelleneinträge gesetzten Steuerzeichen.

Das Problem entsteht mit dem Padding byte mismatch, von daher braucht 
man sich nicht über "1 warning"  zu wundern.
Aber das ist ja bei Nullterminierung - eben daher die "0" am Ende der 
Tabelle noch - wohl immer so.
(Ok. ok. Das kommt später sicher noch ausführlicher.)

ciao
gustav

von Rudolf M. (rudolf_58)


Lesenswert?

Hallo @Gustav,
sorry für die späte Antwort, ich komm einfach nicht so oft dazu mich 
meinem (neuen) Hobby zu widmen. Ich werde das natürlich probieren, ich 
selber benutze derzeit HTerm und AccessPort als Terminalprogramme. Zwei 
deswegen, damit ich eventuelle Unterschiede an der "Empfangsstelle" 
orten kann.
Danke und bis bald
Rudolf

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.