Kategorien
ATMega8

ATMega8 – LED’s des Pollin Evaluationboards über die serielle Schnittstelle steuern

Pollin_Board_kleinRS232_VS
Das Prinzip der seriellen Schnittstelle (RS232), wie Sie früher an nahezu jedem PC zu finden war ist nach wie vor aktuell.
Für den PC sind RS232 zu USB Adapter verfügbar und auf der Mikrocontroller – Seite lässt sich z.B. ein Bluetooth zu Serial Adapter einsetzen, womit ganz auf die Kabel verzichtet werden kann und die Kommunikation auch jedes Smartphone übernehmen kann.

In diesem Beispiel soll ein Byte vom PC an das Evaluationboard gesendet werden.
Sobald Dieses über UART empfangen wird, beginnt die Prüfung des übertragenen Bytes.
Ist der Wert = 1, soll die LED1 eingeschaltet werden, bei 2 soll die LED1 ausgeschaltet werden.
Bei 3 soll die LED2 eingeschaltet werden und bei 4 soll die LED2 ausgeschaltet werden.
Werden andere Inhalte empfangen, sollen keine Aktionen ausgelöst werden.
Um Bytes über die serielle Schnittstelle zu übertragen, gibt es mehrere Möglichkeiten.
Unter Linux nutze ich Cutecom, unter Windows geht Putty.
Es gibt aber auch noch viele andere Programme. Auch ein entsprechendes Script ist für diesen Zweck schnell geschrieben.

PollinBoard_ATMega8_LEDS_per_UART_steuern_Ablaufplan_VSWie im Ablaufplan Links zu erkennen, ist dieses Beispiel ein wenig komplexer als die vorherigen beiden Posts zum Evaluationsboard (LED 1 und 2 über Taster T1 und T2 schalten und Hello World über serielle Schnittstelle senden).
Dennoch lässt sich der Code sehr gut in Assembler abbilden.
Kein Grund hier C einsetzen zu müssen oder gar ein Embedded Linux System o.ä.

Der hier abgebildete Assemblercode ist mit vielen Kommentaren versehen.

Quellcode des Assemblerprogramms:

; avrdude -p m8 -c stk500v2 -P /dev/ttyACM0 -U flash:w:LEDs_via_UART_schalten.hex
; 31.8.2013 Das Programm soll über UART empfangene Bytes auswerten und wenn ein Zahlenwert 
; zwischen 1 und 4 empfangen wurde die LED1/2 folgendermßen schalten
; 1 - LED1 an
; 2 - LED1 aus
; 3 - LED2 an
; 4 - LED2 aus
; Der UART Receive Teil des Programms ist in Teilen aus 
; http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Empfangen_von_Zeichen_per_Interrupt
; ü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                               ; Register 16 der Variable temp zuweisen 
.def RXByte = R17                               ; Register 17 der Variable RXByte zuweisen
 
.equ F_CPU = 16000000                           ; Systemtakt in Hz
.equ BAUD  = 9600                               ; Baudrate
 
.equ LED1       = PD5                           ; Pin LED1
.equ LED2       = PD6                           ; Pin LED2
 
 
; 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
 
; Startvektoren 
.org 0x00
    rjmp main
.org URXCaddr                                   ; Interruptvektor für UART-Empfang
    rjmp IncommingByte
 
; --------------------------------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
 
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCSRB, RXCIE                    ; Interrupt bei Empfang
    sbi     UCSRB, RXEN                     ; RX (Empfang) aktivieren
 
    ; Port D, LED Pins auf Ausgang und Taster Pins auf Eingang schalten
    ldi     temp, (1<<LED1) | (1<<LED2)                         
    out     DDRD, temp                      ; LED1/2 Pollin Evaluationsboard ,, PD5/6 auf Ausgang schalten  
 
    sei                                     ; Interrupts global aktivieren    
 
loop:
    rjmp    loop                            ; Endlosschleife / idle mode
 
; ---------------------------ENDE Hauptprogramm--------------------------------------
 
; ---------------------------IncommingByte-------------------------------------------
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART empfangen wurde
IncommingByte:
    in      RXByte, UDR                     ; empfangenes Byte lesen,
                                            ; dadurch wird auch der Interrupt gelöscht
; Abfrage des Byte Inhaltes und aufruf der entsprechenden Unterprogramme zum schalten der LED's
    cpi     RXByte, 1
    breq    Byte1                           ; Wenn eine 1 übertragen wurde zu Byte1 springen 
    cpi     RXByte, 2
    breq    Byte2                           ; Wenn eine 2 übertragen wurde zu Byte2 springen 
    cpi     RXByte, 3
    breq    Byte3                           ; Wenn eine 3 übertragen wurde zu Byte3 springen 
    cpi     RXByte, 4
    breq    Byte4                           ; Wenn eine 4 übertragen wurde zu Byte4 springen 
    rjmp    EndIncommingByte                ; zum Unterprogramm - Ende (Es wurde kein Wert zwischen 1 und 4 übertragen.)
 
Byte1:
    rcall   LED1Ein                         ; LED1Ein aufrufen
    rjmp    EndIncommingByte                ; zum Unterprogramm - Ende
Byte2:
    rcall   LED1Aus                         ; LED1Aus aufrufen
    rjmp    EndIncommingByte                ; zum Unterprogramm - Ende
Byte3:
    rcall   LED2Ein                         ; LED2Ein aufrufen
    rjmp    EndIncommingByte                ; zum Unterprogramm - Ende
Byte4:
    rcall   LED2Aus                         ; LED2Aus aufrufen
    rjmp    EndIncommingByte                ; zum Unterprogramm - Ende
 
EndIncommingByte:
    reti                                    ; Interrupt beenden
; ----------------------Ende-IncommingByte-------------------------------------------
; ----------------------Die 4 Unterprogramme zum LED's schalten----------------------
LED1Ein:
    sbi     PORTD, LED1                     ; Setze das LED1 Bit in PORTD
    ret
 
LED1Aus:
    cbi     PORTD, LED1                     ; Lösche das LED1 Bit in PORTD
    ret
 
LED2Ein:
    sbi     PORTD, LED2                     ; Setze das LED2 Bit in PORTD
    ret
 
LED2Aus:
    cbi     PORTD, LED2                     ; Lösche das LED2 Bit in PORTD
    ret
; -----------------Ende-Die 4 Unterprogramme zum LED's schalten----------------------

 

Video, zur Demonstration

 

Von Henry Koch

take a look at: http://www.henrykoch.de/privat.html

Eine Antwort auf „ATMega8 – LED’s des Pollin Evaluationboards über die serielle Schnittstelle steuern“

Guten Tag,

ich habe mir gerade eben mit viel Interesse Ihren Beitrag zur RS232 Schnittstelle mit dem Atmega angesehen. Ich habe auch das Pollin Board. Mich würde interessieren ob man über die RS232 vom Pollin Board auch direkt eine Relaiskarte mit ebenfalls einer Com Schnittstelle ansteuern kann. Also sozusagen, dass ich für die Benutzung der Relaiskarte keinen extra Rechner zur Steuerung benötige, sondern nur das Pollin-Board mit z.B. einem Atmega 8. Können Sie mir hierbei weiter helfen?

danke

H.Mühle

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.