hallo,
ich habe ein problem und hoffe mir kann jemand helfen.
ich möchte mit hilfe eines pic 16f627 einen frequenzteiler bauen. die
frequenz soll 9 mal langsamer sein. ich habe mir dazu überlegt mit einem
interrupt am pin rb0 eine zählvariable erhöhen zulassen und dann auf
ihren wert zu überprüfen. ist der zäkler auf 9 soll er wieder auf null
gesetzt werden und am pin rb1 soll jetzt ein high-level anliegen. hat
der zähler den wert 4, rb1 wieder auf low.
mein eigentliches problem liegt darin, dass ich nicht weiß, ob ich den
pic überhaupt richtig konfiguriert hab.
hier der quellcode:
list p=16f627
#include <P16f628.INC>
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON &
_WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT
;=======================================================================
===
; Variablen
;=======================================================================
===
W_COPY EQU 0x20 ; Backup für Akkuregister
S_COPY EQU 0x21 ; Backup für Statusregister
ZAEHLER EQU 0x22
; gehe zu Programmstart
ORG 0
GOTO INIT
;=======================================================================
===
; Interrupt - Routine
;=======================================================================
===
ORG 4
INTVEC
MOVWF W_COPY
SWAPF STATUS, W
BCF STATUS, RP0
MOVWF S_COPY
INT_SERV
INCF ZAEHLER
INT_END
BCF INTCON, INTF ;Interrupt-Flag löschen
SWAPF S_COPY, W ; STATUS zurück
MOVWF STATUS
SWAPF W_COPY, F ; w zurück mit flags
SWAPF W_COPY, W
RETFIE
;=======================================================================
===
; Hauptroutine
;=======================================================================
===
INIT
MOVLW B'00000111' ;Comparator aus
MOVWF CMCON ;
BSF STATUS,RP0 ;auf Bank 1 umschalten
MOVLW B'00000001'
MOVWF TRISB ;RB alle output, außer RB0
MOVLW B'11111111' ;all RA ports are inputs
MOVWF TRISA
BCF STATUS,RP0 ;auf Bank 0 umschalten
BSF STATUS, RP0 ; auf Bank 1 umschalten
BSF OPTION_REG, INTEDG ; 0-1 Flanke an RB0
BCF STATUS, RP0 ;auf Bank 0 umschalten
BSF INTCON, INTE ;RB0-Interrupt erlauben
BSF INTCON, GIE ;Interrupt generell erlauben
MAIN
CLRF ZAEHLER ;Zähler-Wert löschen
CLRF PORTB
LOOP ;schleife
CALL PRUEFEN ;überprüfen des wert von ZAEHLER
GOTO LOOP
PRUEFEN
CLRF STATUS
MOVF ZAEHLER,0
SUBLW D'4'
BTFSC STATUS,Z
CALL IMPULSAUS
CLRF STATUS
MOVF ZAEHLER,0
SUBLW D'9'
BTFSC STATUS,Z
CALL IMPULSAN
NOP
RETURN
IMPULSAN
BSF PORTB,1 ;rb1 auf high
RETURN
IMPULSAUS
BCF PORTB,1 ;rb1 auf low
CLRF ZAEHLER
RETURN
END
....der µc soll später noch andere aufgaben bekommen, deshalb zählen per
interrupt.
vielen dank schon mal an alle die sich die mühe machen mir zu helfen.
gruß paul