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.