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