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
Also dein Programm scheint soweit richtig zu sein. Allerdings wird dein RB1 nie High sein, da dein Zähler bei IMPULSAUS zurückgesetzt wird. Der Zähler wird also nie bis 9 kommen und somit auch nicht den Portpin einschalten. Das CLRF ZAEHLER muss also in die PULSAN Routine, dann sollte es so gehen. Ansonsten noch ein paar Tips: MOVF ZAEHLER,0 kann man auch als MOVF ZAEHLER,F (bzw. MOVF ZAEHLER,W schreiben, wenn das Ziel W sein soll). Also statt der 0 ein F und statt der 1 ein W schreiben. Ist übersichtlicher und geht bei allen Befehlen mit dieser Syntax. Der Stack deines PIC hat nur eine Tiefe von 8. Durch die beiden Call und den Interupt benutzt du schon 3! Das kann Absicht sein, fiel mir aber auf, da das Programm ja nur sehr kurz ist. Also den Stack immer im Auge behalten! Im list-Befehl (Zeile 1) steht der 16f627 im include aber der 628. Das sollte gleich sein. Ansonsten sieht das doch schon ganz gut aus. Ist es dein 1. Programm? 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.