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


von Leist (Gast)


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)


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)


Lesenswert?

OK danke, hier der Code, eigentlich 1 zu 1 wie im Tutorial bist auf die 
geänderte F_CPU.
1
.include "m8def.inc"
2
 
3
.def temp    = r16                              ; Register für kleinere Arbeiten
4
.def zeichen = r17                              ; in diesem Register wird das Zeichen an die
5
                                                ; Ausgabefunktion übergeben
6
 
7
.equ F_CPU = 16000000                            ; Systemtakt in Hz
8
.equ BAUD  = 9600                               ; Baudrate
9
 
10
; Berechnungen
11
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
12
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
13
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
14
 
15
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
16
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
17
.endif
18
 
19
; hier geht unser Programm los
20
 
21
    ; Stackpointer initialisieren
22
 
23
    ldi     temp, HIGH(RAMEND)
24
    out     SPH, temp
25
    ldi     temp, LOW(RAMEND)
26
    out     SPL, temp
27
 
28
    ; Baudrate einstellen
29
 
30
    ldi     temp, HIGH(UBRR_VAL)
31
    out     UBRRH, temp
32
    ldi     temp, LOW(UBRR_VAL)
33
    out     UBRRL, temp
34
 
35
    ; Frame-Format: 8 Bit
36
 
37
    ldi     temp, (1<<URSEL)|(3<<UCSZ0)
38
    out     UCSRC, temp
39
 
40
    sbi     UCSRB,TXEN                      ; TX aktivieren
41
 
42
loop:
43
    ldi     zl,low(my_string*2);            ; Z Pointer laden
44
    ldi     zh,high(my_string*2);
45
    rcall   serout_string
46
    rjmp    loop
47
 
48
; Ausgabe eines Strings aus dem Flash
49
 
50
serout_string:
51
    lpm                             ; nächstes Byte aus dem Flash laden
52
    and     r0,r0                   ; = Null? 
53
    breq    serout_string_ende      ; wenn ja, -> Ende
54
serout_string_wait:
55
    sbis    UCSRA,UDRE              ; Warten bis UDR für das nächste
56
                                    ; Byte bereit ist
57
    rjmp    serout_string_wait
58
    out     UDR, r0
59
    adiw    zl:zh,1                 ; Zeiger erhöhen
60
    rjmp    serout_string           ; nächstes Zeichen bearbeiten
61
serout_string_ende:
62
    ret                             ; zurück zum Hauptprogramm
63
 
64
; Hier wird jetzt der String definiert und im Flash gespeichert
65
 
66
my_string:  .db "Test!",10,13,0

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

von Dieter F. (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

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

Gibt es beim ATMega8 nicht.

MfG Spess

von Dieter F. (Gast)


Lesenswert?

spess53 schrieb:
> Gibt es beim ATMega8 nicht

Auch gerade bemerkt und rot geworden ...

von chris (Gast)


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)


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)


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)


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


Lesenswert?

Hallo,

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

von chris (Gast)


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)


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

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.