desktop

funcion millis para pic c

hola consulta, hice este programa en Arduino y funciono, ahora quiero hacerlo en pic y no logro hacer el contador con el timer 0, existe alguna librería tipo la función millis de Arduino para pic c, adjunto los archivos y simulación, gracias

#include <18f2550.h> // Incluimos los ficheros del PIC18F4550 #device ADC = 10 #device PASS_STRINGS = IN_RAM #use delay(clock = 8000000) #fuses NOMCLR, INTRC_IO, NOWDT,NOPROTECT,NOLVP // Configuración de Fusibles. (Bits de configuración) #use I2C(MASTER, SDA=PIN_B0, SCL=PIN_B1, FAST=400000, STREAM=SSD1306_STREAM) #define SSD1306_I2C_ADDRESS 0x7A // Dirección de la pantalla 0x78 o 0x7A #include <SSD1306_OLED.c> // Libreria para manejo de pantalla OLED por I2C // Asignamos PIR1 a la dirección del registro PIR1. /*========================================================================================================================================== ============================================================================================================================================*/ char buffer[30]; int16_t Valor_ADC=0; // Variable donde se almacenará el valor de la conversión ADC. long t; int horas; int minutos; int segundos; /*========================================================================================================================================== ============================================================================================================================================*/ #INT_TIMER0 void TIMER0_isr() { t++; horas = t / 3600; t %= 3600; minutos = t / 60; segundos = t % 60; set_timer0(238); } void main() // Función Principal. { setup_oscillator(OSC_8MHZ|OSC_INTRC); setup_adc_ports(AN0); // Configuramos el pin AN0 como entrada analógica asociado al pin RA0 setup_adc(adc_clock_internal); // Como fuente de reloj para el ADC se utiliza el reloj interno. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); SSD1306_Begin(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS);// Inicializa la pantalla OLED SSD1306_ClearDisplay(); // Inicialmente se limpia la pantalla OLED SSD1306_Display(); while(true) // Bucle infinito. { set_adc_channel(0); // Configuramos el canal 0 como entrada analógica. delay_us(7); // Retardo de 10 us. Valor_ADC=read_adc(); // Almacenamos e valor de la conversión en la variable. float Porcentaje_ADC=Valor_ADC*100.0/1023.0;// Obtenemos el valor en porcentaje. SSD1306_ClearDisplay(); // Limpia la pantalla OLED// Imprime un texto en la parte superior de la pantalla OLED SSD1306_DrawRect(10, 12, 108, 52); // Dibuja un rectangulo en la pantalla OLED sprintf(buffer, "ADC:%0.1f", Porcentaje_ADC);// Convierte el valor entero a una cadena SSD1306_DrawText(15, 30, buffer, 2); // Imprime el valor del porcentaje ADC en la pantalla OLED sprintf(buffer, "%02d:%02d:%02d", horas, minutos, segundos); SSD1306_DrawText(20,1, buffer, 1); SSD1306_Display(); } }
 

Adjuntos

  • Nueva carpeta.rar
    88.5 KB · Visitas: 6
hola consulta, hice este programa en Arduino y funciono, ahora quiero hacerlo en pic y no logro hacer el contador con el timer 0, existe alguna librería tipo la función millis de Arduino para pic c ...[/ICODE]

En ese código t se incrementa cada 131ms no cada segundo.
Debiste escribir: setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32)
Y en la interrupción: set_timer0(3036)
O también: set_timer0(get_timer0()+3036) que es mas precisa.

De todas maneras, esto sirve (también millis() ) para temporizaciones mas o menos precisas, pero no para llevar un reloj, porque en un día vas a tener mas de 1 min de atraso/adelanto. No solo por el error acumulado en timer0 sino también por el error en frecuencia.


Para llevar un reloj es mas negocio ir incrementando las variables segundos,minutos, etc que hacer una conversión completa cada segundo.
Por ejemplo:
Código:
int8 segundos=0 ;
int8 minutos=0  ;
int8 horas=0    ;
 
#INT_TIMER0
void TIMER0_isr()
{
    set_timer0(3036);

    if(++segundos == 60){ 
        segundos = 0 ;
        if(++minutos == 60){ 
            minutos = 0 ;
            if(++horas == 24) 
                horas = 0 ;            
        }
    } 
}
 
Atrás
Arriba