;********************************************************************** ; * ; Filename: tmr0.asm * ; Date: 12/03/2006 * ; File Version: * ; * ; Author: Paul HEROIN * ; Company: Supelec-bricotronique.com * ; * ; * ;********************************************************************** ; * ; Files required: * ; * ; * ; * ;********************************************************************** ; * ; Notes: Programme qui utilise le timerO du PIC16F628 * ; , qui fait allume et éteint alternativement le * ; clignotement d'une LED sur RB3 * ; * ; * ;********************************************************************** list p=16f628 ; list directive to define processor #include ; processor specific variable definitions ; __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _ER_OSC_CLKOUT & _MCLRE_ON & _LVP_ON __CONFIG H'3F30' ; '__CONFIG' directive is used to embed configuration data within .asm file. ; The lables following the directive are located in the respective .inc file. ; See respective data sheet for additional information on configuration word. #DEFINE LED PORTA,3 ;***** VARIABLE DEFINITIONS w_temp EQU 0x70 ; variable used for context saving status_temp EQU 0x71 ; variable used for context saving CBLOCK 0x20 etat : 1 ;etat de la led etat2 :1 ;etat de l'oscillation nbcycle :1 ;compteur de cycle ENDC ;********************************************************************** ORG 0x000 ; processor reset vector goto main ; go to beginning of program ORG 0x004 ; interrupt vector location movwf w_temp ; save off current W register contents swapf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register ;todo incf nbcycle,f btfsc STATUS,Z ;si on fait 32 cycles call changer_etat2 ; on change d'état d'oscillation movf etat2,w btfsc STATUS,Z ;on teste après l'état d'oscillation goto nodisplay ;si etat2=0 alors on clignote pas movf etat,w btfsc STATUS, Z ;si etat=0 call etat1 ;on met etat à un et on allume la led btfss STATUS, Z ;sinon call etat0 ;on met etat à 0 et on éteint la led movwf etat nodisplay movlw D'100' ;on met 200 ds TMR0 , plus cette valeur est grande, ; plus le compteur compte rapidement (limite 256) movwf TMR0 bcf INTCON, T0IF ;on remet les flags d'interruption à 0 ; /todo swapf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt ; fonctions etat1 ;on met l'état à 1 et on allume la led movlw 1 movwf etat bsf LED return etat0 ;on met l'état à 1 et on allume la led movlw 0 movwf etat bcf LED return etat2_1 ;on met l'état2 à 1 movlw 1 movwf etat2 return etat2_0 ;on met l'état2 à 0 movlw 0 movwf etat2 return changer_etat2 ; on change d'état de etat2 movfw etat2 btfss STATUS,Z call etat2_0 btfsc STATUS,Z call etat2_1 movlw D'224' movwf nbcycle return ;principal main init clrf TMR0 bsf STATUS, RP0 ;on fait ce qu'il y a à faire ds la banque 1 movlw B'00000111' movwf OPTION_REG ;on divise l'horloge par 256 pour TMR0 movlw B'00000000' movwf TRISA ;le portA sont des sorties bcf STATUS, RP0 ;on fait ce qu'il y a à faire ds la banque 1 movlw B'10100000' movwf INTCON ;on autorise les interruptions sur TMR0 bcf STATUS, RP0 ;on se remet ds la banque 0 clrf etat clrf etat2 movlw D'224' ; 256-32=224, donc on aura 32 oscillations par cycles movwf nbcycle ;début programme start nop goto start END ; directive 'end of program'