PIC12F508 como temporizador.

#1
Hola:

Quiero hacer y me da igual el lenguaje de programación y si es con TIMER o mediante retardo un temporizador que dure 20 segundos de esta manera con un PIC12F508.

Descargué el MPLAB X v1.00. Estoy con el ASM por ahora.

En este directorio veo un ejemplo para poder empezar a organizarme.
C:\Archivos de programa\Microchip\MPASM Suite\Template\Code

Cogí el archivo llamado: 12F508TEMP.ASM.

En su interior me encuentro este código:
Código:
;**********************************************************************
;   This file is a basic code template for assembly code generation   *
;   on the PIC12F508. This file contains the basic code               *
;   building blocks to build upon.                                    *
;                                                                     *
;   Refer to the MPASM User's Guide for additional information on     *
;   features of the assembler (Document DS33014).                     *
;                                                                     *
;   Refer to the respective PIC data sheet for additional             *
;   information on the instruction set.                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Filename:        xxx.asm                                           *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:                                                          *
;    Company:                                                         *
;                                                                     * 
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files Required: P12F508.INC                                      *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;**********************************************************************

    list      p=12F508            ; list directive to define processor
    #include <p12F508.inc>        ; processor specific variable definitions

    __CONFIG   _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC

; '__CONFIG' directive is used to embed configuration word 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.




;***** VARIABLE DEFINITIONS
temp    EQU     0x07        ;example variable definition



;**********************************************************************
    ORG     0x1FF             ; processor reset vector

; Internal RC calibration value is placed at location 0x1FF by Microchip
; as a movlw k, where the k is a literal value.

    ORG     0x000             ; coding begins here
    movwf   OSCCAL            ; update register with factory cal value 




start    
    nop                       ; example code
    movlw   0xFF              ; example code
    movwf   temp              ; example code

; remaining code goes here






    END                       ; directive 'end of program'
Ahorra algo de trabajo. Me queda hacer un programa como temporizador de 20 segundos y otras cosas.

El PIC12F508 siempre está alimentado como fuente principal a 5V. Los pines incluyen: Un pin de entrada que detecta cuando hay 5V o 0V. Tres pines de salida, Un Led rojo, un Led verde y un ventilador. El ventilador siempre está funcionando y el LEd verde encendido, el rojjo apagado. Cuando el único pin de entrada detecta 0V, el pin del led verde se apaga, se enciende el rojo y ahí se activa el temporizador de 20 segundos que al finalizar se detiene el ventilador.

¿Se entiende?

Ya pondré un esquema boceto más adelante.

Escribí antes que tiene un único pin de entrada. Ahora te digo que hay otro más con un pulsador que lo único que hace es activar y desactivar el ventilador. (Esta parte es opcional).

Hay un método mediante retardos que puedes sacar los 20 segundos con la desvantaja que el PIC queda esclavo y no puedo hacer otra cosa hasta que el contador acabe.

http://www.golovchenko.org/cgi-bin/delay

Código:
; Delay = 20 seconds
; Clock frequency = 4 MHz

; Actual delay = 20 seconds = 20000000 cycles
; Error = 0 %

    cblock
    d1
    d2
    d3
    endc

Delay
            ;19999992 cycles
    movlw    0xB5
    movwf    d1
    movlw    0x99
    movwf    d2
    movlw    0x2C
    movwf    d3
Delay_0
    decfsz    d1, f
    goto    $+2
    decfsz    d2, f
    goto    $+2
    decfsz    d3, f
    goto    Delay_0

            ;4 cycles
    goto    $+1
    goto    $+1

            ;4 cycles (including call)
    return
Lo ideal sería hacerlo con TIMER a 20 segundos, ya que tienes la ventaja de usar interrupciones cuando quiera y el PIC no queda esclavo. Por ahora lo quiero hacer en ASM, si lo hacen en C me da igual.

Cualquier duda para entender lo que quiero hacer me lo explican para explicarlo mejor y espero poner un dibujo. Ya que aún no lo tengo hecho, el que lo desee puede hacer un boceto de un esquema eléctrico del PIC.

El ventilador a usar es un cooler de 12Vdc como vez en la imagen.


Un saludo.


Edito:

El .Hex generado del MPLAB X v1.00, en mi caso lo he encontrado en este directorio.

C:\Documents and Settings\Usuario\MPLABXProjects\Temporizador_12F508.X\dist\default\production
 
Última edición:
#2
Es una barbaridad hacer temporizaciones de mas de unos pocos ms con bucles vacíos. Usa un timer e interrupciones.
 
#3
Precisamente es lo que no se hacer en ASM ni en C. ejjejejje.

