Creo que empiezo a comprender las interrupciones, aunque me cuesta.
Te adjunto el código, y el esquema se me olvido ponerlo.
Como te decía, si pongo limitaciones proteus se me satura y el programa con la bombilla no me tira, si se las quito va.
La pena es que en mi casa todas las bombillas son de leds y no tengo ninguna de filamento, voy a ver si consigo una de filamento y te cuento.
Edito que me dado cuenta que el documento estaba en blanco.
No sé cómo se borra el archivo en blanco, jeje.
Bueno, pues me corrijo a mi mismo.
He vuelto a cargar el programa con las limitaciones y ahora si funciona.
Papirrin no se perderá leyendo el código pero yo me he perdido por completo.
Bueno, por completo no, es una manera de decirlo, por ejemplo µ08 no sé lo que es.
Tendrías algún problema en lo básico para poder entenderlo, ponerlo en C pero para un 876 o 877 por ejemplo.
Mi falta de comprensión estaba en que yo mezclaba 2 conceptos, y son que el timer0 es de 8 bits o lo que es lo mismo de 0 a 255 y el timer1 y timer2 es de 16, en este caso por que hablamos del PIC16F877A.
Con lo que yo hacía la fórmula mal, en vez de (255-tmr0) que es el del tmr0, ponía la del timer1(65535-tmr0) con lo que no daba una a derechas.
Te adjunto el código, y el esquema se me olvido ponerlo.
Como te decía, si pongo limitaciones proteus se me satura y el programa con la bombilla no me tira, si se las quito va.
La pena es que en mi casa todas las bombillas son de leds y no tengo ninguna de filamento, voy a ver si consigo una de filamento y te cuento.
Código:
#include <16f877A.h>
#fuses XT,NOWDT,NOBROWNOUT,NOCPD,NOLVP,NOPROTECT
#use delay(clock=4M)
#use fast_io(B)
#define TRIAC PIN_B3
#define F_MAX PIN_B1
#define F_MED PIN_B2
#include <lcd.c>
int VTO=240;
#int_RTCC
void RTCC_isr()
{
output_high(TRIAC);
delay_us(10);
output_low(TRIAC);
disable_interrupts(INT_RTCC);
}
#int_EXT
void EXT_isr()
{
set_timer0(VTO);
enable_interrupts(INT_RTCC);
}
void main()
{
set_tris_B(0x07);
output_b(0x00);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
lcd_init();
lcd_gotoxy(1,1);
lcd_putc(" Iniciando FASE ");
lcd_gotoxy(1,2);
printf(lcd_putc," FASE: %3.0u",VTO);
lcd_gotoxy(1,1);
lcd_putc(" FASE Activada ");
while (true)
{
if (input(F_MAX))
{
delay_ms(100);
VTO++;
lcd_gotoxy(1,2);
printf(lcd_putc," FASE: %3.0u",VTO);
}
if (input(F_MED))
{
delay_ms(100);
VTO--;
lcd_gotoxy(1,2);
printf(lcd_putc," FASE: %3.0u",VTO);
}
if(VTO>=240)
{
VTO=240;
}
if(VTO<=107)
{
VTO=107;
}
}
}
Edito que me dado cuenta que el documento estaba en blanco.
No sé cómo se borra el archivo en blanco, jeje.
Bueno, pues me corrijo a mi mismo.
He vuelto a cargar el programa con las limitaciones y ahora si funciona.
OKbueno aca te pongo el que uso en la maquina de humo DMX(uno esta para la bomba inductivo y el otro resistivo ., que es el calentador) tiene deteccion de temperatura tambienpar que no te pierdas con el codigo la entrada de interupcion es PD3 (INT1)
No se como andas econ ASM ., pero siqueres tengo tambien (es lo mismo ., pero solo dimer )Pero tambien al igual que el anterior ., recontra probados y sin problemas
Papirrin no se perderá leyendo el código pero yo me he perdido por completo.
Bueno, por completo no, es una manera de decirlo, por ejemplo µ08 no sé lo que es.
Tendrías algún problema en lo básico para poder entenderlo, ponerlo en C pero para un 876 o 877 por ejemplo.
Ahora empiezo a entenderlo mejor después de leerlo y releerlo.mira primero lo de la div de 64
la formula para eso es:
Temporización = (4 * (255-TMR0) * PreScaler)/Fosc
como tu frecuencia es de 50Hz el tiempo del ciclo es de 20mS, pero como gatillas a medio ciclo seria 10mS y despejando la formula seria:
TMR0=255-((tiempo*fosc)/4/64) o sea
TMR0=255-((.01*4000000)/4/64)=99
tu rango va de 99 a 255 , peroo como la onda de la frecuencia no es cudrada, el opto tarda unos microsegundos en saturar el transistor asi que puede fallar a los 99 y tendras que recorrerlo un poco como 100, 101... etc...
Mi falta de comprensión estaba en que yo mezclaba 2 conceptos, y son que el timer0 es de 8 bits o lo que es lo mismo de 0 a 255 y el timer1 y timer2 es de 16, en este caso por que hablamos del PIC16F877A.
Con lo que yo hacía la fórmula mal, en vez de (255-tmr0) que es el del tmr0, ponía la del timer1(65535-tmr0) con lo que no daba una a derechas.
Adjuntos
Última edición por un moderador: