Saludos Hermanos del Foro.
Les muestro este código para pasar a lo que pretendo (con su ayuda, claro) :mrgreen:Código: C#
const char LCD_buffer1[]={"\377 Disel agotado o Sensor da\356ado \377 Disel agotado o Sensor da\356ado "}; char LCD_buffer2[21]={""}; int8 posicion=0, caracter=0; void main(void) { lcd_init(); while(true) { output_high(pin_c0); delay_ms(1000); output_low(pin_c0); for(posicion=0;posicion<20;posicion++) { LCD_buffer2[posicion]=LCD_buffer1[posicion+caracter]; } lcd_gotoxy(1,4); printf(lcd_putc,"%s",LCD_buffer2); [b]delay_ms(300);[/b] caracter++; if(caracter==34) {caracter=1;} } }
Bueno pues estoy desplazando el mensaje de izquierda a derecha en una lcd4x20 y el mensaje que se desplaza es Disel agotado o Sensor dañado, hasta ahí todo bien, pues el mensaje se desplaza de manera correcta.
Lo que quiero hacer es quitar ese retardo de 300ms en la linea lcd_gotoxy(1,4); printf(lcd_putc,"%s",LCD_buffer2); delay_ms(300); y hacerlo con el timer0, ya que tengo mas lineas de código ( output_high(pin_c0); delay_ms(1000); output_low(pin_c0); son para simular otro proceso únicamente ) y con este retarlo me hace lentas mis demás tareas en el programa.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Ahora este es el código con timer0 y el pic a 20Mhz que estoy intentando pero no me resulta...
Código: C#
short msj=0; #int_timer0 // Interrupcion para 1S void timer0(void) { msj=1; set_timer0(46005);} // 46005 para que el timer sea aproximadamente de 250 ms const char LCD_buffer1[]={"\377 Disel agotado o Sensor da\356ado \377 Disel agotado o Sensor da\356ado "}; char LCD_buffer2[21]={""}; int8 posicion=0, caracter=0; void main(void) { lcd_init(); enable_interrupts(INT_TIMER0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); set_timer0(46005); enable_interrupts(GLOBAL); while(true) { output_high(pin_c0); delay_ms(1000); output_low(pin_c0); // Solo para simular otro proceso del programa if(msj==1) { for(posicion=0;posicion<20;posicion++) { LCD_buffer2[posicion]=LCD_buffer1[posicion+caracter]; } lcd_gotoxy(1,4); printf(lcd_putc,"%s",LCD_buffer2); msj=0; } caracter++; if(caracter==34) {caracter=1;} } }
Pues el resultado es que no hace nada, el mensaje con no se muestra en pantalla con el intento del timer0, me podrían orientar el hacerlo de manera correcta?
Durante el delay_ms(1000); no se atienden interrupciones.
...
Durante el delay_ms(1000); no se atienden interrupciones.
...
Durante el delay sí se atienden interrupciones, justamente el problema que tienen cuando hay interrupciones es que el retardo es mas largo y variable.
Aun así cubriendo lo que.comentas, la interrupcion no se realiza.
lo único raro que veo es que corre un poco lento, tal pareciera que ese retardo de 250 ms fueran de 2,500 ms pues el mensaje se dezplaza muy lento,
...
Como haces para que el retardo sea de ~250ms`y esa, mi duda, al parecer viene en esto #define N_ms (int8)(250/26.2144+.5)
o donde esta la parte para que sean los 250ms?.
...
void timer1(void)
{
#define N_ms (int8)(250/26.2144+.5)
static int8 caracter=0 , cont_lcd=N_ms ; // ~250ms
if(msjDiesel_habilitado)
{
if(--cont_lcd==0){ cont_lcd = N_ms ; // ~250ms
Ok ok. Entendí como esta :P.
Gracias nuevamente.
No usar interrupciones te obliga a leer el timer en cada ciclo del mainloop manteniendo un conteo. Y cada x tiempo realizar la tarea.
Eso si, prohibidos terminantemente los delays largos y tareas apropiativas.
Eduardo2 Eso es como la función millis(); en Arduino?. E escuchado que Arduino tiene una función llamada así :)
En la que puedes hacer varias cosas a distintos tiempos o algo así jejeje.
Eduardo2 Eso es como la función millis(); en Arduino?. E escuchado que Arduino tiene una función llamada así :)
En la que puedes hacer varias cosas a distintos tiempos o algo así jejeje.
// clk de 8MHz
setup_timer_2(T2_DIV_BY_4,249,2); // overflow 500us
// interrupcion 1.0ms
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
int32 cont32
#INT_TIMER2
void TIMER2_isr(void)
{
cont32++ ;
}
int32 millis(void){
disable_interrupts(INT_TIMER2);
int32 x32 = cont32 ;
enable_interrupts(INT_TIMER2);
return x32 ;
}
#INCLUDE <16F628A.H>
#use delay(internal=4MHz)
#use fast_io(all)
int32 cont32=0 ;
#INT_TIMER2
void TIMER2_isr(void)
{
cont32++ ;
}
int32 millis(void){
disable_interrupts(INT_TIMER2);
int32 x32 = cont32 ;
enable_interrupts(INT_TIMER2);
return x32 ;
}
void main(void){
int32 T0 ;
set_tris_b(0xFE) ;
setup_timer_2(T2_DIV_BY_4,249,1); //1.0 ms overflow, 1.0 ms interrupt
// setup_timer_2(T2_DIV_BY_4,249,10); //1.0 ms overflow, 10.0 ms interrupt
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
output_high(PIN_B0);
T0 = millis() ;
#define T_LED 1000
while(1){
//--------------------------------
if((millis()-T0) >= T_LED){
output_toggle(PIN_B0);
T0 = millis() ;
}
//--------------------------------
// lo que sea
}
}
while(1){
//--------------------------------
delay_ms(1000) ;
output_toggle(PIN_B0);
//--------------------------------
// lo que sea
}
}