Aqui planteo mi problema:
http://miarroba.com/foros/ver.php?temaid=1821683&foroid=6510para quien no tenga ganas de linear
, el problema que tengo basicamente, es que para este proyecto necesito usar un PIC12C509A, y que el mismo no tiene interrupciones, entonces se me ocurrió hacer una lectura del TMR0 del 12C509 en el bucle principal, y cuando hice esto, no funciona directamente, no se si no logra activarse el timer o que. En un momento tenia este codigo asi, y ademas las int activadas con una funcion vacia (la que está comentada), y funcionaba, pero parece que sin prescaler, ademas, por algun motivo, no siempre tenia la misma cantidad de separacion de tiempo...por lo tanto, el led de estado titila demasiado rapido, y aveces parece que no titila, sino que enciende por el triple de tiempo (separacion muy escaza, que da esa sensacion).
Espero alguien me pueda dar una mano, muchas gracias!
Codigo:
#include <16f628.h>
#use delay(clock=4000000)
#use fast_io(B)
#define RELE1 PIN_B0
#define RELE2 PIN_B1
#define RELE3 PIN_B2
#define RELE4 PIN_B4
#define ENT PIN_B3
#define LEDEST PIN_B5
#define INT_S 15 //(4000000/(4*256*256)) = 15,2587890625
#define SECS 11
static byte segundos = 0, contador_interrupciones = 0;
static int1 pcont = FALSE, estado = FALSE, inicializando = FALSE;
/*#int_rtcc
void ciclo() {
}*/
void ejecutar_secuencia(byte secuencia) {
switch(secuencia) {
case 0:
// *Cuac* secuencia
output_low (RELE1);
output_low (RELE2);
output_high(RELE3);
output_high(RELE4);
estado = true;
output_low (LEDEST);
break;
case 1:
// Primera secuencia
output_high(RELE1);
output_high(RELE2);
output_low (RELE3);
output_low (RELE4);
estado = true;
output_low (LEDEST);
break;
case 2:
// Segunda secuencia
output_high(RELE1);
output_high(RELE2);
output_high(RELE3);
output_high(RELE4);
estado = true;
output_low (LEDEST);
break;
case 3:
// Tercer secuencia
output_low (RELE1);
output_low (RELE2);
output_low (RELE3);
output_high(RELE4);
estado = true;
output_low (LEDEST);
break;
case 4:
// Cuarta secuencia
output_high(RELE1);
output_low (RELE2);
output_high(RELE3);
output_low (RELE4);
estado = true;
output_low (LEDEST);
break;
case 5:
// Quinta secuencia
output_low (RELE1);
output_high(RELE2);
output_low (RELE3);
output_high(RELE4);
estado = true;
output_low (LEDEST);
break;
case 6:
// Sexta secuencia
output_low (RELE1);
output_low (RELE2);
output_high(RELE3);
output_low (RELE4);
estado = true;
output_low (LEDEST);
break;
case 7:
// Septima secuencia
output_low (RELE1);
output_high(RELE2);
output_low (RELE3);
output_low (RELE4);
estado = true;
output_low (LEDEST);
break;
case 8:
// Octava secuencia
output_high(RELE1);
output_low (RELE2);
output_low (RELE3);
output_low (RELE4);
estado = true;
output_low (LEDEST);
break;
case 9:
// Novena secuencia
output_high(RELE1);
output_low (RELE2);
output_low (RELE3);
output_high(RELE4);
estado = true;
output_low (LEDEST);
break;
case 10:
// Décima secuencia
output_low (RELE1);
output_high(RELE2);
output_high(RELE3);
output_low (RELE4);
estado = true;
output_low (LEDEST);
break;
case 11:
// Onceava secuencia
output_low (RELE1);
output_low (RELE2);
output_low (RELE3);
output_low (RELE4);
estado = false;
output_high(LEDEST);
break;
}
}
main() {
// Definicion de variables de entorno MAIN()
byte secuencia_actual = 0, i = 0, ultima_lectura = 0, lectura_actual = 0;
// Defino los estados de TRISA
set_tris_b(0b00001000);
// Configuro el TMR0
set_timer0 (0);
setup_counters (RTCC_INTERNAL, RTCC_DIV_256);
// Activo las interrupciones
/*enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);*/
// Rutina de inicializacion
inicializando = true;
for(i=0;i<=SECS;i++) {
ejecutar_secuencia(i);
delay_ms(1000);
}
secuencia_actual = SECS;
inicializando = false;
pcont = true;
ultima_lectura = get_rtcc();
while(true){
if (input(ENT)) {
delay_ms(100); // Evitamos rebotes
if (input(ENT)) {
if (!pcont) {
if (estado) {
secuencia_actual = SECS;
} else {
pcont = true;
secuencia_actual = 0;
}
} else {
secuencia_actual++;
if (secuencia_actual == SECS) { pcont = false; }
}
ejecutar_secuencia(secuencia_actual);
inicializando = true; // Que no nos moleste mientras la tecla esta apretada
while(input(ENT)); // Esperamos a que se suelte la tecla
delay_ms(100);
while(input(ENT)); // Evitamos rebotes
inicializando = false;
contador_interrupciones = 0;
segundos = 0;
ultima_lectura = get_rtcc();
}
} else {
lectura_actual = get_rtcc();
if (ultima_lectura > lectura_actual) { // Volcó el Buffer
contador_interrupciones++;
if (contador_interrupciones >= INT_S) {
contador_interrupciones = 0;
segundos++;
if (pcont && estado) { // Titila para indicar que esperamos nuevo comando
output_high(LEDEST);
delay_ms(100);
output_low (LEDEST);
}
if (segundos == 3) {
pcont = false;
//#asm
// SLEEP
//#endasm
}
}
}
}
}
}