PIC16f876 über RS232 steuern
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  Schnittstellen (Assembler)  |  PIC16f876 über RS232 steuern « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: PIC16f876 über RS232 steuern  (Gelesen 3140 mal)
 
change18
Gast
« am: September 15, 2008, 14:05:29 »

Hallo! Ich habe ein Problem. Ich arbeite an einem Projekt in der Uni, muss mit dem Rechner über RS232 eine LED und zwei Relays einschalten und ausschalten (alles getrennt voneinnader). Hardware Teil habe ich schon erledigt, aber wie schreibt man Programme für den Mikrocontroller weiss ich nicht. Kann mir jemand mit dem Assembler-Code helfen?
Gespeichert
wberger
Full Member
***
Offline Offline

Beiträge: 204


Profil anzeigen
« Antworten #1 am: September 16, 2008, 11:59:36 »

Schau mal unter
http://www.sprut.de/

da wird die PIC programmierung sehr gut erklärt. Dort findest du auch einfache Programmierbeispiele.
Wenn es dann noch konkrete Fragen gibt, kannst du die hier stellen.

Gruß
  Wolfgang
Gespeichert
change18
Gast
« Antworten #2 am: September 16, 2008, 17:28:10 »

auf sprut.de war ich schon es ist sehr hilfreich, und ohne RS232 geht's alles prima, mit, ist schlechter, kannst du sagen welcher Befehl muss ich schicken um LED einschalten? Ich programmiere mit Python, aber ich glaube, dass es egal welche Sprache, Befehl soll trotzdem der gleiche sein. 
Gespeichert
wberger
Full Member
***
Offline Offline

Beiträge: 204


Profil anzeigen
« Antworten #3 am: September 16, 2008, 19:36:48 »

Python auf dem PIC?

Benötigst du Hilfe bei der RS232 Programmierung des PCs, oder bei der Firmware des PIC?

Gruß
  Wolfgang
Gespeichert
change18
Gast
« Antworten #4 am: September 17, 2008, 16:21:39 »

Mit Python schreibe ich Gui auf dem Rechner für gesamtes Projekt. Programm für PIC, die ich dann auf PIC brennen werde schreibe ich mit Assembler. Mit meiner Programm will ich ein Befehl an PIC schicken über RS232 und der muss LED einschalten bzw. ausschalten, und ich weiss nicht erstens welcher Befehl ich schicken soll und zweitens wie schreibe ich das Programm für PIC damit er mein Befehl auch verarbeiten kann.
Gespeichert
change18
Gast
« Antworten #5 am: September 19, 2008, 13:22:53 »

Hier ist mein Code, vom Rechner schicke z.B. 17 für einschalten das hab' ich durch 0x11 defeniert, ich weiss es ob es richtig ist, es reagiert nicht. Kann jemand Hinweis geben, wo mein Fehler liegt?
Code:
list              p=16f876
#include         <P16f876.INC>

ERRORLEVEL        -302
; Taktquelle:  4 MHz
; RS232-Baudrate: 2400 Baud
; Configuration festlegen
;
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;
; ab 4 MHz: Power on Timer, kein Watchdog, HS-Oscillator
; __CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC

;Variablennamen vergeben

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

; Konstanten festlegen
#define Ausgang1  PORTB,2     ;Ausgang LED
#define Ausgang2  PORTB,3     ;Ausgang Relay_1
#define Ausgang3  PORTB,4     ;Ausgang Relay_2

       org  0
       goto       init
       
; Interruptroutine für RS 232 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
       
       movwf      RCREG              ; RS232-Register auslesen       
       movwf      Zeichen            ; und in den Speicher nach 'Zeichen' schreiben
       movwf      PORTB
       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
       
;Anfangsinitiallisierung

init
       
       clrf       DatenSindDa
       
       
       bsf        STATUS, RP0        ; auf Bank 1 umschalten

;       movlw      B'00000000'        ; PORTB alle Digital??????
;       movwf   ANSEL

       movlw      B'00000000'        ; PORTB alle output
       movwf      TRISB
       bcf        STATUS, RP0        ; auf Bank 0 zurückschalten
       clrf       PORTB              ; alle Ausgänge ausschalten
       
