Das Pollin Evaluations – Board ist mit einer seriellen RS232 Schnittstelle ausgestattet, was einen einfachen zum Datenaustausch mit einem PC ermöglicht.
Die folgenden Ausführungen bauen auf das Beispiel ‚mit Taster T1/2 die LED1/2 ansteuern‚ auf.
Ziel ist es ein ‚Hello World‘ an die serielle Schnittstelle zu senden, sobald der Taster T1 gedrückt wurde.
Die im Assemblerprogramm anzusteuernden Ports und Pins sind aus der Grafik auf der rechten Seite ersichtlich.
Auch dieses Beispiel habe ich so ähnlich aus dem AVR Tutorial von Mikrocontroller.net entnommen und auf die Gegebenheiten des Pollin Boards angepasst.
Der hier abgebildete Assemblercode ist mit vielen Kommentaren versehen.
Quellcode des Assemblerprogramms:
; avrdude -p m8 -c stk500v2 -P /dev/ttyACM0 -U flash:w:HelloWorld_via_UART.hex
; 5.8.2013 Das Programm soll die Worte 'Hello World' via. UART ausgeben, sobald der Taster1 gedrückt wurde
; Das Programm ist zum grossen Teil aus
; http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Senden_von_Zeichen
; übernommen. Dort gibt es noch viel weitere Infos und Tipps
.NOLIST
;.INCLUDE "/home/henry/Dokumente/Mikrocontroller/AVR-Assembler/AVR_Definitionsfiles/m8def.inc"
.INCLUDE "m8def.inc"
.LIST
;
.def temp = R16
.equ F_CPU = 16000000 ; Systemtakt in Hz
.equ BAUD = 9600 ; Baudrate
.equ Taster1 = PD2
; 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
.org 0x00
rjmp main
; Hauptprogramm
main:
; 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)|(1<<UCSZ1)|(1<<UCSZ0)
out UCSRC, temp
sbi UCSRB,TXEN ; TX aktivieren
sei ; Interrupts global aktivieren Tastenabfrage:
sbic PIND, Taster1
rcall SendHelloWorld ; Wenn Taster1 auf High (gedrückt), dann rufe SendHelloWorld auf
rjmp Tastenabfrage ; Endlosschleife
SendHelloWorld:
T1entprellen:
sbic PIND, Taster1 ; loope solange der Taster1 nicht wieder losgelassen wurde
rjmp T1entprellen
ldi zl,low(my_HelloWorld*2) ; Z Pointer laden
ldi zh,high(my_HelloWorld*2)
rcall serout_string
ret
; 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
my_HelloWorld: .db "Hello World",10,0
Video, zur Demonstration
Im Video wird der serielle Port mittels eines Perl Scripts abgefragt.
Das geht natürlich auch mit Programmen wie Cutecom oder Putty.




3 Antworten auf „ATMega8 – Hello World über serielle Schnittstelle senden“
mit welchem programm hast du das gemacht
Hallo Felix,
ich nutze Ubuntu als Betriebssystem.
Geschrieben habe ich meine Assemblerprogramme mit Geany, Assembliert mit AVRA und auf den Mikrocontroller geladen mit Avrdude. (alles in der Ubuntu Distribution)
Unter Windows, kann man alles zusammen mit dem kostenlosen AVRStudio bequem erledigen.
Die Linuxer quälen sich lieber etwas.
Dafür können wir aber unsere Hintergründe schön finster machen :-)
In der Zeile:
; Ausgabe eines Strings aus dem Flash serout_string:
soll
serout_string:
in der nächste Zeile erscheinen da es ein Label ist.
Auch in der Zeile
sei ; Interrupts global aktivieren Tastenabfrage:
soll
Tastenabfrage:
in der nächste Zeile erscheinen da es auch ein Label ist.
End