Forum: Mikrocontroller und Digitale Elektronik empfangene Daten von RS232 auswerten


von marcel (Gast)


Lesenswert?

hallo erstmal!
also ich möchte vom pc aus von der rs232 schnittstelle daten an meinem 
microcontroller schicken( pic16F627)

ich möchte dem µController z.b. eine "1" oder "2" senden und dann soll 
der µcontroller z.b. bei "1" einen ausgang auf 5V schalten und das 
solange bis ein
2ter befehl wie "2" kommt und den ausgang wieder auf 0V zurückzusetzen!

falls jemand eine idee hat wäre ich sehr dankbar!

hab auch ein script im internet gefunden kann ich das für diese 
anwendung verwenden??
;**************************************************************
;*
;* Pinbelegung
;*  ----------------------------------
;*  PORTA:   0
;*      1
;*      2
;*      3
;*      4
;*  PORTB:   0 LED
;*      1 LED
;*      2 LED
;*      3 LED
;*      4 LED
;*      5 LED
;*      6 LED
;*      7 LED
;*  PORTC:   0
;*      1
;*      2
;*      3
;*      4
;*      5
;*      6 RS-232-Ausgang zum Treiber
;*      7 RS-232-Eingang vom Treiber
;*
;**************************************************************
;
; sprut (zero) Bredendiek 06/2001
;
; RS-232-ECHO:
;
; 16F876 empfängt RS232 Code
; der empfangene Ccode wird am PORTB ausgegeben
; danach wird der code um 1 erhöht und mit RS232 zurückgesendet
;
; Prozessortakt:  20 MHz
; RS232-Baudrate: 19 200 Baud
;
;**************************************************************
; Includedatei für den 16F84 einbinden

    list      p=16f876
    #include <P16f876.INC>

    ERRORLEVEL      -302    ;SUPPRESS BANK SELECTION MESSAGES

;**********************************************************
; Variablennamen vergeben

w_temp        equ   0x20
status_temp   equ   0x21
Zeichen       equ   0x22
DatenSindDa   equ   0x24

    org 0
    goto     init

;**********************************************************
; Interruptroutine für RS232-Empfang

    org      4             ; Interrupt beginnt immer bei Adresse 4
int
    movwf    w_temp        ; status retten
    swapf    STATUS,w
    movwf    status_temp

;RS232-Empfänger-Interrupt?
    btfss    PIR1,RCIF
    goto     intEnde       ; Interrupt kam von wo anders

    movfw    RCREG         ; RS232-Register auslesen
    movwf    Zeichen       ; und in den Speicher nach 'Zeichen' 
schreiben
    movwf    PORTB         ; Zeichen am PortB anzeigen
    bsf      DatenSindDa,0 ; Kennzeichen für gültige Daten setzen
    bcf      PIR1,RCIF     ; interrupt-Flag löschen

intEnde                    ; geretteten Status wieder zurückschreiben
    swapf    status_temp,w
    movwf    STATUS
    swapf    w_temp,f
    swapf    w_temp,w
    retfie

;**********************************************************
; Anfangsinitialisierung

init
    clrf     DatenSindDa

    bsf      STATUS, RP0   ; auf Bank 1 umschalten
    movlw    B'00000000'   ; PortB alle output
    movwf    TRISB
    bcf      STATUS, RP0   ; auf Bank 0 zurückschalten
    clrf     PORTB         ; alle LEDs ausschalten

; USART initialisieren
    BSF      STATUS,RP0    ; Bank1
    MOVLW    0x20          ; Sender: RS232
    MOVWF    TXSTA         ;
    BCF      STATUS,RP0    ; Bank 0
    MOVLW    0x90          ; Empfänger: RS232
    MOVWF    RCSTA         ;

; USART Baudrate einstellen
    BSF      STATUS,RP0    ; Bank1
    MOVLW    D'15'         ; Set Baud rate 19,2 kBPS bei 20 MHz
    MOVWF    SPBRG
    BCF      TXSTA, BRGH   ; BRGH=0
    BCF      STATUS,RP0    ; Bank 0

;Interrupts vorbereiten
    BSF      STATUS,RP0    ; Bank1
    BSF      PIE1,RCIE     ; Enable receive interrupts
    BCF      STATUS,RP0    ; Bank 0
    clrf     PIR1          ; alle Interruptflags löschen
    clrf     PIR2
    BSF      INTCON,GIE    ; generell Interrupts erlauben
    BSF      INTCON,PEIE   ; Interrupts von Peripheriegeräten erlauben

;**********************************************************
; Hauptprogrammschleife

Main
    btfss    DatenSindDa, 0 ; wurde was empfangen?
    goto     Main           ; nein

RS232out
    btfss    PIR1,TXIF     ; ist Sender leer ?
    goto     RS232out      ; nein, noch nicht leer
    incf     Zeichen,w     ; um 1 erhöht nach w
    movwf    TXREG         ; und in den RS232-Sender schreiben
    clrf     DatenSindDa
    goto     Main

    end

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Natürlich kannst du das verwenden. Dafür sind doch die Lernbeispiele bei 
sprut (zumindest solange es nur privat und nicht komerziell ist).

Du solltest dir allerdings das Programm erst mal verinnerlichen und es 
verstehen. Wenn du jeden Schritt verstanden hast, dann kannst du an den 
richtigen Stellen das Programm so umschreiben, dass es genau das macht 
was du willst.

Du musst natürlich das Programm an deine Haedware anpassen. z.Bsp. ist 
der Takt des UART von deinem Quarztakt abhängig. Der sprut benutzt einen 
20MHz Quarz und hat 19,2 baud eingestellt. Wenn das bei dir auch so ist, 
musst du nichts verändern. Wenn du aber einen anderen Quarz benutzt oder 
eine andere Übertragungsrate benötigst dann musst du dies im SPBRG 
Register entsprechend einstellen. Wie sich der Wert berechnet steht im 
Datenblatt.

Wenn das funktioniert brauchst du nur nach dem Empfangen eines Bytes 
dieses mit deinem Befehlesbyte zu vergleichen (bedenke ASCII-Code!) und 
sofern es übereinstimmt schaltest du deine LED ein aoder aus. Ist 
eigentlich recht einfach, wenn man es einmal verstanden hat.

Gruß
Sven

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
Noch kein Account? Hier anmelden.