Tengo un pequeño programa (*) que hace que cuando el 12C508, deja de recibir por su patilla (2) GP5/CIN el impulso destinado a un servo, dipara el zumbido de un pequeño "buzzer". ¿Alguien podría decirme las modificaciones que tengo que hacer en el siguiente condigo, para que pite de forma alternativa?
De esta manera consigo que se escuche desde más lejos y el consumo se reduce a la mitad, ya que el "buzzer" consume de forma alternativa.
Otra cosa ¿ puedo garbarlo tanto en un 12C508 como un 12C508A ?
Saludos para Todos.
;************************************************
; Register definitions for PIC12C508
;************************************************
#include <p12C508.inc> ; processor specific variable definitions
;************************
;* General system info *
;************************
;
;Instruction clock frequency = 4MHz
;Non-branching instruction execution time = 1 microsecond
;Configuration word settings: Watchdog timer = ON
; Code Protect = OFF
; MCLR pin = disabled
; Oscillator = INTERNAL RC
list p=12c508
__CONFIG _MCLRE_OFF & _CP_ON & _WDT_ON & _IntRC_OSC
;********************************
;* GPIO bit definitions *
;********************************
InRadio equ 5 ; 2 GP5 -- entree prof
InUtil equ 3 ; 4 GP3 -- Surv vbat
OutPwfail equ 2 ; 5 GP2 -- Sortie Power Fail
OutBuz equ 0 ; 7 GP0 -- sortie Buzzer
W equ 00h
F equ 01h
; BYTE size variable declarations
;
_Tmp1 equ 010
_Tmp2 equ 011
Compt_Radio equ 012
Etat_Buzz equ 013
Compt_Led equ 015
Compt_Delai equ 016
ValUn equ 017
us equ 018 ;|registre servant à la routine "attente"
ms equ 019 ;|
; *********************************************
; et hop Demarrage...
; *********************************************
ORG H"00"
MOVWF OSCCAL ; store the factory osc. calibration value
goto Main
;****routine attente**********************************
;------chargement de la duree dans w avant appel en ms
;!! 00h-->255ms
attente movwf ms
movlw 0FEh
movwf us
loop_ms movlw 0F9h
addwf us,F
loop_us nop
decfsz us,F
goto loop_us
decfsz ms,F
goto loop_ms
nop
retlw 000h
;//////////////////////////////////////////////////////
;*****routine tension faible***************************
;vibration du buzzer à 4hertz
alimfail bsf GPIO, OutBuz
bcf GPIO, OutPwfail
movlw 000h
call attente
CLRWDT
bcf GPIO, OutBuz
bsf GPIO, OutPwfail
movlw 000h
call attente
CLRWDT
retlw 000h
;/////////////////////////////////////////////////////
;!!!!!!!! fin des routines !!!!!!!!!!!!!!!!!!!!!!!!!!!
; ----- debut du prgramme ----------------------------
Main CLRF GPIO ; initialise les sorties
movlw b"00101000" ; 0 = sortie, 1= entrée
TRIS GPIO ;
movlw d"001"
movwf ValUn
CLRWDT ; on rearme le timer
MOVLW B"11001101" ; clock interne, WDT utilise diviseur /32 prescaler (500ms)
OPTION ; pullups actives.
bsf GPIO, OutBuz ;|
bcf GPIO, OutPwfail ;|
movlw d"200" ;| bips de verification
call attente ;| du fonctionnement du montage
CLRWDT ;| au demarrage
bcf GPIO, OutBuz ;|
bsf GPIO, OutPwfail ;|
movlw d"150" ;|
call attente ;|
clrwdt ;|
bsf GPIO, OutBuz ;|
bcf GPIO, OutPwfail ;|
movlw d"100" ;|
call attente ;|
clrwdt ;|
bcf GPIO, OutBuz ;|
bsf GPIO, OutPwfail ;|
alim btfss GPIO,InUtil ;| verification batterie,si faible
call alimfail ;| on va sur alimfail(routine)
btfss GPIO,InUtil ;| on ne peut en sortir que si
goto alim ;| l"alim est bonne
CLRWDT ;|
;**************************************************************
; Attente si pulse deja demarre qi"il soit =0
; si au bout de 2.55ms,intradio n"est pas à 0,ya problem-->buz
;**************************************************************
movlw d"0"
WL1 btfss GPIO,InRadio ;|
goto WL1X ;|on fait cette boucle tant que
btfss GPIO,InRadio ;|intradio=1
goto WL1X ;|
btfss GPIO,InRadio ;|
goto WL1X ;|
addwf ValUn,W ; on ajoute 1 a w
btfss STATUS,0 ; Test de l a carry
goto WL1 ; Si pas de pb, on boucle
bsf Etat_Buzz,0 ;on met etat_buz à 1
goto traitement_err ; si probleme de retenue dans le calcul
WL1X clrwdt
;***************************************************************
; Attente transition front montant pulse
;***************************************************************
movlw d"70" ;temps d"attente transition front montant avant erreur
WL2 movwf ms
movlw 0FEh
movwf us
WL2_1 movlw 0F9h
addwf us,F
WL2_2 btfsc GPIO,InRadio
goto deb
decfsz us,F
goto WL2_2
decfsz ms,F
goto WL2_1
nop
bsf Etat_Buzz,0 ;on met etat_buz à 1
goto traitement_err ;
;****************************************************************************
; Comptage durée pulse profondeur entre 0 et 2.54 mS (val dans compt_radio ,d"100"=1ms)
;si compt_radio=d"255" on a un depassement du pulse de 2.55ms
;****************************************************************************
deb movlw d"0"
WL3 btfss GPIO,InRadio ;|
goto WL3X ;|on fait cette boucle tant que
btfss GPIO,InRadio ;|intradio=1
goto WL3X ;|
btfss GPIO,InRadio ;|
goto WL3X ;|
addwf ValUn,W ; on ajoute 1 a w
btfss STATUS,0 ; Test de la carry
goto WL3 ; Si pas de pb, on boucle
movlw d"255" ; si probleme de retenue dans le calcul
; on se bloque à fond
WL3X movwf Compt_Radio ; on recupere la valeur depuis W
clrwdt
;***************************************************************************
;traitement de la largeur du pulse
;si pulse>2ms ou pulse<1ms on a un problem,on met etat_buz=1 puis on va
;a traitement_err
;***************************************************************************
;la valeur de l"impulsion est dans compt_radio !!!!
movlw d"100" ;
movwf _Tmp1 ;val min et val max dans _tmp1 et _tmp2
movlw d"200" ;
movwf _Tmp2 ;
WL4 movf _Tmp1,W ; _Tmp1-->W
subwf Compt_Radio,W ; Compt_Radio-W -->W
btfsc STATUS,0 ; test pour savoir si le resultat est négatif
goto WL4_1 ; le resultat est >0
bsf Etat_Buzz,0 ;on met etat_buz à 1
goto traitement_err ; si probleme de retenue dans le calcul
WL4_1 movf _Tmp2,W ; _Tmp2-->W
subwf Compt_Radio,W ; Compt_Radio-W -->W
btfss STATUS,0 ; test pour savoir si le resultat est négatif
goto WL4_2 ; le resultat est <0
bsf Etat_Buzz,0 ;on met etat_buz à 1
goto traitement_err ; si probleme de retenue dans le calcul
WL4_2 bcf Etat_Buzz,0 ;on met etat_buz à 0
goto traitement_err
;***********************************************************************
;************* on donne au buzzer l"etat de Etat_Buzz ******************
;***********************************************************************
traitement_err
; si etat buzz = 0;
btfss Etat_Buzz,0
goto BUZZEROFF
; else
goto BUZZERON
BUZZERON
bsf GPIO,OutBuz
movlw d"50" ;|
call attente ;|
bcf GPIO,OutBuz
movlw d"250" ;|
call attente ;|
goto ENDBUZZER
BUZZEROFF
bcf GPIO,OutBuz
bsf GPIO,OutPwfail
goto ENDBUZZER
ENDBUZZER
;*************************************************************
; et on recommence
;*************************************************************
clrwdt
goto alim
end