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 =)
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.
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 ^^
Hi
>Du hast nicht zufällig die CLKDIV8-Fuse gesetzt?
Gibt es beim ATMega8 nicht.
MfG Spess
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.
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.
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
Habs so übernommen, musste nur die SUT0 ändern aber macht leider keinen Unterschied. Wie zuvor ca 20 kryptische Zeichen die sich ständig wiederholen.
Hallo, ich kenne das Pollin Board nicht, aber du hast schon einen Pegelwandler dazwischen oder? MfG
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.