ATMega8 – Hello World über serielle Schnittstelle senden


Pollin_Board_kleinDas Pollin Evaluations – Board ist mit einer seriellen RS232 Schnittstelle ausgestattet, was einen einfachen zum Datenaustausch mit einem PC ermöglicht.

RS232_VS
PollinBoard_ATMega8_HelloWorld_per_UART_Beispiel_VS
PollinBoard_ATMega8_HelloWorld_per_UART_Beispiel_Ablaufplan_VS

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.

ATMega8 – Hello World über serielle Schnittstelle senden was last modified: Februar 2nd, 2017 by Henry Koch

3 Gedanken zu „ATMega8 – Hello World über serielle Schnittstelle senden

    • 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 :-)

  1. 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.