Hola, tengo un programa que al momento de probarlo con isis proteus arroja un error en la función strtok. Conozco muy poco de debug como para averiguar que produce el error.
Estoy trabajando con el pic 16f876a, el programa lee por el puerto serial un comando como este: ITG0001|OPEN|00S00S00S00S00S00S00S00S01S00S01S00S00S00S# que luego es separado en 3 partes (tokens) usando como separador la barra |.
Pongo aqui el codigo y la simulacion en isis. Además un pantallazo del error.
#include <16F876A.h>
#include <stdlib.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT, HS
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STREAM=COM_A, parity=N, bits=8)
char p, term[2], command[66] = "", action[10] = "", values[45] = "", picid[10] = "";
char picsaved[8] = "", permited[9] = "";
short newcommand = 0;
int k = 0;
int32 seconds[14], times[14], epoch;
int contador1 = 0;
int1 newsecond=0;
// subrutina de interrupción del timer1
#int_TIMER1
void TIMER1_isr(){
disable_interrupts(INT_TIMER1);
contador1++;
if(contador1 == 1500){
newsecond = 1;
contador1 = 0;
}
set_timer1(63936);
enable_interrupts(INT_TIMER1);
}
#INT_RDA
void usart_modem(void)
{
disable_interrupts(INT_RDA);
newcommand = 0;
if (kbhit(COM_A))
{
p = fgetc(COM_A);
if(p == '#') {
command[k] = '\0';
newcommand = 1;
k = 0;
}else{
command[k] = p;
k++;
}
}
enable_interrupts(INT_RDA);
}
int is_equal(char *p1, char *p2)
{
int *p3;
p3 = strstr(p1,p2);
return (p3);
}
void open(void)
{
int i, j=0;
char numbers[3] = "", letter;
unsigned char number;
for(i = 0; i < strlen(values); i += 3){
numbers[0] = values[i];
numbers[1] = values[i+1];
numbers[2] = '\0';
letter = values[i+2];
number = atoi(numbers);
if(letter == 77) number *= 60;
seconds[j] = number;
times[j] = epoch;
j++;
}
if(seconds[0] > 0) output_bit(PIN_C0, 1);
if(seconds[1] > 0) output_bit(PIN_C1, 1);
if(seconds[2] > 0) output_bit(PIN_C2, 1);
if(seconds[3] > 0) output_bit(PIN_C3, 1);
if(seconds[4] > 0) output_bit(PIN_B7, 1);
if(seconds[5] > 0) output_bit(PIN_B6, 1);
if(seconds[6] > 0) output_bit(PIN_B5, 1);
if(seconds[7] > 0) output_bit(PIN_B4, 1);
if(seconds[8] > 0) output_bit(PIN_B3, 1);
if(seconds[9] > 0) output_bit(PIN_B2, 1);
if(seconds[10] > 0) output_bit(PIN_B1, 1);
if(seconds[11] > 0) output_bit(PIN_B0, 1);
if(seconds[12] > 0) output_bit(PIN_C5, 1);
if(seconds[13] > 0) output_bit(PIN_C4, 1);
}
void close(void)
{
if(values[0] > 0) output_bit(PIN_C0, 0);
if(values[1] > 0) output_bit(PIN_C1, 0);
if(values[2] > 0) output_bit(PIN_C2, 0);
if(values[3] > 0) output_bit(PIN_C3, 0);
if(values[4] > 0) output_bit(PIN_B7, 0);
if(values[5] > 0) output_bit(PIN_B6, 0);
if(values[6] > 0) output_bit(PIN_B5, 0);
if(values[7] > 0) output_bit(PIN_B4, 0);
if(values[8] > 0) output_bit(PIN_B3, 0);
if(values[9] > 0) output_bit(PIN_B2, 0);
if(values[10] > 0) output_bit(PIN_B1, 0);
if(values[11] > 0) output_bit(PIN_B0, 0);
if(values[12] > 0) output_bit(PIN_C5, 0);
if(values[13] > 0) output_bit(PIN_C4, 0);
}
void auto_off(void)
{
if(seconds[0] > 0 && (epoch - times[0]) > seconds[0]) output_bit(PIN_C0, 0);
if(seconds[1] > 0 && (epoch - times[1]) > seconds[1]) output_bit(PIN_C1, 0);
if(seconds[2] > 0 && (epoch - times[2]) > seconds[2]) output_bit(PIN_C2, 0);
if(seconds[3] > 0 && (epoch - times[3]) > seconds[3]) output_bit(PIN_C3, 0);
if(seconds[4] > 0 && (epoch - times[4]) > seconds[4]) output_bit(PIN_B7, 0);
if(seconds[5] > 0 && (epoch - times[5]) > seconds[5]) output_bit(PIN_B6, 0);
if(seconds[6] > 0 && (epoch - times[6]) > seconds[6]) output_bit(PIN_B5, 0);
if(seconds[7] > 0 && (epoch - times[7]) > seconds[7]) output_bit(PIN_B4, 0);
if(seconds[8] > 0 && (epoch - times[8]) > seconds[8]) output_bit(PIN_B3, 0);
if(seconds[9] > 0 && (epoch - times[9]) > seconds[9]) output_bit(PIN_B2, 0);
if(seconds[10] > 0 && (epoch - times[10]) > seconds[10]) output_bit(PIN_B1, 0);
if(seconds[11] > 0 && (epoch - times[11]) > seconds[11]) output_bit(PIN_B0, 0);
if(seconds[12] > 0 && (epoch - times[12]) > seconds[12]) output_bit(PIN_C5, 0);
if(seconds[13] > 0 && (epoch - times[13]) > seconds[13]) output_bit(PIN_C4, 0);
}
/* Programa principal */
void main(void)
{
// Activo todos los pines B como salidas
set_tris_b(0b00000000);
// Activo PIN_C4 y PIN_C7 como entradas
set_tris_c(0b10010000);
// Todos los pines B y C apagados, excepto los que son entradas
output_B(0b00000000);
output_bit(PIN_C0, 0);
output_bit(PIN_C1, 0);
output_bit(PIN_C2, 0);
output_bit(PIN_C3, 0);
output_bit(PIN_C4, 0);
output_bit(PIN_C5, 0);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(63936);
// Activo interrupciones
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER1);
epoch = 0;
strcpy(picsaved, "ITG0001");
while(TRUE)
{
if(newsecond)
{
epoch++;
auto_off();
newsecond = 0;
}
if(newcommand)
{
newcommand = 0;
strcpy(term, "|");
strcpy(picid, strtok(command, term));
strcpy(action, strtok(0, term));
strcpy(values, strtok(0, term));
if(is_equal(picid, picsaved))
{
strcpy(permited, "OPEN");
if(is_equal(permited, action))
{
open();
printf("%s opened\r\n", picid);
}
strcpy(permited, "CLOSE");
if(is_equal(permited, action))
{
close();
printf("%s closed\r\n", picid);
}
}
}
}
}