Forum: Mikrocontroller und Digitale Elektronik Problem String Ausgabe atmega8 -> UART


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Leist (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
Ich bin gerade dabei das Assembler AVR tutorial zu machen und komme 
eigentlich ziemlich gut durch bis auf die Sache mit dem UART

--> http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART

Ich benutze den Atmega8 in Verbindung mit dem Pollin evalBoard 2.0.1
Programme:

Atmel Studio 6
PonyProg2000
Putty

Den Code habe ich soweit direkt aus dem Tutorial übernommen,
beim öffnen des Terminals mit Putty erscheint jedoch nur systematisch 
wiederholt die selbe kryptische Zeichenkette.

Einstellungen des seriellen Terminals in Putty wie im Tutorial angegeben
richtiger COM Port, 9600 baud, 8 Data bits, 1 stop bit, parity none
 (es gibt noch eine Option flow control wahlweise (none, xon/xoff, 
rts/cts, dsr/dtr) bin mir nicht sicher welches die richtige ist, aber 
funktioniert mit keiner der 4 Möglichkeiten.
Ich benutze ein normales Modemkabel was als Fehlerquelle auch 
ausscheidet.

Da es sich um einen neuen Atmega8 handelt und ist dieser ja von Werke 
aus auf den internen 1MHz Takt eingestellt, weswegen ich in dem 
TutorialCode
die  F_CPU dementsprechend auf 1 000 000 geändert habe --> selber 
Fehler.

Da aber der Uart nicht unbedingt mit dem internen Takt betrieben werden 
sollte habe ich das im evalBoard verbaute 16 MHz Quarz in Betrieb 
genommen, in dem ich per PonyProg die Fusebits CKSEL0 - CKSEL3 gesetzt 
habe, wie im Datenblatt angegeben. Und natürlich den Code auf F_CPU 16 
000 000 geändert, immernoch das selbe Problem, nur die Zeichen haben 
sich etwas geändert.

Hat jemand einen Tipp woran das liegen könnte bzw einen Tipp der mich in 
die richtige Richtung führt?

Vielen Dank schonmal =)

von chris (Gast)


Bewertung
0 lesenswert
nicht lesenswert
jep immer noch falscher Takt beim Atmega bzw falsche Baud.

Wenn der Takt und die Baud richtig sind dann wirst du auch den deinen 
String sehen aber zeig doch mal deinen Quellcode denn nur dein Code ist 
dein Code auch wenn er von hier kopiert wurde.

von Leist (Gast)


Bewertung
0 lesenswert
nicht lesenswert
OK danke, hier der Code, eigentlich 1 zu 1 wie im Tutorial bist auf die 
geänderte F_CPU.
.include "m8def.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 = 16000000                            ; Systemtakt in Hz
.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
 
; hier geht unser Programm los
 
    ; 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
 
    ; Frame-Format: 8 Bit
 
    ldi     temp, (1<<URSEL)|(3<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCSRB,TXEN                      ; TX aktivieren
 
loop:
    ldi     zl,low(my_string*2);            ; Z Pointer laden
    ldi     zh,high(my_string*2);
    rcall   serout_string
    rjmp    loop
 
; Ausgabe eines Strings aus dem Flash
 
serout_string:
    lpm                             ; nächstes Byte aus dem Flash laden
    and     r0,r0                   ; = Null? 
    breq    serout_string_ende      ; wenn ja, -> Ende
serout_string_wait:
    sbis    UCSRA,UDRE              ; Warten bis UDR für das nächste
                                    ; Byte bereit ist
    rjmp    serout_string_wait
    out     UDR, r0
    adiw    zl:zh,1                 ; Zeiger erhöhen
    rjmp    serout_string           ; nächstes Zeichen bearbeiten
serout_string_ende:
    ret                             ; zurück zum Hauptprogramm
 
; Hier wird jetzt der String definiert und im Flash gespeichert
 
my_string:  .db "Test!",10,13,0

Ich hoffe ich habe da nichts blödes übersehen ^^

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du hast nicht zufällig die CLKDIV8-Fuse gesetzt?

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>Du hast nicht zufällig die CLKDIV8-Fuse gesetzt?

Gibt es beim ATMega8 nicht.

MfG Spess

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Gibt es beim ATMega8 nicht

Auch gerade bemerkt und rot geworden ...

von chris (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wie viele Zeichen werden dir denn in kryptischer form angezeigt?
 5?

Ponyprog hat glaube ich inverse Bitlogik bei den Fuses, bin aber nicht 
ganz sicher denn schon lange nicht mehr beuntzt.

von Leist (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hmh ok vllt helfen die Clock Fusebits ( aus Ponyprog ) weiter:

CKOPT = 0
SUT1 = 1
SUT0 = 0
CKSEL0-3 = 1

(dass bei Ponyprog gesetzer Haken = 0 ist hab ich beachtet)
Laut der Tabelle auf dem atmega8 Datenblatt (S 27
Table 4. Crystal Oscilaator Operating Modes

Ckopt 0 // CKSEL3...1 111 // Frequency Range 1.0 <=

so muss das ja eigentlich passen.

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das habe ich dort
Beitrag "Externer 16Mhz Quart am ATmega8 ?"
gefunden - soll mit 16 MHz (mit Ponyprog) funktionieren:

o: nicht angekreuzt = 1 = unprogrammed
x: angekreuzt = 0 = programmed

BootLock / Lock:      alle o

RSTDISBL: o
WDTON: o
SPIEN: x (kann nicht geändert werden)
CKOPT: x (Default war o)
EESAVE: o
BOOTSZ1: x
BOOTSZ0: x
BOOTRST: o

BODLEVEL: o
BODEN: o
SUT1: o
SUT0: o (Default war x)
CKSEL3: o (Default war x)
CKSEL2: o (Default war x)
CKSEL1: o (Default war x)
CKSEL0: o

von Leist (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Habs so übernommen,
musste nur die SUT0 ändern aber macht leider keinen Unterschied.
Wie zuvor ca 20 kryptische Zeichen die sich ständig wiederholen.

von Christopher B. (chrimbo) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich kenne das Pollin Board nicht, aber du hast schon einen Pegelwandler 
dazwischen oder?
MfG

von chris (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hast du denn mal nur ein Zeichen gesendet z.B. "A" ?

ersetze mal bitte

adiw    zl:zh,1                 ; Zeiger erhöhen

durch (laut InstructionSet)

adiw    zh:zl,1                 ; Zeiger erhöhen

Board hat nen Pegelwandler
http://www.pollin.de/shop/downloads/D810038B.PDF

von Leist (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ok, ich hatte noch nen 2ten atmega8 rumliegen, habs mit dem probiert und 
es hat auf Anhieb geklappt...
Oh mann... ärgerlich aber vielen Dank für die schnelle Hilfe!
woran es genau lag kann ich nicht sagen aber den MC hab ich mal 
zertrümmert, damit der mir nicht nochmal son Stress macht =)

Spaßeshalber hab ich mal den adiw Befehl wie oben beschrieben geändert, 
scheint keine Auswirkungen zu haben

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.