;USART Init

       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'25'                ; 2400 Baud 4MHz
        MOVWF     SPBRG
        BCF       TXSTA, BRGH          ; BRGH=0
        BCF       STATUS, RP0          ; Bank 0
       
; Ineterrupts 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
        goto   RS_Daten
        goto      Main
RS_Daten
        movlw   0x10 ; Ausgang 1 = aus
        xorwf   Zeichen,0 ; mit "Zeichen" vergleichen
        btfsc   STATUS,Z ; wenn gleich dann Z-Flag = 1
        goto   Out1_off
        movlw   0x11 ; Ausgang 1 = an
        xorwf   Zeichen,0 ; mit "Zeichen" vergleichen
        btfsc   STATUS,Z ; wenn gleich dann Z-Flag = 1
        goto   Out1_on

        movlw   0x20 ; Ausgang 2 = aus
        xorwf   Zeichen,0 ; mit "Zeichen" vergleichen
        btfsc   STATUS,Z ; wenn gleich dann Z-Flag = 1
        goto   Out2_off
       
        movlw   0x21 ; Ausgang 2 = an
        xorwf   Zeichen,0 ; mit "Zeichen" vergleichen
btfsc   STATUS,Z ; wenn gleich dann Z-Flag = 1
goto   Out2_on

movlw   0x30 ; Ausgang 3 = aus
xorwf   Zeichen,0 ; mit "Zeichen" vergleichen
btfsc   STATUS,Z ; wenn gleich dann Z-Flag = 1
goto   Out3_off

movlw   0x31 ; Ausgang 3 = an
xorwf   Zeichen,0 ; mit "Zeichen" vergleichen
btfsc   STATUS,Z ; wenn gleich dann Z-Flag = 1
goto   Out3_on

goto   Main
       
; Ausgabe
Out1_off
bcf Ausgang1
goto Main

Out1_on
bsf Ausgang1
goto Main

Out2_off
bcf Ausgang2
goto Main

Out2_on
bsf Ausgang2
goto Main

Out3_off
bcf Ausgang3
goto Main

Out3_on
bsf Ausgang3
goto Main

       
        end

Edit: Bitte Code-Tags verwenden
Bernd

       
               
« Letzte Änderung: September 19, 2008, 17:20:44 von Bernd » Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #6 am: September 20, 2008, 22:28:18 »

Was mir beim ersten Lesen des Codes aufgefallen ist:

1)
Die Sicherung in Deiner ISR

Zitat
Code:
w_temp            equ    0x20

int
       movwf      w_temp             ; status retten
       swapf      STATUS,w
       movwf      status_temp

ist unzureichend und wird so auch nicht korrekt funktionieren. Im Datenblatt des PICs findest Du eine geeignete Version (Section 12). Ganz wichtig dabei: Beim Eintritt in den Interrupt kann irgend eine beliebige RAM-Bank ausgewählt sein, d.h. w_temp muß sich im "unbanked memory" (beim PIC 16F876 sind das die Adressen 0x70 bis 0x7F) befinden. Ein Zugriff auf diese Adressen erfolgt immer auf die selbe Speicherzelle, unabhängig von der gerade ausgewählten Bank.

2)
Zitat
Code:
movwf  RCREG    ; RS232-Register auslesen

Damit wird der Wert in W in das RCREG-Register geschrieben...

3)
Zitat
Code:
xorwf   Zeichen, 0

In der .inc-Datei des PICs werden symbolische Konstanten für das Ziel der Operation ("W" und "F)" definiert. Es verbessert die Lesbarkeit ungemein, wenn man sie auch verwendet.

Code:
xorwf   Zeichen, W
xorwf   Zeichen, F


Viele Grüße

Bernd
Gespeichert

change18
Gast
« Antworten #7 am: September 23, 2008, 15:21:19 »

Danke Bernd! ich versuchs nochmal mit deinen tipps!
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.044 Sekunden mit 19 Zugriffen.
 
Top! Top!