Forum: Mikrocontroller und Digitale Elektronik Problem mit PIC 16f627 Frequenzteiler


von Paul B. (power-paul)


Lesenswert?

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

von Sven S. (stepp64) Benutzerseite


Lesenswert?

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