#include <16F1827.h>
#device WRITE_EEPROM = NOINT
#FUSES WDT, NOPUT, PROTECT, NOMCLR, NOCLKOUT, NOCPD, NOBROWNOUT, PLL, INTRC_IO,
#use delay(clock=32M)
#use RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1, stream=com,errors)
...
void main (void){
int temp;
...
ext_int_edge(L_TO_H);
setup_timer_0(T0_INTERNAL|T0_DIV_4);
enable_interrupts(global);
enable_interrupts(int_ext);
enable_interrupts(INT_TIMER0);
while(true){
RESTART_WDT();
if(kbhit(com)){
RESTART_WDT();
temp=recepcion_datos(); // -> -> Devuelve un entero
ejecucion(temp); // -> -> Actúa dependiendo del valor de la anterior función
}
...
}
}rx=getc(com);#include <16F1827.h>
#device WRITE_EEPROM = NOINT
#FUSES WDT, NOPUT, PROTECT, NOMCLR, NOCLKOUT, NOCPD, NOBROWNOUT, PLL, INTRC_IO,
#use delay(clock=32M)
#use RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1, stream=com,errors)
...
#int_RDA
void RDA_isr(void){
RESTART_WDT();
OUTPUT_BIT(LED2,LON);
temp[br]=getc(com);
br++;
if(br==1){
dato=temp[0];
if(dato!=0x7E){
temp[0]=0;
br=0;
recep=0;
}
}
if(br==3){
tam_tram=temp[2];
tamano=tam_tram+3;
}
if(br<tamano){recep=0;}
else if(br==tamano){recep=1;}
}
...
void main (void){
...
ext_int_edge(L_TO_H);
setup_timer_0(T0_INTERNAL|T0_DIV_4);
enable_interrupts(global);
enable_interrupts(int_ext);
enable_interrupts(int_rda); // Interrupción comunicación serial
enable_interrupts(INT_TIMER0);
while(true){
RESTART_WDT();
// VALIDACIÓN DE RECEPCIÓN
if(recep==1){
RESTART_WDT();
for(pos=0;pos<=br-1;pos++){decodificar_trama(pos,temp[pos]);}
for(pos=0;pos<=32;pos++){temp[pos]=0;}
temp2=recepcion_datos();
ejecucion(temp2);
br=0;
temp2=0;
tam_tram=0;
recep=0;
}
...
}
}
void decodificar_trama(int cn,int dato){
brr[cn]=dato;
}rx=brr[0];...
#include <16f1827.h>
#use delay (internal = 32MHz) // Fosc=32Mhz
// #use delay (internal = 4MHz) // Fosc=4Mhz, para simulación
#use RS232(UART1)
#define NO_INTERRUPCION PIN_B4
#define EXTERNO PIN_B5
int FLAG_EXT=0;
#INT_EXT
void ext_int(){
FLAG_EXT=1;
}
void main(){
int c=0;
int e=0;
enable_interrupts(int_ext);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
output_high (EXTERNO);
output_high (NO_INTERRUPCION);
delay_ms(1000);
output_low (EXTERNO);
output_low (NO_INTERRUPCION);
delay_ms(1000);
output_high (EXTERNO);
output_high (NO_INTERRUPCION);
delay_ms(1000);
output_low (EXTERNO);
output_low (NO_INTERRUPCION);
delay_ms(1000);
output_high (EXTERNO);
output_high (NO_INTERRUPCION);
delay_ms(1000);
output_low (EXTERNO);
output_low (NO_INTERRUPCION);
delay_ms(1000);
while(TRUE){
if(FLAG_EXT==1){
output_low (NO_INTERRUPCION);
FLAG_EXT=0;
switch(c){
case 0:
e=0x7E;
break;
case 1:
e=0x00;
break;
case 2:
e=0x11;
break;
case 3:
e=0x90;
break;
case 4:
e=0x00;
break;
case 5:
e=0x00;
break;
case 6:
e=0x01;
break;
case 7:
e=0x03;
break;
case 8:
e=0x0A;
break;
case 9:
e=0x02;
break;
case 10:
e=0x00;
break;
case 11:
e=0x00;
break;
case 12:
e=0xFF;
break;
case 13:
e=0xFE;
break;
case 14:
e=0x01;
break;
case 15:
e=0x01;
break;
case 16:
e=0x20;
break;
case 17:
e=0x83;
break;
case 18:
e=0x0B;
break;
case 19:
e=0x01;
break;
case 20:
e=0xB1;
break;
}
putc(e);
output_high (EXTERNO);
delay_ms(1000);
output_low (EXTERNO);
c++;
if(c>20){c=0;}
}
else if(FLAG_EXT==0)
{
output_high (NO_INTERRUPCION);
output_low (EXTERNO);
}
}
}#include <16f1827.h>
#use delay (internal = 32MHz) // Fosc=32Mhz
// #use delay (internal = 4MHz) // Fosc=4Mhz, para simulación
#use RS232(UART1)
#define RECEPCION PIN_B4
#define ERROR PIN_B5
#define ESTADO PIN_B6
/*
ESTADO
-> CONSTANTE: DISPONIBILE
-> APAGADO: OCUPADO
-> 2 INT: TAM_TRAMA
-> 3 INT: COMPLETO
*/
int temp[32]={0};
int br=0;
int recep=0;
int pos;
int tamano=0;
#int_RDA
void RDA_isr(void){
output_low (ERROR);
output_low (ESTADO);
output_high (RECEPCION);
temp[br]=getc();
br++;
if(br==1 && temp[0]!=0x7E){
output_low (RECEPCION);
output_high (ERROR);
delay_ms(1000);
output_low (ERROR);
delay_ms(1000);
output_high (ERROR);
delay_ms(1000);
output_low (ERROR);
delay_ms(1000);
br=0;
}
if(br==3){
output_high (ESTADO);
delay_ms(1000);
output_low (ESTADO);
delay_ms(1000);
output_high (ESTADO);
delay_ms(1000);
output_low (ESTADO);
delay_ms(1000);
tamano=temp[2]+3;
}
if(br==tamano){
output_high (ESTADO);
delay_ms(1000);
output_low (ESTADO);
delay_ms(1000);
output_high (ESTADO);
delay_ms(1000);
output_low (ESTADO);
delay_ms(1000);
output_high (ESTADO);
delay_ms(1000);
output_low (ESTADO);
delay_ms(1000);
for(pos=0;pos<=32;pos++){temp[pos]=0;}
br=0;
recep=1;
}
}
void main(){
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
output_high (RECEPCION);
output_high (ERROR);
output_high (ESTADO);
delay_ms(1000);
output_low (RECEPCION);
output_low (ERROR);
output_low (ESTADO);
delay_ms(1000);
output_high (RECEPCION);
output_high (ERROR);
output_high (ESTADO);
delay_ms(1000);
output_low (RECEPCION);
output_low (ERROR);
output_low (ESTADO);
delay_ms(1000);
output_high (RECEPCION);
output_high (ERROR);
output_high (ESTADO);
delay_ms(1000);
output_low (RECEPCION);
output_low (ERROR);
output_low (ESTADO);
delay_ms(1000);
while(TRUE){
if(recep==1){
recep=0;
}
else if(recep==0){
output_high (ESTADO);
output_low (ERROR);
output_low (RECEPCION);
}
}
}La verdad no probé lo del WDT, en qué podría afectar eso al funcionamiento del programa ??? No lo entiendo muy bien
Varios cambios por hacer o varios cambios realizados ??? :huh: :huh: :huh:
Ahora el siguiente reto es guardar cosas que lleguen durante la ejecución (porque solo "guarda" en este momento la última que recibe) y hacerlas todas al ir acabando lo primero que recibió
CitarAhora el siguiente reto es guardar cosas que lleguen durante la ejecución (porque solo "guarda" en este momento la última que recibe) y hacerlas todas al ir acabando lo primero que recibió
Por eso decir de poner el
for(pos=0;pos<32;pos++){func_1(pos,temp[pos]);}
dentro de la interrupcion, no creo que tome tanto tiempo como para que se pierdan datos, ya que simplemente es pasar datos de un registro a otro, depende del PIC que sea, puede llevar 2 instrucciones como minimo por cada dato, a 4Mhz a solo tardaria 64us. xD
Aca puede ocurrir que al seguir juntando cartas llegue a haber 2 pedidos enteros para vos y vos no pasate a buscarlo, pero solo tiene lugar para uno.. Vos le diras a ese cartero que debe hacer, si tirar el ultimo pedido completo, o dejar de recibir cartas, o hacerle espacio para 2 o mas.