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