Autor Tema: Pitidos Alternativos de Buzzer con un 12C508  (Leído 1905 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Mako22

  • PIC12
  • **
  • Mensajes: 77
Pitidos Alternativos de Buzzer con un 12C508
« en: 01 de Febrero de 2004, 04:09:00 »
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

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: Pitidos Alternativos de Buzzer con un 12C508
« Respuesta #1 en: 01 de Febrero de 2004, 08:57:00 »
Hola, la parte que controla el buzzer es esta, yo le agregaria un registro con un contador, y testearia un bit de dicho contador, que segun sea 1 o 0, ejecuta la rutina de oscilador o no...
seria


;*****routine tension faible***************************
;vibration du buzzer à 4hertz

alimfail
INCF      CONTADOR,F
BTFSC        CONTADOR,5
goto NO_SONAR


 bsf GPIO, OutBuz
bcf GPIO, OutPwfail

NO_SONAR     ;PARA QUE LOS TIEMPOS SEAN IGUALES

movlw 000h
call attente
CLRWDT
bcf GPIO, OutBuz
bsf GPIO, OutPwfail
movlw 000h
call attente
CLRWDT
retlw 000h


;/////////////////////////////////////////////////////


PODRIAS VER, cual bit anda mejor en cuanto a la velocidad, es decir, yo testeo el 5, puedes cambiarlo por otro...
define el registro CONTADOR

Suerte y comenta como te fue!!!


Norberto

Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Pitidos Alternativos de Buzzer con un 12C508
« Respuesta #2 en: 01 de Febrero de 2004, 10:00:00 »
De todas formas, procura que el avión no caiga muy lejos...

Desconectado Mako22

  • PIC12
  • **
  • Mensajes: 77
RE: Pitidos Alternativos de Buzzer con un 12C508
« Respuesta #3 en: 16 de Febrero de 2004, 00:02:00 »
Lo he metido en el 12C508, y no me funciona, y lo que no sabia, es que este integrado es de una sola grabación.

He preguntado por un 12C508 con ventanilla, pero vale 20 euros.

Sabes de algún otro que me permita que le introduzca este codigo, que me permita regrabarlo todas las veces que quiera y que sea más varato? un 16F84, etc ?

Salu2


 

anything