Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

03/02/2012 #1

Avatar de Meta

PIC12F508 como temporizador.
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_12F50 8.X\dist\default\production
03/02/2012 #2

Avatar de Scooter

Es una barbaridad hacer temporizaciones de mas de unos pocos ms con bucles vacíos. Usa un timer e interrupciones.
03/02/2012 #3

Avatar de Meta

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.

http://members.fortunecity.es/kagiva...555practic.htm

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
03/02/2012 #4

Avatar de Basalto

Hola. Aquí tienes un ejemplo en Hi-Tech con interrupciones. Un saludo.


Código 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{
  
IADRESH*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){
  
alfa1alfa1+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){
  
alfa1alfa1+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;
  }
}
//------------------------------------------------------------------------- 
03/02/2012 #5

Avatar de Meta

Gracias, tengo el C18 descargado, por si acaso me descargaré el Hitech por si acaso. Voy a probar y compilar.
Hace 2 Semanas #6


estrobo
Hola buenas tardes

Realice en Mplab un programa y funciona correctamente ahora quiero que cuando tenga un cero ala entrada el led sea un intermitente no se si pudieran ayudarme como hacerlo si tengo que agregarle una subrutina o un timer.
gracias saludos
Archivos Adjuntos
Tipo de Archivo: zip estrobo.zip (16,4 KB (Kilobytes), 5 visitas)
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.