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();
}
}