;wacht voor pijl LIST P=PIC16F876A #INCLUDE P16F877A.INC __CONFIG _CP_OFF & _DEBUG_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _BODEN_OFF & _XT_OSC CBLOCK 0x20 ; used to define a starting address for variables or constants that require increasing values aantal_hoeken ;120 gekozen WREG_TEMP ;storage for WREG during interrupt STATUS_TEMP ;storage for STATUS during interrupt PCLATH_TEMP ;storage for PCLATH during interrupt FSR_TEMP ;storage for FSR during interrupt hoek_nummer hoek_uur hoek_minuut grote_wijzer kleine_wijzer teller tijd_l tijd_h kwart_sec minuut twaalf_minuten hoek_second seconde toer_l toer_h toer_houd DataIN1 DataIN2 DataIN3 DataIN4 DutyCycle ENDC ORG 0 GOTO RESET nop nop ORG 4 GOTO Int NOP ; ************************** ; * main routine: * ; ************************** RESET Bank1 MOVLW B'11000001' MOVWF TRISB ; 5 pinnen van port B uitgang behalve RB0 voor externe interrupt BCF OPTION_REG,6 ; external interrupt on falling edge of RB0 Bank0 MOVLW B'11111111' MOVWF PORTB ; pinnen van port B aan, visuele controle van werking pic MOVLW B'00000000' ;initialisatie variabelen MOVWF DataIN1 MOVWF DataIN2 MOVWF DataIN3 MOVWF DataIN4 MOVWF tijd_l MOVWF tijd_h MOVWF seconde MOVWF kwart_sec MOVWF minuut MOVWF twaalf_minuten BSF T1CON,0 ;enable Timer1 BCF T1CON,1 ;Timer1 increments on every instruction cycle Fosc/4 BSF T1CON,4 BSF T1CON,5 ;prescale 1/8, 8 microseconden komen overeen met 1 increment van TMR1L MOVLW d'120' ;initialisatie positie wijzers MOVWF hoek_minuut MOVWF hoek_uur MOVWF hoek_second CALL SetupSerial Loop GOTO Loop ;Subroutine SetupSerial Bank1 ;Select bank 1 MOVLW B'10000000' MOVWF TRISC ; pinnen van port C uitgang BSF TXSTA,BRGH ;Select high speed mode MOVLW D'25' MOVWF SPBRG ;Select baud rate 9600 in high speed BCF TXSTA,SYNC ;Select async mode BSF TXSTA,TXEN ;Enable Transmit Bank0 ;Select bank0 movlw 0x90 ;Enable serial port and reception movwf RCSTA movlw 0xc0 ;Enable global and peripheral ints movwf INTCON BSF INTCON,4 ;enable RB0 interrupt Bank1 ;Select bank1 movlw 0x20 ;(0x30 enable TX) and RX interrupts movwf PIE1 Bank0 return KwartSecTellen ;MOVLW d'6' ;SUBWF tijd_h,1 MOVLW B'00010010' ;0.25 seconden aftrekken van de doorlopen tijd SUBWF tijd_l,1 MOVLW B'01111010' SUBWF tijd_h,1 INCF kwart_sec,1 ;aangeven dat we 0.25 seconden verder zijn BCF STATUS,Z MOVLW d'4' ;om de second vooruit gaan SUBWF kwart_sec,0 BTFSC STATUS,Z ;test of second voorbij CALL SecondVooruit ;indien ja secondenpinker vooruit zetten RETLW 0 SecondVooruit INCF seconde,1 ;aangeven dat seconde verder zijn BCF STATUS,Z MOVLW d'120' ;nagaan of secondenpinker toer heeft gedaan SUBWF hoek_second,0 BTFSC STATUS,Z ;indien ja secondenpinker terug van begin toer laten beginnen CLRF hoek_second INCF hoek_second,1 ;secondenpinker verder zetten INCF hoek_second,1 CLRF kwart_sec ;tellen van de kwartseconden laten herbeginnen BCF STATUS,Z MOVLW d'60' SUBWF seconde,0 BTFSC STATUS,Z ;test of minuut voorbij CALL MinuutVooruit ;indien ja minutenwijzer vooruit zetten RETLW 0 MinuutVooruit INCF minuut,1 ;aangeven dat minuut verder zijn BCF STATUS,Z MOVLW d'120' ;nagaan of minutenwijzer toer heeft gedaan SUBWF hoek_minuut,0 BTFSC STATUS,Z ;indien ja minutenwijzer terug van begin toer laten beginnen CLRF hoek_minuut INCF hoek_minuut,1 ;minutenwijzer verder zetten INCF hoek_minuut,1 ;minutenwijzer verder zetten CLRF seconde ;tellen van de seconden laten herbeginnen BCF STATUS,Z MOVLW d'12' SUBWF minuut,0 BTFSC STATUS,Z ;test of twaalf minuten voorbij CALL UurVooruit RETLW 0 UurVooruit INCF twaalf_minuten,1 ;aangeven dat twaalf minuten verder zijn, heeft geen functie BCF STATUS,Z MOVLW d'120' ;nagaan of uurwijzer toer heeft gedaan SUBWF hoek_uur,0 BTFSC STATUS,Z ;indien ja uurwijzer terug van begin toer laten beginnen CLRF hoek_uur INCF hoek_uur,1 ;uurwijzer verder zetten INCF hoek_uur,1 ;uurwijzer verder zetten CLRF minuut ;tellen van de minuten laten herbeginnen RETLW 0 Wacht1Hoek ;wachttijd gedurende dewelke de leds oplichten MOVLW D'40' CALL Loop1Hoek ; RETLW 0 Loop1Hoek ADDLW d'255' ; Dec W BTFSS STATUS, Z ; Zero flag set? GOTO Loop1Hoek ; No, keep looping RETURN ; WachtDubbeleHoek ; bepaald tijdsduur van 1 hoek MOVF toer_h,0 ; in toer_h zit tijd tot dewelke deze hoek mag duren SUBWF TMR1L,0 ; TMR1L wordt hiermee vergeleken BTFSS STATUS,Z ; als gelijk moet je overgaan naar volgende hoek GOTO WachtDubbeleHoek BCF STATUS,Z MOVF toer_houd,0 ; bij toer_h tijd van 1 hoek bijtellen om eindtijdstip van volgende hoek te kennen ADDWF toer_h,1 RETLW 0 KleinePijlMaken ; kleine wijzer BSF PORTC,3 BCF STATUS,Z ; zeroflag terug enablen RETLW 0 GrotePijlMaken ; grote wijzer BSF PORTC,3 BSF PORTC,4 BCF STATUS,Z ; zeroflag terug enablen RETLW 0 SecondPinkMaken ; seconden pinken BSF PORTC,5 BCF STATUS,Z ; zeroflag terug enablen RETLW 0 TestHoek MOVLW B'00000000' MOVWF PORTC MOVWF PORTB BCF STATUS,Z CALL WachtDubbeleHoek ; wachten alvorens leds van nieuwe hoek te laten branden ; testen welke wijzers moeten branden MOVF hoek_nummer,0 SUBWF hoek_second,0 ; pinken voor seconden BTFSC STATUS,Z CALL SecondPinkMaken MOVF hoek_nummer,0 SUBWF hoek_minuut,0 ; grote_wijzer BTFSC STATUS,Z CALL GrotePijlMaken MOVF hoek_nummer,0 SUBWF hoek_uur,0 ; kleine_wijzer BTFSC STATUS,Z CALL KleinePijlMaken RETLW 0 LegeHoek DECF hoek_nummer, 1 CALL TestHoek CALL Wacht1Hoek ; wacht breedte pijl RETLW 0 Streepje DECF hoek_nummer, 1 CALL TestHoek MOVLW B'00111110' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl RETLW 0 HoekenMaken Bank0 BCF STATUS,C MOVF TMR1L,0 ;tijdtoerL MOVWF toer_l ADDWF tijd_l, 1 BTFSC STATUS,C ;overflow detecteren INCF tijd_h,1 ;als overflow tijdh verhogen MOVF TMR1H,0 ; MOVWF toer_h ADDWF tijd_h,1 BCF STATUS,C RLF toer_h,1 ;TMR1 delen door 128 CLRF TMR1L CLRF TMR1H ;prescaler on timer 1 is cleared on writes to the register (p 62) BSF T1CON,5 ;prescale 1/8 BSF T1CON,4 BTFSC tijd_l,7 ; we delen door 128 dus moeten rekening houden met zevende bit van het tijd_l-register INCF toer_h,1 MOVF toer_h,0 MOVWF toer_houd BCF STATUS,C ;bijkomende bewerking voor het delen door 120 ipv 128 RRF toer_h,1 BCF STATUS,C RRF toer_h,1 BCF STATUS,C RRF toer_h,1 BCF STATUS,C RRF toer_h,0 ADDWF toer_houd,0 MOVWF toer_houd MOVWF toer_h BTFSC tijd_h,7 CALL KwartSecTellen ;hoek2 MOVLW d'2' MOVWF hoek_nummer CALL TestHoek MOVLW B'00111010' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek1 MOVLW d'1' MOVWF hoek_nummer BTFSC toer_l,6 INCF toer_h BTFSC toer_houd,4 INCF toer_h CALL TestHoek MOVLW B'00101010' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek120 MOVLW d'120' MOVWF hoek_nummer CALL TestHoek MOVLW B'00101110' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek119 MOVLW d'119' MOVWF hoek_nummer BTFSC toer_l,5 INCF toer_h BTFSC toer_houd,3 INCF toer_h CALL TestHoek MOVLW B'00000000' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek118 MOVLW d'118' MOVWF hoek_nummer CALL TestHoek MOVLW B'00111110' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek117 MOVLW d'117' MOVWF hoek_nummer CALL TestHoek MOVLW B'00010000' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl CALL LegeHoek ;116 BTFSC toer_l,4 INCF toer_h BTFSC toer_houd,2 INCF toer_h CALL LegeHoek ;115 CALL LegeHoek ;114 CALL LegeHoek ;113 CALL LegeHoek ;112 CALL LegeHoek ;111 CALL Streepje ;110 CALL LegeHoek ;109 CALL LegeHoek ;108 BTFSC toer_l,3 INCF toer_h BTFSC toer_houd,1 INCF toer_h CALL LegeHoek ;107 CALL LegeHoek ;106 CALL LegeHoek ;105 CALL LegeHoek ;104 CALL LegeHoek ;103 CALL LegeHoek ;102 CALL LegeHoek ;101 CALL Streepje ;100 CALL LegeHoek ;99 CALL LegeHoek ;98 CALL LegeHoek ;97 CALL LegeHoek ;96 CALL LegeHoek ;95 CALL LegeHoek ;94 CALL LegeHoek ;93 ;hoek92 MOVLW d'92' MOVWF hoek_nummer BTFSC toer_l,2 INCF toer_h BTFSC toer_l,7 INCF toer_h CALL TestHoek MOVLW B'00111100' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek91 MOVLW d'91' MOVWF hoek_nummer CALL TestHoek MOVLW B'00100100' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek90 MOVLW d'90' MOVWF hoek_nummer CALL TestHoek MOVLW B'00111100' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek89 MOVLW d'89' MOVWF hoek_nummer CALL TestHoek MOVLW B'00000100' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek88 MOVLW d'88' MOVWF hoek_nummer CALL TestHoek MOVLW B'00111100' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl CALL LegeHoek ;87 CALL LegeHoek ;86 CALL LegeHoek ;85 CALL LegeHoek ;84 CALL LegeHoek ;83 CALL LegeHoek ;82 CALL LegeHoek ;81 CALL Streepje ;80 CALL LegeHoek ;79 CALL LegeHoek ;78 CALL LegeHoek ;77 CALL LegeHoek ;76 CALL LegeHoek ;75 CALL LegeHoek ;74 CALL LegeHoek ;73 CALL LegeHoek ;72 CALL LegeHoek ;71 CALL Streepje ;70 CALL LegeHoek ;69 CALL LegeHoek ;68 CALL LegeHoek ;67 CALL LegeHoek ;66 CALL LegeHoek ;65 CALL LegeHoek ;64 CALL LegeHoek ;63 CALL LegeHoek ;62 ;hoek61 MOVLW d'61' MOVWF hoek_nummer CALL TestHoek MOVLW B'00111110' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek60 MOVLW d'60' MOVWF hoek_nummer CALL TestHoek MOVLW B'00101010' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek59 MOVLW d'59' MOVWF hoek_nummer BTFSC toer_l,1 INCF toer_h BTFSC toer_l,6 INCF toer_h CALL TestHoek MOVLW B'00101010' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek58 MOVLW d'58' MOVWF hoek_nummer CALL TestHoek MOVLW B'00111010' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl CALL LegeHoek ;57 CALL LegeHoek ;56 CALL LegeHoek ;55 CALL LegeHoek ;54 CALL LegeHoek ;53 CALL LegeHoek ;52 CALL LegeHoek ;51 CALL Streepje ;50 CALL LegeHoek ;49 CALL LegeHoek ;48 CALL LegeHoek ;47 CALL LegeHoek ;46 CALL LegeHoek ;45 CALL LegeHoek ;44 CALL LegeHoek ;43 CALL LegeHoek ;42 CALL LegeHoek ;41 CALL Streepje ;40 CALL LegeHoek ;39 CALL LegeHoek ;38 CALL LegeHoek ;37 CALL LegeHoek ;36 CALL LegeHoek ;35 CALL LegeHoek ;34 CALL LegeHoek ;33 ;hoek32 MOVLW d'32' MOVWF hoek_nummer CALL TestHoek MOVLW B'00111100' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek31 MOVLW d'31' MOVWF hoek_nummer CALL TestHoek MOVLW B'00100000' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek30 MOVLW d'30' MOVWF hoek_nummer CALL TestHoek MOVLW B'00111000' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek29 MOVLW d'29' MOVWF hoek_nummer CALL TestHoek MOVLW B'00100000' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl ;hoek28 MOVLW d'28' MOVWF hoek_nummer CALL TestHoek MOVLW B'00111100' ADDWF PORTB CALL Wacht1Hoek ; wacht breedte pijl CALL LegeHoek ;27 CALL LegeHoek ;26 CALL LegeHoek ;25 CALL LegeHoek ;24 CALL LegeHoek ;23 CALL LegeHoek ;22 CALL LegeHoek ;21 CALL Streepje ;20 CALL LegeHoek ;19 CALL LegeHoek ;18 CALL LegeHoek ;17 CALL LegeHoek ;16 CALL LegeHoek ;15 CALL LegeHoek ;14 CALL LegeHoek ;13 CALL LegeHoek ;12 CALL LegeHoek ;11 CALL Streepje ;10 CALL LegeHoek ;9 CALL LegeHoek ;8 CALL LegeHoek ;7 CALL LegeHoek ;6 CALL LegeHoek ;5 CALL LegeHoek ;4 MOVLW B'00000000' MOVWF PORTC MOVWF PORTB BCF INTCON, 1 ; interrupt terug enablen BCF PIR1, 1 GOTO EndInt Int movwf WREG_TEMP ;Save WREG movf STATUS,W ;Store STATUS in WREG clrf STATUS ;Select file register bank0 movwf STATUS_TEMP ;Save STATUS value movf PCLATH,W ;Store PCLATH in WREG movwf PCLATH_TEMP ;Save PCLATH value clrf PCLATH ;Select program memory page0 movf FSR,W ;Store FSR in WREG movwf FSR_TEMP ;Save FSR value BCF STATUS,Z BTFSC INTCON,1 GOTO HoekenMaken Bank0 ;Select bank0 btfsc PIR1,RCIF ;Test RCIF receive interrupt bsf STATUS,RP0 ;Change to bank1 if RCIF set btfsc PIE1,RCIE ;Test if interrupt enabled if RCIF set goto GetData ;If RCIF and RCIE set, do receive EndInt Bank0 ;Select bank 0 movf FSR_TEMP,W ;Get saved FSR value movwf FSR ;Restore FSR movf PCLATH_TEMP,W ;Get saved PCLATH value movwf PCLATH ;Restore PCLATH movf STATUS_TEMP,W ;Get saved STATUS value movwf STATUS ;Restore STATUS swapf WREG_TEMP,F ;Prepare WREG to be restored swapf WREG_TEMP,W ;Restore WREG without affecting STATUS retfie ;Return from interrupt ;Get received data GetData Bank0 btfsc RCSTA,OERR ;Test overrun error flag goto ErrOERR ;Handle it if error btfsc RCSTA,FERR ;Test framing error flag goto ErrFERR ;Handle it if error movf DataIN3,W ;Move last received data movwf DataIN4 movf DataIN2,W ;Move last received data movwf DataIN3 movf DataIN1,W ;Move last received data movwf DataIN2 movf RCREG,W ;Get received data movwf DataIN1 ;Copy to DataIn1 SUBLW D'0' BTFSS STATUS,Z ;Test if last data was 0 GOTO BlockNotComplete movf DataIN2,W movwf hoek_uur ;kleine wijzer instellen movwf PORTB ;controle of is toegekomen movf DataIN3,W movwf hoek_minuut ;grote wijzer instellen movf DataIN4,W movwf minuut BlockNotComplete goto EndInt ;error because OERR overrun error bit is set - clear and continue ErrOERR bcf RCSTA,CREN ;reset the receiver logic bsf RCSTA,CREN ;enable reception again goto EndInt ;error because FERR framing error bit is set - clear and continue ErrFERR movf RCREG,W ;discard received data that has error goto EndInt ;Read analog data and transmit data PutData GOTO EndInt END ; End source code