Pensando bien, para no estar programando nada, mejor un NE555 que me sale más fácil a cambio de usar más componentes. Alimentado a 12Vdc.



Si quiero usar los apagado y encendido de los LEd rojo y verde la ventaja lo tiene el PIC12F508.

hay otras Web que te calculan en C el timer, pero no entiendo ni papa.
http://eng-serve.com/pic/pic_timer.html
 
Última edición:
#4
Hola. Aquí tienes un ejemplo en Hi-Tech con interrupciones. Un saludo.


PHP:
//----------------------------------------------------------------------
#include <pic.h>
#include <math.h>
 //Necesario para que el compilador tolere 
       // la volatilidad de las variables locales
//-------------------Definiciones-------------------------------------------
#define XTAL 4000000
//--------------------Variables globales------------------------------------
unsigned char primera=0,first,vprimera=0,iprimera=0; 
long POT,Q,V,I,alfa1,T,aux,DES,F1; 
double long alfa3;
//--------------------Declaración de funciones------------------------------
void cad(void);
void cap1(void);
void cap2(void);

//--------------------Rutina de interrupción--------------------------------
static void interrupt
isr(void)   // Here be interrupt function - the name is unimportant.
{
 if (ADIF==1){
  cad(); 
 }
 if (CCP1IF==1){
  cap1();
 }
 if (CCP2IF==1){
  cap2();
 }
}
//---------------------Programa principal-----------------------------------
void main(void)   
{
 CCP1IE=1;
 CCP2IE=1;
 RC1=1;
 RC2=1;
 CCP1CON=0b00000101; 
 CCP2CON=0b00000101;
 T1CON=0b00110001;
 ADCON0=0b11000001;
 ADCON1=0b10000000;
 
 ADIE=1; 
 PEIE=1;
 GO=1;
 GIE=1;
    //Habilitación general 
 while(1);
}
//---------------------Función cad()---------------------------------------
void cad(void){
 ADIF=0; //Borrado del flag
   
 if (first==0){
  V=ADRESH*256;
  V=V+ADRESL;
  V=V*300/1024;
   // Carga el valor de la corriente convertido
  CHS0=1;  //Se cambia de canal para la próxima conversión
  first=1;
  GO=1;  //Se arranca la siguiente conversión
 }
 else{
  I= ADRESH*256;
  I=I+ADRESL;
  I=I*60/1024;
  CHS0=0;      //Se cambia de canal para la próxima conversión
  first=0;
 }
}
//---------------------Función cap1-------------------------------
 void cap1(void){ //capturo la tension
  CCP1IF=0;
   int cap1A,cap2A,TT;
  if(iprimera==0){
  vprimera=1;
 
  if(primera==0){
  primera=1;
  }
  else{
  cap1A=(CCPR1H*256);
  cap1A=cap1A+CCPR1L;
  T=cap1A-aux;
  if (T>0){
  TT=T;
  } 
  T=TT;
  F1=1000000/(T*8); 
  cap2A=(CCPR2H*256);
  cap2A=cap2A+CCPR2L;
  DES=(cap1A-cap2A);
  alfa1=DES*360/(T); //Ángulo en grados
  if (alfa1<0){
  alfa1= alfa1+360;
  }
  alfa3=(alfa1*2*3.14); // ángulo en radianes
  POT=V*I*cos(alfa3);
  Q=V*I*sin(alfa3);
  
  }
  GO=1; //cad
  
  
  aux=(CCPR1H*256);
  aux=aux+CCPR1L;
  }
}
//--------------------- cap2()-----------------------------------
 void cap2(void){ //capturo corriente
 CCP2IF=0;
 int cap1A,cap2A,TT;
  if (vprimera==0){
  iprimera=1;
  if(primera==0){
  primera=1;
  }
  else{
  cap1A=(CCPR2H*256);
  cap1A=cap1A+CCPR2L;
  T=cap1A-aux;
  if (T>0){
  TT=T;
  } 
  T=TT;
  F1=1000000/(T*8); 
  cap2A=(CCPR1H*256);
  cap2A=cap2A+CCPR1L;
  DES=(cap1A-cap2A);
  alfa1=DES*360/(T); //Ángulo en grados
  if (alfa1<0){
  alfa1= alfa1+360;
  }
  alfa3=(alfa1*2*3.14); // ángulo en radianes
  POT=V*I*cos(alfa3);
  Q=V*I*sin(alfa3);
  
  }
  GO=1; //cad
  
  
  aux=(CCPR2H*256);
  aux=aux+CCPR2L;
  }
}
//-------------------------------------------------------------------------
 
Última edición por un moderador:

Temas similares

Arriba