;********************************************************************** ; * ; Filename: bougie.asm * ; Date: 17/03/2006 * ; File Version: 1 * ; * ; Author: Paul HEROIN * ; Company: Bricotronique.com * ; * ; * ;********************************************************************** ; * ; Files required: p16f628.inc * ; * ; * ; * ;********************************************************************** ; * ; Notes: Programme qui permet de faire scintiller une led sur la * ; broche 9 du PIC16F628, en utilisant le module de PWM (pour générer * ; l'intensité de la led) et d'une routine de création de nombre aléa- * ; toires. * ; * ;********************************************************************** list p=16f628 ; list directive to define processor #include ; processor specific variable definitions __CONFIG H'3F30' ; on travaille avec l'oscillateur interne. ;***** VARIABLE DEFINITIONS w_temp EQU 0x70 ; variable used for context saving status_temp EQU 0x71 ; variable used for context saving CBLOCK 0x20 cmpt :1 ;compteur de division des interruptions RAND_HI :1 ;1 octet du nombre aléatoire généré RAND_LO :1 ;2eme octet du nombre aléatoire généré ENDC CMPT_VAL EQU D'2' ;diviseur pour les interruptions du timer0 ;********************************************************************** 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 in interruption decfsz cmpt goto fininterrupt call allumage_aleatoire movlw CMPT_VAL movwf cmpt fininterrupt movlw D'000' ;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 ;random16 : génère un nomre aléatoire sur 16 bit (RAND_HI et RAND_LO) on ne se sert que le RAND_LO ici. RANDOM MOVF RAND_HI, W ; if current random is 0000, make it 00FFH IORWF RAND_LO, W BTFSC STATUS, Z COMF RAND_LO, F BTFSS RAND_HI, 6 ; hi.7 = hi.7 xor hi.6 MOVLW 00H BTFSC RAND_HI, 6 MOVLW 80H XORWF RAND_HI, F BTFSS RAND_HI, 4 ; hi.7 = hi.7 xor hi.4 MOVLW 00H BTFSC RAND_HI, 4 MOVLW 80H XORWF RAND_HI, F BTFSS RAND_LO, 3 ; hi.7 = hi.7 xor lo.3 MOVLW 00H BTFSC RAND_LO, 3 MOVLW 80H XORWF RAND_HI, F RLF RAND_HI, W ; carry = hi.7 RLF RAND_LO, F ; double left shift RLF RAND_HI, F movf RAND_LO,W RETURN allumage_aleatoire ;on met l'état à 1 et on allume la led call RANDOM movwf CCPR1L 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'11111111' movwf TRISA ;le portA sont des entrées movlw B'00000100' movwf TRISB ;on met des sorties sur le PORTB movlw B'11111111' movwf PR2 ;on règle la période de PWN bcf STATUS, RP0 ;on fait ce qu'il y a à faire ds la banque 0 movlw B'10100000' movwf INTCON ;on autorise les interruptions sur TMR0 movlw B'00001111' ;PWM mode movwf CCP1CON movlw B'0111111' ;activer TMR2 avec le décomptage max movwf T2CON movlw 0x07 ; on désactive les comparateurs (inutile ici.) movwf CMCON bcf STATUS, RP0 ;on se remet ds la banque 0 movlw CMPT_VAL movwf cmpt ;diviseur pour le tmr0 ;début programme start nop ; pas de programme principal... on en fait qu'attendre les interruptions. A vous de le compléter... goto start END ; directive 'end of program'