Hi For school I have to program with mplab a electronic Chronometer but the chronometer doesn't work can some please look at the code
Thanks Mich
; This program simulates a chronometer
title "Chronometer" list p=16F870, r=hex, n=0 __config 0x0C02 #include
;************************************************************ ; variables (equ statements) ;************************************************************
Tiental equ 0x25 ; =10 sec pin RA0 Eenhede equ 0x26 ; =1 sec pin RA1 Tiende equ 0x27 ; =0,1 sec pin RA2 AantalOverFlow equ 0x28 ; houdt bij hoeveel keer overflow is geweest => bij 5 een tiende bijtellen W_TEMP equ 0x29 ; temp w register STATUS_TEMP equ 0x30 ; temp status register Vlag equ 0x31 ; 0 = timeroverflow , 1 = buttonchange, 2= press reset SwitchChange equ 0x01 ; er is een switch change SwitchState equ 0x02 ; 1 bij running,0 bij stop TimerOverFlow equ 0x03 ; vlag voor timeroverflow
;************************************************************ ; reset vector ;************************************************************
ORG 0x00 goto Start ORG 0x04 goto Interrupt
;************************************************************ ;program code starts here ;************************************************************
Start bsf STATUS,RP0 ; Bank 1 selecteren clrf TRISC ; Alle pinnekes PoortC output movlw 0x03 ; eerste 2 pins input van PORTB ; RB0 is start / stop button ; RB1 is reset => om alles te reseten movwf TRISB ; waarde in TRISB plaatsen
movlw 0x06 movwf ADCON1 movlw 0x07 ; eerste 3 pins are input ; TRISA,0 tiental ; TRISA,1 eenhede ; TRISA,2 tiende movwf TRISA ; waarde in TRISA plaaten
movlw 0x47 ; option_reg juist zetten movwf OPTION_REG ; pull ups enabled, interupt op stijgende flank, TMR0 kiezen als klok, werken met stijgende flank, nog eens prescalen door delen door 256
movlw 0xB0 ; INTCON juist zetten movwf INTCON ; setting all interrupts right
bcf STATUS,RP0 ; bank 0 selecteren
movlw 0xB0 movwf INTCON ; setting all interrupts right
movlw 0x3B ; 3B movwf TMR0 ; start te tellen van 59 tot 256 en we hebben 5 timeroverflows nodig voor 100ms clrf PORTC ; clear all output latches
clrf Tiental ; tiental op nul zetten clrf Eenhede ; eenhede op nul zetten clrf Tiende ; tienden op nul zetten clrf AantalOverFlow ; Aantal overflows op nul zetten clrf Vlag ; Vlag register clearen goto Main ; deel waar we kijken of er interups zijn geweest of niet
Main call Display btfsc PORTB,1 ; kijken of de reset hoog staat goto NulMaken ; alles terug op nul zetten: tiental, eenhede, tiende btfsc Vlag, SwitchChange ; kijken of er een verandering is van de Start/Stop Switch Call ChangeSwitch ; er is een verandering btfss Vlag, SwitchState ; kijken of de chronometer aan het lopen is goto Main ; als de chronometer niet loopt => terug naar main btfss Vlag, TimerOverFlow ; kijken of er een TimerOverFlow is goto IncAantalOverFlow ;Main ; als er geen TimerOverFlow is terug keren naar main goto IncAantalOverFlow ; als er een TimerOverFlow
; alles reseten NulMaken clrf Tiental ; tiental clearen clrf Eenhede ; eenhede clearen clrf Tiende ; tiende clearen goto Main
; de Switchverandering aanpassen in Vlag ChangeSwitch bcf Vlag, SwitchChange btfsc Vlag, SwitchState ; kijken of bezig waren of niet: 1 bij running,0 bij stop en deze veranderen goto LaagHoog goto HoogLaag
LaagHoog bcf Vlag, SwitchState ; de Vlag van SwitchState 0 maken => we zijn gestopt met de chronometer return
HoogLaag bsf Vlag, SwitchState ; de Vlag van SwitchState 1 maken => we zijn begonnen met de chronometer clrf AantalOverFlow ; de teller die het aantal overflows bij houdt clearen return
IncAantalOverFlow bcf Vlag, TimerOverFlow ; vlag terug laag zetten incf AantalOverFlow,1 ; 1 optellen bij het aantal overflows movf AantalOverFlow,0 ; naar werkgeheugen verplaatsen om te testen of we al aan 5 overflows zitten sublw 2 ; 5 van het werkgeheugen aftrekken btfss STATUS,Z ;als we aan 5 overflows zaten is de zeroflag 1 goto Main clrf AantalOverFlow ;teller van het aantal overflows clearen goto IncTiende
IncTiende movf Tiende,0 ; naar werkgeheugen verplaatsen om te testen of we al aan negen tiende zitten sublw 9 btfsc STATUS,Z ; als we op negen zitten is de zeroflag 1 goto IncEenhede ; indien ja => eenhede + 1 en de tiende clearen incf Tiende,1 ; zoniet bij tiende 1 optellen goto Main ; en terug keren naar Main
IncEenhede clrf Tiende ; de tiende op nul zetten movf Eenhede,0 ; naar werkgeheugen verplaatsen om te testen of we al aan negen tiende zitten sublw 9 btfsc STATUS,Z ; als we op negen zitten is de zeroflag 1 goto IncTiental ; indien ja => Tiental + 1 en de Eenhede clearen incf Eenhede,1 ; zoniet bij tiende 1 optellen goto Main ; en terug keren naar Main
IncTiental clrf Eenhede movf Tiental,0 ; naar werkgeheugen verplaatsen om te testen of we al aan negen tiende zitten sublw 9 btfss STATUS,Z ; als we op negen zitten is de zeroflag 1 goto EindeChrono ; indien ja => Tiental clearen incf Tiental,1 ; zoniet bij tiende 1 optellen goto Main
EindeChrono clrf Tiental goto Main
;*********************************************************************** ; alles van het interupt gedeelte ; eerst context saving ; dan kijken vanwaar interupt ; dan juist handelen => timeroverflow => bijtellen indien nodig ; => Switch => starten/stoppen ;*********************************************************************** Interrupt ;context saving movwf W_TEMP SWAPF STATUS,W CLRF STATUS MOVWF STATUS_TEMP
; kijken vanwaar de interrupt bsf STATUS,RP0 ; Bank 1 selecteren btfsc INTCON,INTF ; kijken of de interrupt van de Switch kwam call InterSwitch btfsc INTCON,T0IF ; kijken of de interrupt van de timer kwam call InterTimer
bcf STATUS,RP0 ; Bank 0 selecteren
; context terug plaatsen SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W
; terug keren retfie
InterSwitch bcf STATUS,RP0 ; Bank 0 is selected bsf Vlag, SwitchChange bsf STATUS,RP0 ; Bank 1 is selected bcf INTCON,INTF ; vlag van de Switch terug op nul zetten return
InterTimer movlw 0xF0 movwf TMR0 ; tellen van 59 tot 255 bcf STATUS,RP0 ; Bank 0 is selected bsf Vlag, TimerOverFlow bsf STATUS,RP0 ; Bank 1 is selected bcf INTCON,T0IF ; vlag van de Timer terug op nul zetten return
;************************************************************ ;einde interupt gedeelte ;************************************************************
;************************************************************ ; alles van Display Chronometer ; keuze van wat op de display ; eerst kijken naar tiende dan eenhede en dan tientallen ; niets gekozen => toon de tiende ;************************************************************ Display btfsc PORTA,2 ; kijken naar tientallen goto Toontiental ; btfsc PORTA,1 ; kijken naar eenhede goto Tooneenhede ; goto Toontiende ; als niets geselecteerd => toon tiende
Toontiental movf Tiental,0 call Tabel goto Toon
Tooneenhede movf Eenhede,0 call Tabel goto Toon
Toontiende movf Tiende,0 call Tabel goto Toon
Toon movwf PORTC return
Tabel addwf PCL ;volgorde van plaatsing: dp g f e d c b a BEST NOG IS NAKIJKEN MET DOBBEL retlw 0x40 ;display 0 retlw 0x79 ;display 1 retlw 0x24 ;display 2 retlw 0x30 ;display 3 retlw 0x19 ;display 4 retlw 0x12 ;display 5 retlw 0x02 ;display 6 retlw 0x78 ;display 7 retlw 0x00 ;display 8 retlw 0x10 ;display 9 return ;einde tabel-subroutine ;************************************************************ ;einde Display van Chronometer ;************************************************************
END ;einde programma