Autor Tema: Problema al iniciarse el ciclo While principal de programa  (Leído 2747 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Problema al iniciarse el ciclo While principal de programa
« en: 23 de Octubre de 2015, 16:52:21 »
En todos los programas que hago sigo la misma pauta

//declaraciones
void main(void){
//puesta inicial
While(true){//while principal
//programa
}//while principal
}//main

En este caso trato con dos pic16f877 se comunican mediante spi este protocolo actua en los dos mediante la interrupcion #INT_EXT Estoy desorientado porque no se en cual de los esta el problema o en ambos pero todo falla cuando el While(true)//principal acaba todo su ciclo y comienza de nuevo

clear_interrupt(INT_EXT); //#INT_EXT  CamBio en RB0
enable_interrupts(int_EXT);
enable_interrupts(global);
 set_tris_b(0b00011111);
//setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

while(true){///WIL main()
#if defined(__PCM__)/////volver a renombrarlos resuelve malamente el problema Con esto tanto la interrupcion como spi inicial
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);////fallan varias veces hasta que todo buelve a funcionar a partir del sigiente ciclo
..........................
//Durante el transcurso del programa todo va bien tanto la interrupcion como la comunicacion en ambos micros es la adecuada
..............................
}///WIL main()
//Es aqui cuando empieza el problema cuando el while(true)//principal acaba su ciclo en su nuevo inicio algo me falla ya sea en //la interrupcion o spi
}//... de main

Los programas completos son lo siguientes:
MICRO_1
Código: [Seleccionar]
#if defined(__PCM__)
#include <16f877.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay(clock=4M)
#DEFINE use_portd_lcd TRUE
#include <lcd.c>
#include <stdio.h>
#use standard_io(A)               //puerto A como salida
#BYTE PORTD=0X08
#BYTE TRISD=0X88 //1000 1000
int1 ladra[5];
unsigned int8 peti,cliente,salir,nume;
int1 tarje,ser,nu;
int1 target[20];//TRUE cliente registrado
signed int32  mony; //signed int32 (-)(+)
signed int32 M32;//M32 reservado para trabajar con "union"
    union UNI {
       signed int32 dat32;
       int8 bytes[4];   };
void protSlave();
void COMBERSION(int1 Soy);
int1 MASTER;
#INT_EXT
void EXT_isr() {//función de interrupción
if(!MASTER){
output_low(PIN_C6);///S.envio  0 = pic2_B7_MASTER/E.envio
output_high(PIN_C1);//RS TRUE
int8 co;
int1 gp1,gp2,muta=0;
gp1=spi_read();
protSlave(); 
gp2=spi_read();
protSlave();
if (gp1) {////**per 1 (estado-salidas pic1)
for (co=0;5>co;co++){
ladra[co]=spi_read();   
protSlave();  }
}////**per 1
if (gp2) {////**per 2
salir=spi_read();// salir
protSlave();
cliente=spi_read();// cliente
protSlave();
target[cliente]=spi_read();// int1 targe[ ] 
protSlave();
tarje=spi_read();// int1 tarje   
protSlave();
union UNI M32;//int32 mony
   for(co=0;co<4;co++){
      M32.bytes[co] = spi_read();   
      protSlave(); }
mony=M32.dat32;
}////**per 2
peti=spi_read();// int8 peti
protSlave();
muta=spi_read();
output_high(PIN_C6);//S.envio=true -----> pic2_b7_MASTER/E.envio
if (gp1) {
if (ladra[0]) { output_high(PIN_a0); } else { output_low(PIN_a0); } delay_ms(1); //delay_ms(2);
if (ladra[1]) { output_high(PIN_a1); } else { output_low(PIN_a1); } delay_ms(1);
if (ladra[2]) { output_high(PIN_a2); } else { output_low(PIN_a2); } delay_ms(1);
if (ladra[3]) { output_high(PIN_a3); } else { output_low(PIN_a3); } delay_ms(1);
if (ladra[4]) { output_low(PIN_a4);  } else { output_high(PIN_a4);  } delay_ms(1);//neg
} else {
delay_ms(5); }
output_low(PIN_C6);
output_low(PIN_C1);//RS FIN
if (muta) { COMBERSION(1); } }
clear_interrupt(INT_EXT); 
}
unsigned int8 lee,atra,falloMF;
unsigned int16 contra[20];// contraseña////WRITE SOLO MICRO1
signed int32 saldo[20];//dinero almacenado////WRITE SOLO MICRO1
signed int32 total,acumula;
int32 presta;
int16 meses=10;
int8 decimal,vari;
float prestamo,teres=2;
void lectura();
void borratotal();
void ponsea();//escribe contraseña
void ponme();//escribe
void skri();
void recogmateria();
void reembolso(int8 cli);
void refresco(int1 muta,int1 envi);//gp1,int1 gp2);//,int1 gp4);
void tiempo(int8 espe);//
void mensaje(int8 men);
void mensa(int8 me);
void sajesal(int1 acet,int1 line);
void OPER(int8 dar);

void main(){
int8 con,nume; 
output_low(PIN_B7);
output_low(PIN_C1);//RS FIN
output_low(PIN_c2);//RW FIN
//output_low(PIN_b4);
saldo[1]=2015; saldo[5]=1400; saldo[9]=550; saldo[17]=50;
contra[1]=1111; contra[5]=2345; contra[9]=1500; contra[17]=9871;
lcd_init();//port_b_pullups(false);
COMBERSION(0);
ext_int_edge(l_to_h);//alto
clear_interrupt(INT_EXT); //#INT_EXT  ///X CamBio en RB0
enable_interrupts(int_EXT);
enable_interrupts(global);
 set_tris_b(0b00011111);
//setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
while(true){///WIL main()
#if defined(__PCM__)
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
lcd_gotoxy(13,1);
lcd_putc("PROYECTO CAJERO");
tarje=0; // recoge();
if (peti==2) {//peti=2 detecto tarjeta
//salir=acogetargeta();// return 21 = fallo F.C Acoge targeta 1 =cliente registrado 2=sinregistrar 11 = cliente saco la targeta si realizar operacion alguna
if (salir<3 && MASTER){ // recoge(); } else {//while (Input(PIN_C0)==0) { } lcd_putc("\finicia espera"); tiempo(1); }  else {
//registro();
nu=salir;//(1,0,0,0)   1 o 2 normal
borratotal();//acumula=0; total=0; lee=0; decimal=1;
mensa(1);
if (target[cliente]) {//TRUE cliente reconocido
while(nu){////whil cliente registrado
lectura(); if (lee!=0) {///se pulso buton
if (lee==10) {//ACEPTAR comprobar contraseña
if (total==contra[cliente]) { lcd_putc("\f  CORRECTO"); tiempo(3); nu=0; }
else { atra+=1; if (atra>2) { nu=0; salir=4; }  //salir=4= alarma
else { printf(lcd_putc,"\f CONTRASERÑA INCORREPTA     fallo %d",atra); borratotal();  tiempo(3);
mensa(1); } } //printf(lcd_putc,"\f ESCRIBA %lu CONTRASEÑA",contra[cliente]); } }
} else {//comprobar contraseña//NO ACEPTAR
if (lee==13) { nu=0; salir=22; } else { ponsea(); }//SALIR sospechoso
} }////se pulso buton
}////whil cliente registrado
}//cliente reconocido
else
{///cliente nuevo //salir=2                 
                     lcd_gotoxy(2,2); printf(lcd_putc,"( TarJeta %d desconocida REGISTRESE )",cliente);
                     while(salir==2){
                     lectura(); if (lee!=0) {///se pulso buton
                     if (lee==10) {//ACEPTAR comprobar contraseña
                     if (decimal==4) {//new contr adecuada
                     salir=1; mensaje(1); //mensaje + operaciones                                   
                     } else {//new contr NO adecuada
                     mensa(2); tiempo(4); mensa(1);  }                                               
                     } else {//comprobar contraseña//NO ACEPTAR
                     ponsea();
                     }
                     if (lee==13) { salir=10; }
                      }///se pulso buton
                    }///cliente nuevo
     mensaje(2);
     }
nume=1; nu=0;
while(salir==1){////wil (!salir=0)
while(lee==10) { lectura(); } //antirrebote ACEPTAR
lcd_putc("\f");
while(lee!=10 && !nu) { ///ACEPTAR OPERACIONES DE CLIENTE
lectura(); if (lee!=0 && lee!=10 && lee!=14) { nume=lee; }
if (lee==13) { salir=10; nume=10; break; }
lcd_gotoxy(1,1); printf(lcd_putc,"SELECCIONE OPERACION  %d  PULSE ACEPTAR",nume);
lcd_gotoxy(1,2); if (nume>3)  { lcd_putc("4 prestamo 5 traspaso 6 cuenta fija"); } else { lcd_putc("1 consulta saldo 2 Sacar 3 ingresar"); } //35carat
} while(lee==10) { lectura(); } //(antirrebote)ACEPTAR OPERACIONES DE CLIENTE
   borratotal();  nu=0; mony=0;
   lcd_putc("\f");  //lcd_gotoxy(1,1);
   switch (nume){ //swit 1
   case 1: /// consulta saldo
   do{// && lee!=13) { 
   lcd_gotoxy(8,1); printf(lcd_putc,"Cliente %d Su saldo es de %ld "cliente,saldo[cliente]); lcd_gotoxy(1,2);
    lcd_putc("ACEPTAR/MENU cualkier otra tecla paSALIR");  lectura(); if (lee>0) { if (lee!=10 && lee!=14) { salir=10; break; } }
         } while(lee!=10 && lee!=14);  //nume=10; lee=0; //lee=0;...no meterse..................
  break;
  case 2:
  OPER(10);//sacar pasta
   if (lee<13) {
   mensaje(11);
//tarje=0; //peti=10 mony>0 ladra[1] output_high(PIN_a1);//tarje=1 ladra[4]neg s suelta dinero  tarje=1 output_low(PIN_a4);// s suelta tarjeta
recogmateria(); }//OJO recogmateria(); trata solo a (tarje || (mony y saldo[cliente]))
   break;
    case 3://meter pasta
    OPER(12);
     if (lee<13) { saldo[cliente]=saldo[cliente]+total; nu=1; nume=1;  } //if (salir==1) //todo fue normal
        break;
   case 4://prestamo
   total=meses;  OPER(13);
   total=teres; OPER(14);//interes mensual
   total=presta; OPER(15);
   OPER(16);   //salir=2 micro2 sabra k se trata de un prestamo
   if (lee<13) { salir=2; recogmateria(); salir=1; } //if (salir==1) //todo fue normal
    break;
     default :   
   if (salir<3) { printf(lcd_putc,"\fERROR NO EXISTE OPERACION %d",nume); tiempo(6); }
   break; }//swit 1
if (salir==10 || salir==12) { mensa(salir); tiempo(8); } //lcd_putc("\f  ASTA OTRA");  }
}//while salir=1 operaciones cliente registrado//////*/
switch (salir){//swit 2
case 4:  //case 4://alarma contraseña cliente incorrepta
peti=4; refresco(1,0); //delay_ms(5000);///fuera
output_high(PIN_a2);///s Traga Targeta
output_high(PIN_b7);
for (con=0;6>con;con++){
mensa(4);
mensa(5);
 }//alarma
break;////4
case 10 || 12://operacion de retiro tarjeta
lcd_putc("\fRetire su tarjeta");
tarje=1; recogmateria(); //fin master 
break;
case 22://sospecoso no introdujo contraseña
 peti=22;
 lcd_putc("\fAnulo introducir contraseña (sospechoso)");// tiempo(3);
 refresco(1,0);//lcd_gotoxy(1,2);//recoge(); recoge(); recoge();// COMBERSION(1);//fin master
break;
case 41:
peti=11;
refresco(1,0);//recoge(); recoge();//fin master 
break;
}//swit 2 //acionSalida();
 do{ 
if (MASTER){
peti=101; salir=0;
tiempo(2); refresco(1,0); break; }
 }while(1);
clear_interrupt(INT_EXT);
lcd_putc("\f");
}//se introdujo tarjeta
}//se detecto targeta//
}//WIL main()
}
///////////////////////////FUNCIONES/////////////////////////////////////////////FUNCIONES/////////////////////////////////////////////FUNCIONES//////////////////

void tiempo(int8 espe){  for(nume=0;espe>nume;nume++) { delay_ms(400); } }
void mensaje(int8 men){
lcd_gotoxy(1,1);
switch (men){
case 2:
contra[cliente]=total; target[cliente]=1;
printf(lcd_putc,"\fREGISTRO CORRECTO como Cliente numer %d"cliente); lcd_gotoxy(1,2);
printf(lcd_putc,"Guarde su contraseña %lu",contra[cliente]);  tiempo(15); //lee=0;
sajesal(1,0); break;////*/
case 10:
printf(lcd_putc,"IMPORTE A SACAR %lu.00 EUROS      ",total);  lcd_gotoxy(1,2);
printf(lcd_putc,"Su saldo actual es de %ld.00 Euros",saldo[cliente]);
mony=total; break;
case 11:
saldo[cliente]=saldo[cliente]-mony;
printf(lcd_putc,"\fRETIRE SUS %ld.00 EUROS",mony);  lcd_gotoxy(1,2);//OJO recogmateria(); trata solo a mony y saldo[cliente]
printf(lcd_putc,"Su saldo ahora es de %ld.00 Euros",saldo[cliente]); break;///*/
case 12:
lcd_putc("HAORA ERES EL CAJERO Escrive el total a");  lcd_gotoxy(1,2);
printf(lcd_putc,"ingresar %lu.00 Euros en cuenta %d",total,cliente); break;
case 13:///PRESTAMO.....
lcd_putc("ERES EL CAJERO cuanto dura el prestamo");  lcd_gotoxy(14,2);
printf(lcd_putc,"%lu meses       ",total);  meses=total; 
if (total==1) { lcd_gotoxy(19,2); lcd_putc("  "); } break; ///meses
case 14:
lcd_putc("ERES CAJERO cual es interes mensual   ");  lcd_gotoxy(14,2);
printf(lcd_putc,"%lu/100      ",total);  teres=total;  break;//interes mensual float
case 15:
lcd_putc("ERES EL CLIENTE cuanto quieres de");  lcd_gotoxy(10,2);
printf(lcd_putc,"prestamo %lu.00 Euros              ",total);  presta=total;  break;//prestamo
case 16:///.....PRESTAMO
prestamo=presta+(((presta*teres)/100)*meses); vari=teres;
printf(lcd_putc,"ACEPTA? %Lu Euros a %d/100 interesXmes",presta,vari);  lcd_gotoxy(1,2);
printf(lcd_putc,"dentro de %lu meses nos debera %f Euros        ",meses,prestamo); break;//futuro pago float
} }
void OPER(int8 dar){
if (lee<13) { //13 salir 14 menu (pasar de todo)
lee=0; ser=0; do{
mensaje(dar);//mensaje + operaciones
skri(); if (lee>12) {  break; }//lee=13 SALIR   14 MENU
if (total==0 && lee==10) { lcd_gotoxy(8,2); lcd_putc("NO ES POSIBLE operar con CERO"); lee=0; tiempo(5); lcd_putc("\f");  }
} while(lee!=10); //if (lee<13) { borratotal(); }
while(lee==10) { if (lee>12) {  break; } else { lectura(); } }//anti-rebote
} }
void skri(){ delay_ms(400); lectura();  if (lee!=0) { if (lee==13) {  salir=12; } else { ponme(); } } }
void ponme(){
if (lee!=10) { //buton ACEPTAR y MENU PRINCIPAL(14) no son validos
if (lee==11){  lee=0; }////11 = 0
if (lee==13) { salir=12; } //salir sin elegir ninguna operacion
if (lee==14) { nu=0; } //volver a menu No operar nada
if (lee==12) { borratotal(); } ///BORRAR
else { ser=1; total=acumula+lee; acumula=total*10; }//lo normal
}  }
void mensa(int8 me){
lcd_gotoxy(1,1);
switch (me){
case 0:
lcd_putc("\fERROR EL PRIMER DIGITO NO PUEDE SER CERO");  borratotal();
break;
case 1:
printf(lcd_putc,"\f ESCRIBA %ld CONTRASEÑA",contra[cliente]);
break;
case 2:
lcd_putc("\fERROR CONTRASEÑA A DE SER DE 4 DIGITOS"); borratotal(); tiempo(4); //ponsea();// dela
break;
case 4:
output_high(PIN_b7); lcd_putc("\f           alarma"); tiempo(1);///s Alarma
break;
case 5:
output_low(PIN_b7); lcd_putc("\f CAJERO TRAGA TARJETA CREDITO"); tiempo(1);
break;
case 10:
lcd_putc("\f  ASTA OTRA");
break;
case 12:
 printf(lcd_putc,"\fcancelo operacion %d",nume);
break;
} }
void sajesal(int1 acet,int1 line){
lee=0; if (!line) {  lcd_gotoxy(1,1); } else {  lcd_gotoxy(1,2); }
if (acet) { lcd_putc("    -PULSA ACEPTAR PARA SEGIR-      "); do{ delay_ms(400); lectura(); }while(lee!=10); }
else {      lcd_putc(" -PULSA CUALKIER BOTON PARA SALIR-  "); do{ delay_ms(400); lectura(); }while(lee!=0); }
}

void borratotal() { acumula=0; total=0; lee=0; decimal=0; ser=0; }

void ponsea(){
//if (lee==13) { salir=22; break; }//salir sospechoso
int8 co;
if (lee==11) { ser=1; lee=0; }////11 = 0
total=acumula+lee;//numer;
acumula=total*10;
mensa(1); //printf(lcd_putc,"\f ESCRIBA %lu CONTRASEÑA",contra[cliente]);
if (total>0){
if (lee>11){ borratotal(); } ///BORRAR//printf(lcd_putc,"\f ESCRIBA %lu CONTRASEÑA",contra[cliente]);
else {
decimal++; ser=1;
lcd_gotoxy(28,1);
if (decimal>1) {
for (co=1;decimal>co;co++) {
printf(lcd_putc,"* "); } }
printf(lcd_putc,"%d",lee); 
if (decimal>4) { mensa(2); tiempo(4); mensa(1);  }//digitos
}  }
if (ser && total<1) { mensa(0); tiempo(4); mensa(1); } //no al cero
delay_ms(600);
}

void recogmateria(){
peti=10; salir=0;
//COMBERSION(1);
refresco(1,1); //COMBERSION(0);
do{
//switch (peti){
if (salir>30) { // printf(lcd_putc,"\fEnvio mensaje a movil Cliente %d",cliente);
lcd_gotoxy(8,2);
switch (salir){
case 40:
peti=101; lcd_putc("Olvido TARJETA");  break;
case 41:
lcd_putc("Olvido DINERO"); break;
}
} //////*/
}while(!MASTER);

}
void COMBERSION(int1 Soy){
if (Soy){
MASTER=1; set_tris_c(208); delay_ms(2);// 1101 0000 /// "C5_S C4_E C3_S  01 0"
setup_spi(spi_master | spi_l_to_h | spi_clk_div_16); delay_ms(2);//| SPI_XMIT_L_TO_H); //);// | SPI_XMIT_L_TO_H); 
output_high(PIN_c7);
} else {
MASTER=0; set_tris_c(240);  delay_ms(2); // 1111 0000 /// "C5_E C4_E C3_S  11 0"
setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16); delay_ms(2);//| SPI_XMIT_L_TO_H); //);// | SPI_XMIT_L_TO_H); 
output_low(PIN_c7);
}
}
void lectura(){

lee=Input_B();
if (Input(PIN_b4)) { lee-=15;}
}//return leer;
void reembolso(int8 cli){
saldo[cli]=saldo[cli]+mony;
printf(lcd_putc,"\fReemvolso de %lu Euros",mony);
lcd_gotoxy(1,2);
if (target[cli]) { printf(lcd_putc,"Ciente numero %d",cli); }
else { printf(lcd_putc,"En cuenta %d NO REGISTRADA",cli); } //mony=0;
}//reembolso dinero a cliente
////////////////////////funciones NEW////////////////////////funciones NEW////////////////////////funciones NEW
void protMaster() {/// protocolo de envio vajo SPI MAESTRO
atra=0;
output_high(PIN_c6); // s.envio=true afecta PIN_B7_SLAVE/E.envio
delay_ms(4);//4
while (Input(PIN_c0)==0) { delay_ms(1);  //Impide + envios asta SLAVE lo diga con su S.pin_a0_(S.recivido) -----> E.pin_c0_MASTER(E.recivido)
if (atra>15) { falloMF++; lcd_gotoxy(33,2);   printf(lcd_putc,"MF %d",falloMF);   break; } atra++; }
output_low(PIN_c6); // s.envio=false afecta PIN_B7_SLAVE/E.envio
delay_ms(4);//4
}
///Hay un jaleo en la combersion pic1-master--->pic2-slave CONCEPTO RECIVIDO es ENVIO  ENVIO es RECIVIDO
void protSlave(){///protocolo de recivo vajo SPI pic2SLAVE
atra=0;
output_high(PIN_C6);//S.envio=true -----> pic2_b7_MASTER/E.envio
delay_ms(7); ///valido (8)
output_low(PIN_C6);
delay_ms(7);
}
///////////////REFRESCO///////////////REFRESCO///////////////REFRESCO///////////////REFRESCO///////////////REFRESCO
void refresco(int1 muta,int1 envi){//,int1 gp3){//,int1 gp4){//,int1 gp5){
int8 co;
falloMF=0;
output_low(PIN_c6);//S.envio incial 0
output_high(PIN_C2);//RW TRUE
spi_write(envi);   
protMaster();
if (envi) {
spi_write(salir); /// int8 salir
protMaster();
spi_write(tarje); /// int1 tarje
protMaster();
//target[cliente]
spi_write(target[cliente]); /// int1 target[cliente]
protMaster();
union UNI M32;//int32 mony
M32.dat32 =mony;
     for(co=0;co<4;co++) {
      spi_write(M32.bytes[co]);
      protMaster();  }
}
spi_write(peti); /// int8 peti
protMaster();
spi_write(muta);//
protMaster();
output_low(PIN_c2);//RW FIN
if (muta) { COMBERSION(0); }
//delay_ms(70);
}

La unica manera de evitar el error que se es utilizando reset_cpu(); Pero se supone que hay datos cuya definicion adecuada es realmente variable que creo que deberia guardar mediante write_eprom
¿Alguna idea?

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #1 en: 23 de Octubre de 2015, 16:59:35 »
Disculpar por lo del espacio pero no e sabido reducirlo mas con funciones
MICRO_2
Código: [Seleccionar]
#if defined(__PCM__)
#include <16f877.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay(clock=4M)
#DEFINE use_portd_lcd TRUE
#include <lcd.c>
#include <stdio.h>
#use standard_io(A)               //puerto A como salida
#BYTE PORTB=0x06
#BYTE TRISB=0XFF
#BYTE PORTD=0X08
#BYTE TRISD=0X88 //1000 1000
unsigned int8 peti,cliente,salir;
int1 tarje;
signed int32  mony; //int32 (-)(+)
///* grupo 4 INT16_INT32
int1 target[20];//TRUE cliente registrado
signed int32 M32;//F32 M32 reservado para trabajar con "union"
    union UNI {
       signed int32 dat32;
       int8 bytes[4];
    };
void protSlave();
void COMBERSION(int1 soy);//master-->slave  slave--->master
int1 MASTER; 
//int8 falloSF;
#INT_EXT
void EXT_isr() {//función de interrupción
if (!MASTER){
output_low(PIN_a0);///inicial  0 = pin_c0_MASTER/E.recivido///original
output_high(PIN_A2);//RS TRUE
int8 co;//,v8,v16;//,cu=2;
int1 gr,muta=0;
gr=spi_read();////**per 0
protSlave(); 
if (gr) {
salir=spi_read();// *salir
protSlave();
tarje=spi_read();// tarje
protSlave();
target[cliente]=spi_read();
protSlave();     
union UNI M32;//int32 mony
   for(co=0;co<4;co++){ 
      M32.bytes[co] = spi_read(); 
      protSlave(); }
mony=M32.dat32;
}
//siempre
peti=spi_read();// peti
protSlave();
muta=spi_read();
output_high(PIN_a0);//S.recivido=true -----> pin_c0_MASTER/E.recivido
delay_ms(5);
output_low(PIN_a0);
//delay_ms(7);
output_low(PIN_a2);// delay_ms(2);//RS FIN
if (muta) { COMBERSION(1); }
} else {  lcd_gotoxy(30,2); lcd_putc("ERROR int_ext"); delay_ms(250); }
clear_interrupt(INT_EXT);
}

int1 ok1,ok2,ok3;
///* grupo 1
int1 fclee[5];//posicion a verificar
int1 fcpos[5];//posicion dada

int1 ladra[5];



void resesalidas();
int acogetargeta();
//int recogermaterial(int1 targ,long pasta);
void descargo();
void FCfalse();//Pide que todo F.C 1 - 2 -3 sea FALSE
//Se pregunta por el final de carrera 1=dinero pb6 2=targetaFuera pb5 3=targetaDentro pb4
int1 FC(int final);//devuelve 1=TRUE 0=FALSE
void esigeFC(); //Atrapado en WILL asta que se cumpla verdadero todo lo esigido en variables fclee[x]; fcpos[x];
void pide(int fin,int1 posi,int1 acu,int li);//.......................................................................Colavora con "esigeFC();"
void fallo1();
void protMaster();
//void refresco(int1 gp1,int1 gp2,int1 gp3,int1 gp4);
void leeclient();
void refresco(int1 muta,int1 gp1,int1 gp2);//,int1 gp3);
int8 atra,falloMF;//atra se utiliza para comprovar error de encerrado en bucles while
//void resefclee();//......**
void registro(int le);
void resepos();
void posini();
void texOlvido();//influye tarje mony
int8 con;//,cont,conta;
void main(){

lcd_init();
//kbd_init();
port_b_pullups(false);


target[1]=1; target[5]=1; target[9]=1; target[17]=1;
fclee[0]=1; fclee[1]=1; fclee[2]=1; fclee[3]=1; fclee[4]=1; resepos();
peti=1;
COMBERSION(1); //delay_ms(80);

ext_int_edge(l_to_h);//alto
clear_interrupt(INT_EXT);
enable_interrupts(int_EXT);
enable_interrupts(global);
 set_tris_b(0b11111111);
while(TRUE) {///WIL main()
#if defined(__PCM__)
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
if (MASTER){//micro2 es master
resesalidas(); ok1=0; ok2=0; ok3=0; delay_ms(3);// fclee[0]=1;
switch (peti){//swit peti master
case 1:
//COMBERSION(1);
leeclient();
resepos();
 fallo1();
fcpos[0]=1;
esigeFC();
if (Input(PIN_c0)) { peti=2; ladra[0]=1;  refresco(0,1,0); } //else { refresco(0,0,0,0); }//pasarle peti=2 a pic1///1
break;//1
case 2:
peti=2;
salir=acogetargeta();// return 21 = fallo F.C Acoge targeta 1 =cliente registrado 2=sinregistrar 11 = cliente saco la targeta sin realizar operacion alguna
//fclee[0]=1;
ladra[0]=0;
if (salir==21) { ladra[4]=1; }
refresco(0,1,0);
if (salir<3) { esigeFC(); refresco(1,0,1); registro(cliente); } //else { refresco(0,1,1);  }////2//3 normal salir=1 o 2

if (salir==11) {//Cliente metio y retiro tarje sin operacion alguna
  peti=1;  lcd_putc("\fRETIRO TARJETA DE CREDITO");  delay_ms(2000);  lcd_putc("\f   ASTA OTRA");  refresco(0,0,0);
  delay_ms(2000);  }//3retiro

if (salir==21){ lcd_putc("\fERROR FALLO MECANISMO VUELVA OTRO DIA"); lcd_gotoxy(1,2); lcd_putc("RETIRE SU TARGETA "); 
  peti=1; delay_ms(2000); 
 lcd_putc("\fAVERIA F.C 2 CAJERO NO CONSIGIO INTRODUCIR"); lcd_gotoxy(1,2); lcd_putc("LA TARJETA DE CREDITO"); delay_ms(2000);
  ladra[4]=0;
   refresco(0,0,1);
   delay_ms(2000); //3averia

}
peti=0;
break;//2
case 3://3
//printf(lcd_putc,"\fCliente=%d registro=%x",cliente,target[cliente]); peti=0; delay_ms(2000); refresco(1,0,0,0);
break;//3

case 10:///micro1 recogermaterial
//fclee[0]=1; fclee[1]=1; fclee[2]=1; fclee[3]=1; fclee[4]=1;
//resepos();
resepos(); 
fcpos[1]=1;
if (tarje==1) { fcpos[0]=1; fcpos[1]=0; ladra[4]=1; }// FC TARJE FUERA & s.suelta tarjeta
if (mony>0) { fcpos[2]=1; ladra[1]=1; if (salir==2) { ok3=1; } }//solo recoger dinero FUERA & s.suelta dinero (salir=2) se trata de un prestamo
//esigeFC();
refresco(0,1,0);//marcha ladra[1]=1; || ladra[4]=1;
//delay_ms(10); //lcd_gotoxy(1,2); printf(lcd_putc,"s[0]=%d [1]=%d [2]=%d [3]=%d [4]=%d",ladra[0],ladra[1],ladra[2],ladra[3],ladra[4]); delay_ms(5000);
//sin delay no se comunica ladra[x] a micro1
esigeFC();
ladra[1]=0; ladra[4]=0;
refresco(0,1,0);//parada marcha ladra[1]=0; || ladra[4]=0;
descargo(); //traga tarje ladra[2]=1 & fcpos[4]=0;  traga pasta ladra[3]=1 &fcpos[3]=0 "SI olvido"
//peti=10 normal 30 olvido tarje 50 mony 70 todo//tarje=0; mony=0; peti=10 todo recogido (peti=51 se trataba de un prestamo -no reembolso en micro1-)
//descargo finaliza con ladra[4]=0; ladra[1]=0; siempre
 //Si era prestamo no abra reembolso
refresco(0,1,0);//dato peti + activacion de ladra[3] || ladra[2] "SI olvido"
 //if mony>0 micro1 reembolso(cliente);//le mete mony

if (ok1==1) { lcd_putc("\f-OK eso es-  Recogiste la tarJeta"); delay_ms(3000); }
if (ok2==1) {  lcd_putc("\f-OK eso es- Recogiste la pasta"); delay_ms(3000); }
esigeFC();
salir=1;
//peti=1;
if (peti>15) { texOlvido(); esigeFC(); }///  fcpos[0]=0;//tarj fuera    fcpos[2]=0;//mony fuera
if (tarje==1) { fcpos[4]=1; ladra[2]=0; tarje=0; salir=40;  } //stop trago tarje
if (mony>0) { fcpos[3]=1; ladra[3]=0; mony=0;  salir=41; } //stop trago dinero (luego tarjeta)
refresco(0,1,1);
esigeFC();//Se trago todo el cajero? ¿ fcpos[4]=1;  fcpos[3]=1; ?
//if (!ook[0]) { lcd_putc("Cajero se queda con tarjeta"); }
/*if (salir>30) {  printf(lcd_putc,"\fEnvio mensaje a movil Cliente %d",cliente); lcd_gotoxy(8,2);
switch (salir){
case 40:
peti=100; lcd_putc("Olvido TARJETA");  break;
case 41:
lcd_putc("Olvido DINERO"); break; }  delay_ms(5000);
}  ///*/ 
refresco(1,1,1);//salir=1;normal  salir=40"olvido"enviale a micro uno desconectar traga tarjeta ladra[2]=0; traga dinero ladra[3]=0; y dale MASTER
peti=0;
//lcd_gotoxy(1,2); printf(lcd_putc,"\fPETI = %d salir = %d (DESCARGO)",peti,salir); delay_ms(3000);  //,cliente); lcd_gotoxy(1,2);
break;
case 11://Si cliente olvido Dinero se keda con la tarjeta introducida
resepos(); 
fcpos[1]=1;
esigeFC();
ladra[2]=1;
refresco(0,1,1);
fcpos[1]=0;
esigeFC();
fcpos[4]=1;
esigeFC();
ladra[2]=0;
refresco(1,1,1);
peti=0;

case 22://sospechoso salir sin introducir contraseña
resepos(); 
//resook();
fcpos[1]=1;
//lcd_putc("\fAnulo introducir contraseña (sospechoso)");
ladra[2]=1; refresco(0,1,0); //delay_ms(1000);
esigeFC(); fcpos[1]=0; esigeFC(); fcpos[4]=1; esigeFC(); ladra[2]=0; refresco(0,1,0);
lcd_gotoxy(1,2); lcd_putc("CAJERO TRAGO TARJETA"); delay_ms(100); refresco(1,0,0);
peti=0;
break;
case 101:
FCfalse();//los 3 principales
delay_ms(100);
esigeFC();
resepos();
refresco(0,1,0);//toda salida a 0//resepos();
clear_interrupt(INT_EXT);
peti=1;//vuelta a Empezar
break;
default:
lcd_gotoxy(1,1); printf(lcd_putc,"NO ES VALIDA la operacion peti= %d",peti);     
lcd_gotoxy(1,2); lcd_putc,("ESTO NO DEBE OCURRIR"); lcd_gotoxy(1,2);
delay_ms(7000);  reset_cpu();

}//swit peti master
} else { //micro2 es SLAVE
//switch (peti){
//case 10: 
if (peti!=0){
lcd_putc("\fALGO FALLO micro2 SLAVE");
lcd_gotoxy(1,2); printf(lcd_putc,"NO ES VAILO peti= %d",peti); delay_ms(700); }
else {//SLAVE peti=0 micro2 a la espera de MASTER
//lcd_putc("\f    micro2 SLAVE inactivo");
lcd_gotoxy(1,2); printf(lcd_putc,"peti= %d salir= %d tarje= %d mony= %lu",peti,salir,tarje,mony);
//recoge();//Tiene k pasar a MASTER para salir de aki
//printf(lcd_putc,"PETI= %d SALIR= %d TARJE= %d MONY= %lu",peti,salir,tarje,mony);
//delay_ms(400);
}
}

}///WIL main()
}
//////////////////////////FUNCIONES//////////////////////////FUNCIONES//////////////////////////FUNCIONES//////////////////////////FUNCIONES
//////////////////////////FUNCIONES//////////////////////////FUNCIONES//////////////////////////FUNCIONES//////////////////////////FUNCIONES
//////////////////////////FUNCIONES//////////////////////////FUNCIONES//////////////////////////FUNCIONES
void COMBERSION(int1 soy){
if (soy){
MASTER=1; set_tris_c(215); //delay_ms(2);// 1101 0111 "C5_S C4_E C3_S  01 0"
setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);  //delay_ms(4);//| SPI_XMIT_L_TO_H); //);// | SPI_XMIT_L_TO_H); 
output_high(PIN_a1);
} else {
MASTER=0; set_tris_c(223); //delay_ms(2);///1101 1111 "C5_S C4_E C3_E 00 1"
setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16); //delay_ms(2);//| SPI_XMIT_L_TO_H); //);// | SPI_XMIT_L_TO_H); 
output_low(PIN_a1);
}
delay_ms(4); 
}
void registro(int le) {
if (target[le]==1){
printf(lcd_putc,"\f cliente numero %d reconocido",le);
} else {
printf(lcd_putc,"\f nuevo cliente %d REGISTRESE",le); lcd_gotoxy(1,2); lcd_putc("INTRODUCE UNA CONTRASEÑA DE 4 DIGITOS");  delay_ms(3000);  }
//
}
void resetsalidas(){
for (con=0;5>con;con++){
ladra[con]=0; }
}
void resepos(){
for (con=0;5>con;con++){ fcpos[con]=0; }
}
int acogetargeta(){
int co,con=16;
//if (!fcpos[1]){// && !fcpos[0]==1) {///Si  F.C(1)=1  &&  NO F.C = 1 ....pasar de todo
lcd_putc("\f");
// cliente=201;//no existe
for (co=0;con>co;co++){
if (co>con-3){ fcpos[0]=1;
resetsalidas(); ladra[4]=1;
 return 21;}//fallo final de carrera F.C[1] b5_FALSE no paso a TRUE

if (Input(PIN_c1)){ lcd_putc("\f-OK eso es- Final de carrera detecto que"); lcd_gotoxy(1,2); lcd_putc("targeta ya esta dentro del cajero F.C 2 =TRUE");
// delay_ms(1000); //port_B
 co=con+10;  leeclient(); fcpos[0]=0; fcpos[1]=1; if (target[cliente]==1) { return 1; } else { return 2; } }////target dentro correcto
printf(lcd_putc,"\fSE DETECTO TARGETA (espera %d)",co); lcd_gotoxy(1,2); lcd_putc("ESPERANDO F.C 2 Acoge targeta = TRUE "); 


if (!Input(PIN_c0)) {  resepos(); resetsalidas(); return 11; } //!Input(PIN_b4) + rapido pero = !FC(0)
delay_ms(800);
}////for
//}///Si  F.C(1)=1  &&  NO F.C = 1 ....pasar de todo
}
void descargo(){
//E F.C[0]=tarjetFUERA_B4  [1]=tarjetDENTRO_B5 [2]=dineroSUELTO_B6 [4]=TRAGAdinero_C6 [3]=TRAGAtarjeta_C7   esigeFC()
//S B7_Alarma  A0_Acoge tarjeta  A1_Suelta dinero A2_Traga targeta A3_Traga dinero A4_Suelta Targeta[L.G.N]
int co;//,con=40;
//ladra[3] traga pasta ladra[2] traga targeta "olvido" peti=10 normal 30 olvido tarje 50 mony 70 todo
for (co=0;25>co;co++){
lcd_putc("\f");
lcd_gotoxy(1,1);
///TARGETA
if (tarje==1){ //!F.C[0] = !Input(PIN_b4)mas rapido b4
if(!Input(PIN_C0)){ ok1=1; break;  }
else { lcd_putc("ESPERANDO F.C 1 Detecta Tarjeta = FALSE"); }
}////TARGETA
if (mony>0){
if (Input(PIN_c2)) { lcd_putc("ESPERANDO F.C 3 Dinero Sueto = FALSE"); }
else { ok2=1; break;  }
} ////PASTA
delay_ms(400); }//for
peti=10;
resetsalidas();//ladra[4]=0; ladra[1]=0;
if(tarje==1 && Input(PIN_C0)){ peti+=20; fcpos[4]=0; ladra[2]=1; } else { tarje=0; fcpos[0]=0; }// x tarje
if(mony>0 && Input(PIN_C2)) { if (ok3) { peti+=41; } else { peti+=40; } fcpos[3]=0; ladra[3]=1; } else { mony=0; fcpos[2]=0; }/// x mony
}



void texOlvido(){ ///222
lcd_putc("\fASPIRO EL TIEMPO DE RECOGIDA"); lcd_gotoxy(8,2); lcd_putc("DE MATERIAL"); delay_ms(5000);
if (tarje==1){
lcd_putc("\fNo retiro su targeta supuesto OLVIDO"); lcd_gotoxy(3,2);
lcd_putc("CAJERO TRAGA TARGETA"); delay_ms(5000); fcpos[0]=0;//tarj fuera NO
}
if (mony>0) {
lcd_putc("\fNo retiro su dinero supuesto OLVIDO"); lcd_gotoxy(1,2);
printf(lcd_putc,"CAJERO TRAGA PASTA (reembolso %ld)",mony);
delay_ms(5000); fcpos[2]=0;//pasta fuera NO

}
}
//fcpos[0]=0;//tarj fuera
void posini(){
if(!Input(PIN_C0)){ fcpos[0]=0; } else { fcpos[0]=1; }
if(!Input(PIN_C1)){ fcpos[1]=0; } else { fcpos[1]=1; }
if(!Input(PIN_C2)){ fcpos[2]=0; } else { fcpos[2]=1; }
if(!Input(PIN_C6)){ fcpos[3]=0; } else { fcpos[3]=1; }
if(!Input(PIN_C7)){ fcpos[4]=0; } else { fcpos[4]=1; }
}
void FCfalse(){///No se sale d aki asta k los F.C 1-2-3 esten a  FALSE
while(Input(PIN_c0) || Input(PIN_c1) || Input(PIN_c3)) {
if (!Input(PIN_c2)) { lcd_gotoxy(1,1); lcd_putc("OK correpto"); lcd_gotoxy(14,1); } else {  lcd_gotoxy(1,1); lcd_putc("F.C dinero pide FALSE");
if (!Input(PIN_c1)) { lcd_gotoxy(28,1); } else { lcd_gotoxy(18,1); }
}
if (!Input(PIN_c1)) { if (!Input(PIN_c2)) { lcd_gotoxy(24,1); } lcd_putc("OK correpto"); } else { lcd_putc("F.C AcogeTarjeta pide FALSE"); }
lcd_gotoxy(1,2);
if (!Input(PIN_c0)) { lcd_putc("OK correpto"); } else { lcd_putc("F.C Detecta targeta pide FALSE"); }
delay_ms(500);
lcd_putc("\f");
}
//fces[0]=0; fces[1]=0; fces[2]=0;
}


void fallo1(){
if (Input(PIN_c2)) { //si es false pasa de todo
int1 h=0;
int co;//con=50;
for (co=0;30>co;co++){//for
if (!Input(PIN_c2)) { h=1; lcd_gotoxy(1,1); printf(lcd_putc,"\f OK Eso es (%d)",co); } else { //true pb6
if (h==0) { lcd_gotoxy(1,1); lcd_putc("F.C dinero suelto TRUE? CAJERO"); lcd_gotoxy(1,2); lcd_putc("INNOPERABLE NO REGALAMOS DINERO"); } 
else { co=20; lcd_gotoxy(1,1); lcd_putc(" EXCELENTE Volvamos a empezar de nuevo"); lcd_gotoxy(1,2); lcd_putc("Pon F.C dinero suelto = FALSE  CAPUYO"); } }
delay_ms(200);
}//for
} }
//Se pregunta por el final de carrera 1=dinero pb6 2=targetaFuera pb5 3=targetaDentro pb4
int FC(int final){//devuelve 1=F.C TRUE 0=F.C FALSO
//fcpos[0]=tarjetFUERA_B4  [1]=tarjetDENTRO_B5 [2]=dineroSUELTO_B6 [4]=TRAGAdinero_C6 [3]=TRAGAtarjeta_C7   esigeFC()
switch (final){
case 0: //F.C DETECTA TARGETA ( FUERA )
 if (Input(PIN_c0)) { return 1; } else {  return 0; }
case 1: //F.C ACOGE TARGETA ( DENTRO )
 if (Input(PIN_c1)) { return 1; } else { return 0; }
case 2: //F.C DINERO SUELTO
if (Input(PIN_c2)) { return 1; } else { return 0; }
case 3: //F.C TRAGA DINERO 
 if (Input(PIN_c6)) {  return 1; } else {  return 0; }
case 4: //F.C TRAGA TARGETA
 if (Input(PIN_c7)) { return 1; } else { return 0; }
}//switch
}
//int fclee[5];///ejemplo fclee[1]=1 F.C 1 debe ser leido   fclee[1]=0 IGNORAR F.C 1 (NO IMPORTA K SEA 0 o 1 ).......**
//int fclee[5];///ejemplo fcpos[1]=1 F.C 1 debe ser TRUE    fcpos[1]=0 F.C 1 debe ser FALSE............................
void esigeFC() {//Atrapado en WILL asta que se cumpla verdadero todo lo esigido en variables fclee[5]; fcpos[5];

int co,linea;
int1 sal=0;////es importante ponerla a 1 bug se recuerda sal=0 como si fuese global
int acu=1;
while(sal!=1) {
//printf(lcd_putc,"\fENTRO EN esigeFC sal = %d",sal);  delay_ms(500);  lcd_putc("\f");//
acu=1; linea=1; sal=1;
for (co=0;5>co;co++){/////////////si sal=1 vuelve a sal=0 algun F.C No esta en su sitio   

if (fclee[co]) { ///1 = exige verificar el final de carrera [ co ]
if (fcpos[co]) {  if (!FC(co)) { sal=0;  if (acu>40) { acu=1; linea=2; } pide(co,1,acu,linea);
acu+=20; } }
else {
if (FC(co)) { sal=0;  if (acu>40) { acu=1; linea=2; }  pide(co,0,acu,linea); //
acu+=20; } }
}
//if (Input(PIN_D3)) { sal=1; co=6; lcd_putc("\fANULACION DE F.C No se atendera siempre a los"); lcd_gotoxy(1,2); lcd_putc("Finales d Carrera con NO F.C = TRUE"); delay_ms(4000); }
}//for
if (linea==1 && !sal){
lcd_gotoxy(1,2);
switch (peti){//swit
case 1:
//printf(lcd_putc," li=%d ",li);
if (Input(PIN_C0) && sal==0){  lcd_putc("NO NO Solo Tarjeta  Solo F.C 1= TRUE"); }
else { lcd_putc("Cajero espera introduccion de tarjeta"); } break;
case 10:
if (tarje) { lcd_putc("Retire su tarjeta"); }
if (mony>0) { lcd_putc("Recoga su pasta"); } break;
case 22:
 lcd_putc("Cajero traga tarjeta"); break;
case 101:
 lcd_putc(" Fin"); break;
}//swit
}
if (!sal) { delay_ms(800); } //sal = true No perder + tiempo en esta funcion (todo F.C en su sitio)
lcd_putc("\f");
}//whil
}
void pide(int fin,int1 posi,int cu,int li) {//muestra lo k "esigeFC();"
lcd_gotoxy(cu,li); fin+=1;
if (!posi) { printf(lcd_putc," F.C %d pide FALSE",fin); } else { printf(lcd_putc," F.C %d pide TRUE",fin); }

}

void resesalidas(){
for (con=0;6>con;con++){
ladra[con]=0; }
}
////////////////funciones NEW////////////////funciones NEW////////////////funciones NEW////////////////funciones NEW
////////////////funciones NEW////////////////funciones NEW////////////////funciones NEW////////////////funciones NEW
////////////////funciones NEW////////////////funciones NEW////////////////funciones NEW////////////////funciones NEW
////////////////funciones NEW////////////////funciones NEW////////////////funciones NEW////////////////funciones NEW
////////////////funciones NEW////////////////funciones NEW////////////////funciones NEW////////////////funciones NEW
//0-1-2 IDEN 4 peti,salir,cliente,target[cliente]
void refresco(int1 muta,int1 gp1,int1 gp2){//,int1 gp3){//,int1 gp4){//,int1 gp5){
output_low(PIN_A0);//S.recivido incial 0
output_high(PIN_A3);//RW TRUE
int8 co;//,cu=9;
falloMF=0;
spi_write(gp1);
protMaster();
spi_write(gp2);
protMaster();

if (gp1) {//**per 1
for (co=0;5>co;co++){
spi_write(ladra[co]);//int1 
protMaster(); }
}//**per 1
if (gp2) {//**per 2
spi_write(salir); /// int8 salir
protMaster();
spi_write(cliente); /// int8 cliente
protMaster();
spi_write(target[cliente]);//target[ ]
protMaster();
spi_write(tarje);//tarje
protMaster();
union UNI M32;//int32 mony                         
M32.dat32 =mony;
     for(co=0;co<4;co++) {
      spi_write(M32.bytes[co]);
      protMaster();  }
}//**per 2
spi_write(peti); ///peti
protMaster();
spi_write(muta); ///muta=TRUE micro1 pasara a MASTER
protMaster();
output_low(PIN_A3);//RW FIN
if (muta) { COMBERSION(0); }
}

void leeclient(){
cliente=Input_b ();
if (Input(PIN_b7)) { cliente-=128; }
cliente=cliente/2;//cliente>>cliente;
while(cliente>19) { lcd_gotoxy(1,1);  printf(lcd_putc,"%d No es un numero de cuenta valido",cliente);
lcd_gotoxy(1,2); lcd_putc("BANCO PEKEÑO SOLO SE ACMITEN 19 CUENTAS"); cliente=Input_b ();
if (Input(PIN_b7)) { cliente-=128; } cliente=cliente/2; delay_ms(300); }
}
///Hay un jaleo en la combersion pic2-slave--->pic2-master CONCEPTO RECIVIDO es ENVIO  ENVIO es RECIVIDO
void protMaster() {/// protocolo de envio vajo SPI pic2MAESTRO
atra=0;
output_high(PIN_A0); // s.recivido=true afecta pic1PIN_C0_SLAVE/E.recivido
delay_ms(4);
while (Input(PIN_B7)==0) { delay_ms(1);  //Impide + recivos asta pic1SLAVE lo diga con su S.pin_c6_(S.envio) -----> E.pin_B7_MASTER(E.envio)
if (atra>15) { falloMF++; lcd_gotoxy(33,2);   printf(lcd_putc,"MF %d",falloMF);   break; } atra++; }
output_low(PIN_A0); // s.recivido=false afecta PIN_C0_pic1SLAVE/E.recivido
delay_ms(4);
}
void protSlave(){///protocolo de recivo vajo SPI pic2SLAVE
atra=0;
output_high(PIN_a0);//S.recivido=true -----> pin_c0_MASTER/E.recivido
delay_ms(7); ///valido (8)
//while (Input(PIN_b7)==0) { delay_ms(1);  //Espera a k pin_c6_MASTER/S.envio=true -----> b7=true
//if (atra>7) { falloSF++; lcd_gotoxy(33,2);    printf(lcd_putc,"s_f %d",falloSF);   break; } atra++; }
output_low(PIN_a0);
delay_ms(7);
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #2 en: 24 de Octubre de 2015, 01:16:25 »
Código: C
  1. #if defined(__PCM__)
  2. #include <16f877.h>
  3.  
  4. #FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
  5. #use delay(clock=4M)
  6. #DEFINE use_portd_lcd TRUE
  7. #include <lcd.c>
  8. #include <stdio.h>
  9. #use standard_io(A)               //puerto A como salida
  10. #BYTE PORTD=0X08
  11. #BYTE TRISD=0X88 //1000 1000
  12.  
  13. int1 ladra[5];
  14. unsigned int8 peti,cliente,salir,nume;
  15. int1 tarje,ser,nu;
  16. int1 target[20];//TRUE cliente registrado
  17. signed int32  mony; //signed int32 (-)(+)
  18. signed int32 M32;//M32 reservado para trabajar con "union"
  19.     union UNI {
  20.        signed int32 dat32;
  21.        int8 bytes[4];   };
  22.  
  23. void protSlave();
  24. void COMBERSION(int1 Soy);
  25. int1 MASTER;
  26.  
  27. #INT_EXT
  28. void EXT_isr() {//función de interrupción
  29.         if(!MASTER)
  30.         {
  31.                 output_low(PIN_C6);///S.envio  0 = pic2_B7_MASTER/E.envio
  32.                 output_high(PIN_C1);//RS TRUE
  33.                 int8 co;
  34.                 int1 gp1,gp2,muta=0;
  35.                 gp1=spi_read();
  36.                 protSlave();  
  37.                 gp2=spi_read();
  38.                 protSlave();
  39.                 if (gp1)
  40.                 {////**per 1 (estado-salidas pic1)
  41.                         for (co=0;5>co;co++)
  42.                         {
  43.                                 ladra[co]=spi_read();  
  44.                                 protSlave();  
  45.                         }
  46.                 }////**per 1
  47.                 if (gp2)
  48.                 {////**per 2
  49.                         salir=spi_read();// salir
  50.                         protSlave();
  51.                         cliente=spi_read();// cliente
  52.                         protSlave();
  53.                         target[cliente]=spi_read();// int1 targe[ ]  
  54.                         protSlave();
  55.                         tarje=spi_read();// int1 tarje  
  56.                         protSlave();
  57.                         union UNI M32;//int32 mony
  58.                         for(co=0;co<4;co++)
  59.                         {
  60.                                 M32.bytes[co] = spi_read();  
  61.                                 protSlave();
  62.                         }
  63.                         mony=M32.dat32;
  64.                 }////**per 2
  65.                 peti=spi_read();// int8 peti
  66.                 protSlave();
  67.                 muta=spi_read();
  68.                 output_high(PIN_C6);//S.envio=true -----> pic2_b7_MASTER/E.envio
  69.                 if (gp1)
  70.                 {
  71.                         if (ladra[0]) { output_high(PIN_a0); } else { output_low(PIN_a0); } delay_ms(1); //delay_ms(2);
  72.                         if (ladra[1]) { output_high(PIN_a1); } else { output_low(PIN_a1); } delay_ms(1);
  73.                         if (ladra[2]) { output_high(PIN_a2); } else { output_low(PIN_a2); } delay_ms(1);
  74.                         if (ladra[3]) { output_high(PIN_a3); } else { output_low(PIN_a3); } delay_ms(1);
  75.                         if (ladra[4]) { output_low(PIN_a4);  } else { output_high(PIN_a4);  } delay_ms(1);//neg
  76.                 }
  77.                 else
  78.                 {
  79.                         delay_ms(5);
  80.                 }
  81.                 output_low(PIN_C6);
  82.                 output_low(PIN_C1);//RS FIN
  83.                 if (muta) { COMBERSION(1); }
  84.         }
  85.         clear_interrupt(INT_EXT);  
  86. }
  87.  
  88.  
  89. unsigned int8 lee,atra,falloMF;
  90. unsigned int16 contra[20];// contraseña////WRITE SOLO MICRO1
  91. signed int32 saldo[20];//dinero almacenado////WRITE SOLO MICRO1
  92. signed int32 total,acumula;
  93. int32 presta;
  94. int16 meses=10;
  95. int8 decimal,vari;
  96. float prestamo,teres=2;
  97.  
  98. void lectura();
  99. void borratotal();
  100. void ponsea();//escribe contraseña
  101. void ponme();//escribe
  102. void skri();
  103. void recogmateria();
  104. void reembolso(int8 cli);
  105. void refresco(int1 muta,int1 envi);//gp1,int1 gp2);//,int1 gp4);
  106. void tiempo(int8 espe);//
  107. void mensaje(int8 men);
  108. void mensa(int8 me);
  109. void sajesal(int1 acet,int1 line);
  110. void OPER(int8 dar);
  111.  
  112. void main(){
  113.         int8 con,nume;  
  114.         output_low(PIN_B7);
  115.         output_low(PIN_C1);//RS FIN
  116.         output_low(PIN_c2);//RW FIN
  117.         //output_low(PIN_b4);
  118.         saldo[1]=2015; saldo[5]=1400; saldo[9]=550; saldo[17]=50;
  119.         contra[1]=1111; contra[5]=2345; contra[9]=1500; contra[17]=9871;
  120.         lcd_init();//port_b_pullups(false);
  121.         COMBERSION(0);
  122.         ext_int_edge(l_to_h);//alto
  123.         clear_interrupt(INT_EXT); //#INT_EXT  ///X CamBio en RB0
  124.         enable_interrupts(int_EXT);
  125.         enable_interrupts(global);
  126.          set_tris_b(0b00011111);
  127.         //setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  128.         while(true)
  129.         {///WIL main()
  130.                 #if defined(__PCM__)
  131.                 setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  132.                 lcd_gotoxy(13,1);
  133.                 lcd_putc("PROYECTO CAJERO");
  134.                 tarje=0; // recoge();
  135.                 if (peti==2)
  136.                 {
  137.                         //peti=2 detecto tarjeta
  138.                         //salir=acogetargeta();// return 21 = fallo F.C Acoge targeta 1 =cliente registrado 2=sinregistrar 11 = cliente saco la targeta si realizar operacion alguna
  139.                         if (salir<3 && MASTER)
  140.                         {
  141.                                 // recoge();
  142.                         }
  143.                         else
  144.                         {
  145.                                 //while (Input(PIN_C0)==0);
  146.                                 //lcd_putc("\finicia espera");
  147.                                 //tiempo(1);
  148.                         }
  149.                 //else
  150.                 //{
  151.                         //registro();
  152.                         nu=salir;//(1,0,0,0)   1 o 2 normal
  153.                         borratotal();//acumula=0; total=0; lee=0; decimal=1;
  154.                         mensa(1);
  155.                         if (target[cliente])
  156.                         {//TRUE cliente reconocido
  157.                                 while(nu)
  158.                                 {////whil cliente registrado
  159.                                         lectura();
  160.                                         if (lee!=0)
  161.                                         {///se pulso buton
  162.                                                 if (lee==10)
  163.                                                 {//ACEPTAR comprobar contraseña
  164.                                                         if (total==contra[cliente])
  165.                                                         {
  166.                                                                 lcd_putc("\f  CORRECTO");
  167.                                                                 tiempo(3);
  168.                                                                 nu=0;
  169.                                                         }
  170.                                                         else
  171.                                                         {
  172.                                                                 atra+=1;
  173.                                                                 if (atra>2)
  174.                                                                 {
  175.                                                                         nu=0;
  176.                                                                         salir=4;
  177.                                                                 }  //salir=4= alarma
  178.                                                                 else
  179.                                                                 {
  180.                                                                         printf(lcd_putc,"\f CONTRASERÑA INCORREPTA     fallo %d",atra);
  181.                                                                         borratotal();
  182.                                                                         tiempo(3);
  183.                                                                         mensa(1);
  184.                                                                 }
  185.                                                         }
  186.                                                         //printf(lcd_putc,"\f ESCRIBA %lu CONTRASEÑA",contra[cliente]); } }
  187.                                                 }
  188.                                                 else
  189.                                                 {//comprobar contraseña//NO ACEPTAR
  190.                                                 if (lee==13)
  191.                                                 {
  192.                                                         nu=0;
  193.                                                         salir=22;
  194.                                                 }
  195.                                                 else
  196.                                                 {
  197.                                                         ponsea();
  198.                                                 }//SALIR sospechoso
  199.                                         }
  200.                                 }////se pulso buton
  201.                         }////whil cliente registrado
  202.                 }//cliente reconocido
  203.                 else
  204.                 {///cliente nuevo //salir=2                
  205.                         lcd_gotoxy(2,2); printf(lcd_putc,"( TarJeta %d desconocida REGISTRESE )",cliente);
  206.                         while(salir==2)
  207.                         {
  208.                                 lectura();
  209.                                 if (lee!=0)
  210.                                 {///se pulso buton
  211.                                         if (lee==10)
  212.                                         {//ACEPTAR comprobar contraseña
  213.                                                 if (decimal==4)
  214.                                                 {//new contr adecuada
  215.                                                         salir=1;
  216.                                                         mensaje(1); //mensaje + operaciones                                  
  217.                                                 }
  218.                                                 else
  219.                                                 {//new contr NO adecuada
  220.                                                         mensa(2);
  221.                                                         tiempo(4);
  222.                                                         mensa(1);
  223.                                                 }                                                
  224.                                         }
  225.                                         else
  226.                                         {//comprobar contraseña//NO ACEPTAR
  227.                                                 ponsea();
  228.                                         }
  229.                                         if (lee==13) salir=10;
  230.                                 }///se pulso buton
  231.                         }///cliente nuevo
  232.                         mensaje(2);
  233.                 }
  234.                 nume=1;
  235.                 nu=0;
  236.                 while(salir==1)
  237.                 {////wil (!salir=0)
  238.                         while(lee==10) lectura(); //antirrebote ACEPTAR
  239.                         lcd_putc("\f");
  240.                         while(lee!=10 && !nu)
  241.                         { ///ACEPTAR OPERACIONES DE CLIENTE
  242.                                 lectura();
  243.                                 if (lee!=0 && lee!=10 && lee!=14) nume=lee;
  244.                                 if (lee==13)
  245.                                 {
  246.                                         salir=10;
  247.                                         nume=10;
  248.                                         break;
  249.                                 }
  250.                                 lcd_gotoxy(1,1); printf(lcd_putc,"SELECCIONE OPERACION  %d  PULSE ACEPTAR",nume);
  251.                                 lcd_gotoxy(1,2);
  252.                                 if (nume>3)  { lcd_putc("4 prestamo 5 traspaso 6 cuenta fija"); } else { lcd_putc("1 consulta saldo 2 Sacar 3 ingresar"); } //35carat
  253.                         }
  254.                         while(lee==10) lectura(); //(antirrebote)ACEPTAR OPERACIONES DE CLIENTE
  255.                         borratotal();
  256.                         nu=0;
  257.                         mony=0;
  258.                         lcd_putc("\f");  //lcd_gotoxy(1,1);
  259.                         switch (nume)
  260.                         { //swit 1
  261.                         case 1: /// consulta saldo
  262.                                 do
  263.                                 {// && lee!=13) {  
  264.                                         lcd_gotoxy(8,1); printf(lcd_putc,"Cliente %d Su saldo es de %ld "cliente,saldo[cliente]);
  265.                                         lcd_gotoxy(1,2);
  266.                                         lcd_putc("ACEPTAR/MENU cualkier otra tecla paSALIR");  
  267.                                         lectura();
  268.                                         if (lee>0)
  269.                                         {
  270.                                                 if (lee!=10 && lee!=14)
  271.                                                 {
  272.                                                         salir=10;
  273.                                                         break;
  274.                                                 }
  275.                                         }
  276.                                 } while(lee!=10 && lee!=14);  //nume=10; lee=0; //lee=0;...no meterse..................
  277.                                 break;
  278.                         case 2:
  279.                                 OPER(10);//sacar pasta
  280.                                 if (lee<13)
  281.                                 {
  282.                                         mensaje(11);
  283.                                         //tarje=0; //peti=10 mony>0 ladra[1]
  284.                                         //output_high(PIN_a1); //tarje=1 ladra[4]neg s suelta dinero  tarje=1
  285.                                         //output_low(PIN_a4);// s suelta tarjeta
  286.                                         recogmateria();
  287.                                 }//OJO recogmateria(); trata solo a (tarje || (mony y saldo[cliente]))
  288.                                 break;
  289.                         case 3://meter pasta
  290.                                 OPER(12);
  291.                                 if (lee<13)
  292.                                 {
  293.                                         saldo[cliente]=saldo[cliente]+total;
  294.                                         nu=1;
  295.                                         nume=1;
  296.                                 } //if (salir==1) //todo fue normal
  297.                                 break;
  298.                         case 4://prestamo
  299.                                 total=meses;
  300.                                 OPER(13);
  301.                                 total=teres;
  302.                                 OPER(14);//interes mensual
  303.                                 total=presta;
  304.                                 OPER(15);
  305.                                 OPER(16);   //salir=2 micro2 sabra k se trata de un prestamo
  306.                                 if (lee<13)
  307.                                 {
  308.                                         salir=2;
  309.                                         recogmateria();
  310.                                         salir=1;
  311.                                 } //if (salir==1) //todo fue normal
  312.                                 break;
  313.                         default :  
  314.                                 if (salir<3)
  315.                                 {
  316.                                         printf(lcd_putc,"\fERROR NO EXISTE OPERACION %d",nume);
  317.                                         tiempo(6);
  318.                                 }
  319.                                 break;
  320.                         }//swit 1
  321.                         if (salir==10 || salir==12)
  322.                         {
  323.                                 mensa(salir);
  324.                                 tiempo(8);
  325.                         } //lcd_putc("\f  ASTA OTRA");  }
  326.                 }//while salir=1 operaciones cliente registrado//////*/
  327.                 switch (salir)
  328.                 {//swit 2
  329.                 case 4:  //case 4://alarma contraseña cliente incorrepta
  330.                         peti=4;
  331.                         refresco(1,0); //delay_ms(5000);///fuera
  332.                         output_high(PIN_a2);///s Traga Targeta
  333.                         output_high(PIN_b7);
  334.                         for (con=0;6>con;con++)
  335.                         {
  336.                                 mensa(4);
  337.                                 mensa(5);
  338.                         }//alarma
  339.                         break;////4
  340.                 case 10 || 12://operacion de retiro tarjeta
  341.                         lcd_putc("\fRetire su tarjeta");
  342.                         tarje=1;
  343.                         recogmateria(); //fin master  
  344.                         break;
  345.                 case 22://sospecoso no introdujo contraseña
  346.                         peti=22;
  347.                         lcd_putc("\fAnulo introducir contraseña (sospechoso)");// tiempo(3);
  348.                         refresco(1,0);//lcd_gotoxy(1,2);//recoge(); recoge(); recoge();// COMBERSION(1);//fin master
  349.                         break;
  350.                 case 41:
  351.                         peti=11;
  352.                         refresco(1,0);//recoge(); recoge();//fin master  
  353.                         break;
  354.                 }//swit 2 //acionSalida();
  355.                 do{  
  356.                         if (MASTER)
  357.                         {
  358.                                 peti=101;
  359.                                 salir=0;
  360.                                 tiempo(2);
  361.                                 refresco(1,0);
  362.                                 break;
  363.                         }
  364.                 }while(1);
  365.                 clear_interrupt(INT_EXT);
  366.                 lcd_putc("\f");
  367.         }//se introdujo tarjeta
  368.         }//se detecto targeta//
  369.         }//WIL main()
  370. }
  371.  
  372. ///////////////////////////FUNCIONES/////////////////////////////////////////////FUNCIONES/////////////////////////////////////////////FUNCIONES//////////////////
  373.  
  374. void tiempo(int8 espe) {
  375.         for(nume=0;espe>nume;nume++) delay_ms(400);
  376. }
  377.  
  378. void mensaje(int8 men) {
  379.         lcd_gotoxy(1,1);
  380.         switch (men)
  381.         {
  382.         case 2:
  383.                 contra[cliente]=total;
  384.                 target[cliente]=1;
  385.                 printf(lcd_putc,"\fREGISTRO CORRECTO como Cliente numer %d"cliente);
  386.                 lcd_gotoxy(1,2);
  387.                 printf(lcd_putc,"Guarde su contraseña %lu",contra[cliente]);
  388.                 tiempo(15); //lee=0;
  389.                 sajesal(1,0);
  390.                 break;////*/
  391.         case 10:
  392.                 printf(lcd_putc,"IMPORTE A SACAR %lu.00 EUROS      ",total);  
  393.                 lcd_gotoxy(1,2);
  394.                 printf(lcd_putc,"Su saldo actual es de %ld.00 Euros",saldo[cliente]);
  395.                 mony=total;
  396.                 break;
  397.         case 11:
  398.                 saldo[cliente]=saldo[cliente]-mony;
  399.                 printf(lcd_putc,"\fRETIRE SUS %ld.00 EUROS",mony);  
  400.                 lcd_gotoxy(1,2);//OJO recogmateria(); trata solo a mony y saldo[cliente]
  401.                 printf(lcd_putc,"Su saldo ahora es de %ld.00 Euros",saldo[cliente]);
  402.                 break;///*/
  403.         case 12:
  404.                 lcd_putc("HAORA ERES EL CAJERO Escrive el total a");  
  405.                 lcd_gotoxy(1,2);
  406.                 printf(lcd_putc,"ingresar %lu.00 Euros en cuenta %d",total,cliente);
  407.                 break;
  408.         case 13:///PRESTAMO.....
  409.                 lcd_putc("ERES EL CAJERO cuanto dura el prestamo");  
  410.                 lcd_gotoxy(14,2);
  411.                 printf(lcd_putc,"%lu meses       ",total);  
  412.                 meses=total;  
  413.                 if (total==1)
  414.                 {
  415.                         lcd_gotoxy(19,2);
  416.                         lcd_putc("  ");
  417.                 }
  418.                 break; ///meses
  419.         case 14:
  420.                 lcd_putc("ERES CAJERO cual es interes mensual   ");  
  421.                 lcd_gotoxy(14,2);
  422.                 printf(lcd_putc,"%lu/100      ",total);  
  423.                 teres=total;  
  424.                 break;//interes mensual float
  425.         case 15:
  426.                 lcd_putc("ERES EL CLIENTE cuanto quieres de");  
  427.                 lcd_gotoxy(10,2);
  428.                 printf(lcd_putc,"prestamo %lu.00 Euros              ",total);  
  429.                 presta=total;  
  430.                 break;//prestamo
  431.         case 16:///.....PRESTAMO
  432.                 prestamo=presta+(((presta*teres)/100)*meses);
  433.                 vari=teres;
  434.                 printf(lcd_putc,"ACEPTA? %Lu Euros a %d/100 interesXmes",presta,vari);  
  435.                 lcd_gotoxy(1,2);
  436.                 printf(lcd_putc,"dentro de %lu meses nos debera %f Euros        ",meses,prestamo);
  437.                 break;//futuro pago float
  438.         }
  439. }
  440.  
  441. void OPER(int8 dar) {
  442.         if (lee<13)
  443.         { //13 salir 14 menu (pasar de todo)
  444.                 lee=0;
  445.                 ser=0;
  446.                 do{
  447.                         mensaje(dar);//mensaje + operaciones
  448.                         skri();
  449.                         if (lee>12) break; //lee=13 SALIR   14 MENU
  450.                         if (total==0 && lee==10)
  451.                         {
  452.                                 lcd_gotoxy(8,2);
  453.                                 lcd_putc("NO ES POSIBLE operar con CERO");
  454.                                 lee=0;
  455.                                 tiempo(5);
  456.                                 lcd_putc("\f");
  457.                         }
  458.                 } while(lee!=10); //if (lee<13) { borratotal(); }
  459.                 while(lee==10)
  460.                 {
  461.                         if (lee>12) break;
  462.                         else lectura();
  463.                 }//anti-rebote
  464.         }
  465. }
  466.  
  467. void skri() {
  468.         delay_ms(400);
  469.         lectura();
  470.         if (lee!=0)
  471.         {
  472.                 if (lee==13) salir=12;
  473.                 else ponme();
  474.         }
  475. }
  476.  
  477. void ponme() {
  478.         if (lee!=10)
  479.         { //buton ACEPTAR y MENU PRINCIPAL(14) no son validos
  480.                 if (lee==11) lee=0;////11 = 0
  481.                 if (lee==13) salir=12;  //salir sin elegir ninguna operacion
  482.                 if (lee==14) nu=0; //volver a menu No operar nada
  483.                 if (lee==12) borratotal();  ///BORRAR
  484.                 else
  485.                 {
  486.                         ser=1;
  487.                         total=acumula+lee;
  488.                         acumula=total*10;
  489.                 }//lo normal
  490.         }
  491. }
  492.  
  493. void mensa(int8 me){
  494.         lcd_gotoxy(1,1);
  495.         switch (me){
  496.         case 0:
  497.                 lcd_putc("\fERROR EL PRIMER DIGITO NO PUEDE SER CERO");  
  498.                 borratotal();
  499.                 break;
  500.         case 1:
  501.                 printf(lcd_putc,"\f ESCRIBA %ld CONTRASEÑA",contra[cliente]);
  502.                 break;
  503.         case 2:
  504.                 lcd_putc("\fERROR CONTRASEÑA A DE SER DE 4 DIGITOS");
  505.                 borratotal();
  506.                 tiempo(4); //ponsea();// dela
  507.                 break;
  508.         case 4:
  509.                 output_high(PIN_b7); lcd_putc("\f           alarma");
  510.                 tiempo(1);///s Alarma
  511.                 break;
  512.         case 5:
  513.                 output_low(PIN_b7); lcd_putc("\f CAJERO TRAGA TARJETA CREDITO");
  514.                 tiempo(1);
  515.                 break;
  516.         case 10:
  517.                 lcd_putc("\f  ASTA OTRA");
  518.                 break;
  519.         case 12:
  520.                 printf(lcd_putc,"\fcancelo operacion %d",nume);
  521.                 break;
  522.         }
  523. }
  524.  
  525. void sajesal(int1 acet,int1 line) {
  526.         lee=0;
  527.         if (!line) lcd_gotoxy(1,1);
  528.         else lcd_gotoxy(1,2);
  529.         if (acet)
  530.         {
  531.                 lcd_putc("    -PULSA ACEPTAR PARA SEGIR-      ");
  532.                 do{
  533.                         delay_ms(400);
  534.                         lectura();
  535.                 }while(lee!=10);
  536.         }
  537.         else {      
  538.                 lcd_putc(" -PULSA CUALKIER BOTON PARA SALIR-  ");
  539.                 do{
  540.                         delay_ms(400);
  541.                         lectura();
  542.                 }while(lee!=0);
  543.         }
  544. }
  545.  
  546. void borratotal() {
  547.         acumula=0;
  548.         total=0;
  549.         lee=0;
  550.         decimal=0;
  551.         ser=0;
  552. }
  553.  
  554. void ponsea(){
  555.         //if (lee==13) { salir=22; break; }//salir sospechoso
  556.         int8 co;
  557.         if (lee==11)
  558.         {
  559.                 ser=1;
  560.                 lee=0;
  561.         }////11 = 0
  562.         total=acumula+lee;//numer;
  563.         acumula=total*10;
  564.         mensa(1);
  565.         //printf(lcd_putc,"\f ESCRIBA %lu CONTRASEÑA",contra[cliente]);
  566.         if (total>0) { if (lee>11) borratotal(); } ///BORRAR//printf(lcd_putc,"\f ESCRIBA %lu CONTRASEÑA",contra[cliente]);
  567.         else
  568.         {
  569.                 decimal++;
  570.                 ser=1;
  571.                 lcd_gotoxy(28,1);
  572.                 if (decimal>1) for (co=1;decimal>co;co++) printf(lcd_putc,"* ");
  573.         }
  574.         printf(lcd_putc,"%d",lee);  
  575.         if (decimal>4)
  576.         {
  577.                 mensa(2);
  578.                 tiempo(4);
  579.                 mensa(1);  
  580.         }//digitos
  581.        
  582.         if (ser && total<1)
  583.         {
  584.                 mensa(0);
  585.                 tiempo(4);
  586.                 mensa(1);
  587.         } //no al cero
  588.         delay_ms(600);
  589. }
  590.  
  591. void recogmateria(){
  592.         peti=10;
  593.         salir=0;
  594.         //COMBERSION(1);
  595.         refresco(1,1); //COMBERSION(0);
  596.         do{
  597.         //switch (peti){
  598.                 if (salir>30)
  599.                 {
  600.                         // printf(lcd_putc,"\fEnvio mensaje a movil Cliente %d",cliente);
  601.                         lcd_gotoxy(8,2);
  602.                         switch (salir)
  603.                         {
  604.                         case 40:
  605.                                 peti=101;
  606.                                 lcd_putc("Olvido TARJETA");  
  607.                                 break;
  608.                         case 41:
  609.                                 lcd_putc("Olvido DINERO");
  610.                                 break;
  611.                         }
  612.                 } //////*/
  613.         }while(!MASTER);
  614.  
  615. }
  616.  
  617. void COMBERSION(int1 Soy) {
  618.         if (Soy)
  619.         {
  620.                 MASTER=1;
  621.                 set_tris_c(208);
  622.                 delay_ms(2);// 1101 0000 /// "C5_S C4_E C3_S  01 0"
  623.                 setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);
  624.                 delay_ms(2);//| SPI_XMIT_L_TO_H); //);// | SPI_XMIT_L_TO_H);  
  625.                 output_high(PIN_c7);
  626.         }
  627.         else
  628.         {
  629.                 MASTER=0;
  630.                 set_tris_c(240);  
  631.                 delay_ms(2); // 1111 0000 /// "C5_E C4_E C3_S  11 0"
  632.                 setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16);
  633.                 delay_ms(2);//| SPI_XMIT_L_TO_H); //);// | SPI_XMIT_L_TO_H);  
  634.                 output_low(PIN_c7);
  635.         }
  636. }
  637.  
  638. void lectura(){
  639.  
  640.         lee=Input_B();
  641.         if (Input(PIN_b4)) { lee-=15;}
  642. }//return leer;
  643.  
  644. void reembolso(int8 cli){
  645.         saldo[cli]=saldo[cli]+mony;
  646.         printf(lcd_putc,"\fReemvolso de %lu Euros",mony);
  647.         lcd_gotoxy(1,2);
  648.         if (target[cli]) { printf(lcd_putc,"Ciente numero %d",cli); }
  649.         else { printf(lcd_putc,"En cuenta %d NO REGISTRADA",cli); } //mony=0;
  650. }//reembolso dinero a cliente
  651.  
  652.  
  653. ////////////////////////funciones NEW////////////////////////funciones NEW////////////////////////funciones NEW
  654.  
  655. void protMaster() {/// protocolo de envio vajo SPI MAESTRO
  656.         atra=0;
  657.         output_high(PIN_c6); // s.envio=true afecta PIN_B7_SLAVE/E.envio
  658.         delay_ms(4);//4
  659.         while (Input(PIN_c0)==0)
  660.         {
  661.                 delay_ms(1);  //Impide + envios asta SLAVE lo diga con su S.pin_a0_(S.recivido) -----> E.pin_c0_MASTER(E.recivido)
  662.                 if (atra>15)
  663.                 {
  664.                         falloMF++;
  665.                         lcd_gotoxy(33,2);  
  666.                         printf(lcd_putc,"MF %d",falloMF);  
  667.                         break;
  668.                 }
  669.                 atra++;
  670.         }
  671.         output_low(PIN_c6); // s.envio=false afecta PIN_B7_SLAVE/E.envio
  672.         delay_ms(4);//4
  673. }
  674.  
  675. ///Hay un jaleo en la combersion pic1-master--->pic2-slave CONCEPTO RECIVIDO es ENVIO  ENVIO es RECIVIDO
  676.  
  677. void protSlave(){///protocolo de recivo vajo SPI pic2SLAVE
  678.         atra=0;
  679.         output_high(PIN_C6);//S.envio=true -----> pic2_b7_MASTER/E.envio
  680.         delay_ms(7); ///valido (8)
  681.         output_low(PIN_C6);
  682.         delay_ms(7);
  683. }
  684.  
  685. ///////////////REFRESCO///////////////REFRESCO///////////////REFRESCO///////////////REFRESCO///////////////REFRESCO
  686.  
  687. void refresco(int1 muta,int1 envi){//,int1 gp3){//,int1 gp4){//,int1 gp5){
  688.         int8 co;
  689.         falloMF=0;
  690.         output_low(PIN_c6);//S.envio incial 0
  691.         output_high(PIN_C2);//RW TRUE
  692.         spi_write(envi);    
  693.         protMaster();
  694.         if (envi) {
  695.                 spi_write(salir); /// int8 salir
  696.                 protMaster();
  697.                 spi_write(tarje); /// int1 tarje
  698.                 protMaster();
  699.                 //target[cliente]
  700.                 spi_write(target[cliente]); /// int1 target[cliente]
  701.                 protMaster();
  702.                 union UNI M32;//int32 mony
  703.                 M32.dat32 =mony;
  704.                 for(co=0;co<4;co++) {
  705.                         spi_write(M32.bytes[co]);
  706.                         protMaster();  
  707.                 }
  708.         }
  709.         spi_write(peti); /// int8 peti
  710.         protMaster();
  711.         spi_write(muta);//
  712.         protMaster();
  713.         output_low(PIN_c2);//RW FIN
  714.         if (muta) { COMBERSION(0); }
  715.         //delay_ms(70);
  716. }

Un poco mejor, solo decirte que me tomo 40 min identar todo y solamente es 1 codigo, y aun asi tuve errores por que en el main me sobraron como 3 llaves y en otra funcion tambien, eso seguro que es por uno de tus comentarios en el cual no comentas todo el bloque, como por ejemplo el de un else { ... } sino que  solo comentas el else {,
No se por que escribis todo en una linea, eso NO va a ocupar menos espacio en el micro, tenes MILLONES de while/do..while e if en tu programa, pienso que es ABUSIVO el uso que le estas dando, delays asquerosos de 400ms y ni contar que lo repetis continuamente. delays en las interrupciones, aun peor, una "union" dentro de una funcion... ¿por que?, funciones bloqueantes como spi_read() en una interrupcion.
La interrupcion del SPI creo que es #INT_SSP , la que estas usando vos es del port RB0 (#INT_EXT)

Utilizas un
#if defined(__PCM__)
en medio del programa, creo que no tenes idea que es,eso es una definicion que crea el compilador para indicar en que compilador se esta haciendo. ejemplo podria tener un codigo que sirva para compilarlo en XC8 y en CCS, el codigo de CCS iria dentro de ese if, y el otro iria dentro de un if defined(__XC8__) solo un ejemplo.

En ves de tener:

Directivas de preprocesamiento
Declaracion de variables globales
Declaracion de funciones ( o esto puede ir en un .h )
Funciones

Tenes:

Directivas de preprocesamiento
Declaracion de variables globales
Declaracion de funciones
Funcion de interrupcion
Declaracion de variables globales
Declaracion de funciones
Funciones

Otra mas... los nombres de la funciones:

mensa,ponme,skri,sajesal,ponsea,recogmateria,protMASTER,protSLAVE, etc etc.

USA nombres!!
vEscribe_Mensaje()
vLectura_Teclado()
bSPI_Estado()
iBotones_Presionados()

En esos nombres podes ver:
primera letra, si devuelve un void , int, bool(int1)
Y sabes realmente que hace la funcion!. Poner nombres cortos tanto para las funciones como variables hace mas rapida la programacion pero es un dolor de cabeza el debuggeo.

Si no lo repito de nuevo, por favor IDENTA tus codigos! , e intenta que tu main sea mas corto.
Hacete una libreria por ejemplo con algunas funciones, pero el main debe ser mas corto, es demasiado largo, por demas.
Crea un .h para poner todas las definiciones de las funciones + variables

En resumen, si esperas ayuda, realmente tenes que ser mas ordenado y programar mejor, es imposible revisar eso, IMPOSIBLE.
No te lo tomes a mal, solo tomalo como algo a mejorar, te lo digo por que realmente es complicado verlo. muy complicado.
Disculpa que no sea de mas ayuda.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #3 en: 24 de Octubre de 2015, 01:27:49 »
Algunos errores apartes ( auqnue puede que me haya confundido por que obviametne no se que estas haciendo en las funciones):

Código: C
  1. void ponme() {
  2.         if (lee!=10)
  3.         { //buton ACEPTAR y MENU PRINCIPAL(14) no son validos
  4.                 if (lee==11) lee=0;////11 = 0
  5.                 if (lee==13) salir=12;  //salir sin elegir ninguna operacion
  6.                 if (lee==14) nu=0; //volver a menu No operar nada
  7.                 if (lee==12) borratotal();  ///BORRAR
  8.                 else
  9.                 {
  10.                         ser=1;
  11.                         total=acumula+lee;
  12.                         acumula=total*10;
  13.                 }//lo normal
  14.         }
  15. }

Te das cuenta que ese "else" se va a ejecutar siempre que lee sea distinto de 12?, si es 11,13,14,5,2,1,etc lo va a hacer
Tambien en otra funcion llamas a esa creo que para nada:

Código: C
  1. if (lee!=0)
  2.         {
  3.                 if (lee==13) salir=12;
  4.                 else ponme();
  5.         }

Ok. si es 13 , pones salir a 12, lo lindo es que lo haces por igual en tu funcion ponme.

Vamos con otra:

Código: C
  1. while(lee==10)
  2.                 {
  3.                         if (lee>12) break;
  4.                         else lectura();
  5.                 }//anti-rebote
Te das cuenta que ese if esta sin sentido ahi ? Te das cuenta que hay mal en ese codigo?
Creo que vos unicamente queres salir si lee es mayor a 12. Ocurre lo siguiente:
Entra cuando es 10 lee, entra al if.. no cumple va al else,modifica a lee, luego comprueba nuevamente la condicion del while, cualquier valor que tenga lee, si es distinto de 10, el while va a salir. puede ser un 1, o un 11, o un 9, va a preguntar por el while y va a salir. ese if jamas se va a ejecutar.

Y aca pare de ver funciones, Si el while del main, no funciona es por que esta mal programado, tu sistema de delays hacen que sea imposible recibir por ejemplo. por eso tenes que usar interrupciones al recibir, pero tenes una funcion bloqueante como es spi_read, que se queda ahi por siempre hasta que recibe otro dato. Y seguro que ahi termina funcionando todo mal, ordena tu codigo y vemos de solucionar el problema.
« Última modificación: 24 de Octubre de 2015, 02:13:10 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #4 en: 24 de Octubre de 2015, 09:34:13 »
Gracias por tomarte tanto tiempo debio darte error porque quite algunas cosas por el limite de caracteres y algunos //comentarios no son fiables ya no cumplen lo que hacia la instruccion inicialmente
Citar
No se por que escribis todo en una linea, eso NO va a ocupar menos espacio
Ya lo se pero para mi es mas inteligible verlo todo junto en una linea cuando se trata de instrupciones similares o relaccionadas  *
Ya e conocido a #INT_SSP supongo que me ahorra el b0 pero esto ahora no es primordial
Citar
delays en las interrupciones, aun peor, una "union" dentro de una funcion
Si me echan muchas broncas por esto e acortado los delays lo mas posible pero no consigo idear un metodo en el que pueda pasar de ellos La union es necesaria para pasar un int32
Citar
¿por que?, funciones bloqueantes como spi_read() en una interrupcion.
Este ¿por que? es el que me prunto cada vec que se vuelve a ejecutar el while//principal realmente  spi_read() se bloquea no sale de la interrupcion (segun output_high(PIN_C1);//RS TRUE) solo malamente haciendola ejecutar una y otra vec ¿esta mejor preparado #INT_SSP para esto? pero durante el transcurso del programa no falla nada de esto Este error es continuo cada vec que se vuelve al inicio
Citar
#if defined(__PCM__)
en medio del programa, creo que no tenes idea que es,eso es una definicion que crea el compilador para indicar en que compilador se esta haciendo. ejemplo podria tener un codigo que sirva para compilarlo en XC8 y en CCS, el codigo de CCS iria dentro de ese if, y el otro iria dentro de un if defined(__XC8__) solo un ejemplo.
Cierto ni idea crei que era por el spi en los proyectos sobre este protocolo que vi de otros siempre lo ponian al inicio Si es como dices no deberia poner if defined(__CCS__)
Citar
Directivas de preprocesamiento
//Que es esto a que te refieres??
Citar
Declaracion de funciones ( o esto puede ir en un .h )
Citar
Crea un .h para poner todas las definiciones de las funciones + variables
Por favor dame un ejemplo de esto cualquier cosa que tengas hecha No importa que no entienda el codigo solo quiero ver como se separa
Citar
Declaracion de variables globales
Declaracion de funciones
Funcion de interrupcion
Declaracion de variables globales
Declaracion de funciones
Veras el compilador se me queja que no reconoce tanto variables como funciones si no las declaro antes de #INT_EXT Todas las que esten dentro de esta interrupcion
Citar
mensa,ponme,skri,sajesal,ponsea,recogmateria,protMASTER,protSLAVE, etc etc.
De la misma me entiendo mejor con nombres cortos*
int8 co,con,cont es mi Standar en bucles ´for´ y mas rapido que leer contador*
*Y a menos que esto suponga un fallo en la ejecucion del programa prefiero segir haciendolo a si
Citar
iBotones_Presionados()
El nombre no me va ¿pro que implica "!negacion" en una funcion?
Citar
No te lo tomes a mal, solo tomalo como algo a mejorar, te lo digo por que realmente es complicado verlo. muy complicado.
Si si me empeño en poner nombres cortos que solo se interpretar yo Esto si que puede ser un problema a la hora de pediros ayuda

Código: [Seleccionar]
    void ponme() {
            if (lee!=10)
            { //buton ACEPTAR y MENU PRINCIPAL(14) no son validos
                    if (lee==11) lee=0;////11 = 0
                    if (lee==13) salir=12;  //salir sin elegir ninguna operacion
                    if (lee==14) nu=0; //volver a menu No operar nada
                    if (lee==12) borratotal();  ///BORRAR
                    else
                    {
                            ser=1;
                            total=acumula+lee;
                            acumula=total*10;
                    }//lo normal
            }
    }
Citar
Te das cuenta que ese "else" se va a ejecutar siempre que lee sea distinto de 12?, si es 11,13,14,5,2,1,etc lo va a hacer
Tambien en otra funcion llamas a esa creo que para nada:
Cierto pero no es grave el unico problema es que acaba ejecutando una operacion que no sirve para nada una vec que main() recive nu=0; o salir=12; no tendra en cuenta la operacion

 if (lee==13) salir=12;//Si repetido y seguro que hay mas fallos como estos Estos casos los refino al final o a menos que lo vea //en un momento dado No creo que interfieran al problema principal que quiero corregir

Código: [Seleccionar]
while(lee==10)
                {
                        if (lee>12) break;
                        else lectura();
                }//anti-rebote
Citar
Te das cuenta que ese if esta sin sentido ahi ?
Exacto de hecho este if no sirve para nada incluso aunque pudiese llegarse a cumplir

volviendo a lo principal
Citar
funciones bloqueantes como spi_read() en una interrupcion.
Algo se atasca siempre en un nuevo inicio dentro de la interrupcion con spi_read no hay posibilidad de quedarse encerrado en ningun bucle dentro de la int_ext Hay algo que pueda anularme el protocolo al final que salga de el si hay redundancia
E itentado hacerlo desde la interrupcion pero esto no sirvio:

void main{
While(1){//inicio
ext_int_edge(l_to_h);
clear_interrupt(INT_EXT);
enable_interrupts(int_EXT);
enable_interrupts(global);
......
......
clear_interrupt(INT_EXT);
disable_interrupts(int_EXT);
disable_interrupts(global);
}//fin
}

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #5 en: 24 de Octubre de 2015, 10:10:19 »
Ni caso a este mensaje ( se me olvido notificar respuestas )

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #6 en: 24 de Octubre de 2015, 11:17:28 »
Citar
Ya lo se pero para mi es mas inteligible verlo todo junto en una linea cuando se trata de instrupciones similares o relaccionadas  *
Ya e conocido a #INT_SSP supongo que me ahorra el b0 pero esto ahora no es primordial

Es que realmente no entiendo que queres hacer con la interrupcion de RB0, simplemente usas la interrupcion del SPI. el SPI cuando vos recibis algo entraria a la interrupcion y salis. Tambien imagino que uno es esclavo y el otro maestro, sino deberias hacer un "protocolo" para cambiar entre maestro y esclavo. Y sigue sin entrarme en la cabeza el por que usaria RB0 para la comunicacion SPI.. Ademas con el SPI recibirias en cualquier momento. dejando el micro libre para otras cosas

Citar
Si me echan muchas broncas por esto e acortado los delays lo mas posible pero no consigo idear un metodo en el que pueda pasar de ellos La union es necesaria para pasar un int32

El tema no es "acortar" los delays, es tratar de eliminarlo lo mayor posible, si es posible quitarlos. Por que el delay implica que el micro no puede hacer mas nada, esta trabado ahi e incluso si sucede un evento este no puede salir. La union la podrias haber definido afuera. No ocupa espacio y la tenes definida 2 veces, al comienzo y al final. Incluso podrias haber rebuscado con un puntero y hacer lo mismo.

Citar
Este ¿por que? es el que me prunto cada vec que se vuelve a ejecutar el while//principal realmente  spi_read() se bloquea no sale de la interrupcion (segun output_high(PIN_C1);//RS TRUE) solo malamente haciendola ejecutar una y otra vec ¿esta mejor preparado #INT_SSP para esto? pero durante el transcurso del programa no falla nada de esto Este error es continuo cada vec que se vuelve al inicio

El ¿por que? era de la union, pero esto va asi, vos cuando entras a una interrupcion se desactivan, si la interrupcion es del SPI, implica que tenes 1 dato en el buffer, entonces podes usar 1 ves spi_read(), la proxima ves que usas spi_read no hay nada, entonces el programa se cuelga en un while hasta que llegue otro dato. No van a funcionar ni las interrupciones, por que estan desactivadas al estar dentro de una. Y lo unico que te va a sacar de ahi es un dato que llegue al SPI, lo que me preocupa es que la primera pasada funcione bien por que va secuencialmente todo perfecto, pero las demas no por que tal ves esperas que todo vaya orden y perfecto, pero tenes que esperar cosas que lleguen en cualquier momento. Y es ahi donde creo que falla todo

Citar
Cierto ni idea crei que era por el spi en los proyectos sobre este protocolo que vi de otros siempre lo ponian al inicio Si es como dices no deberia poner if defined(__CCS__)

No, en el manual de CCS se encuentra definido que es el __PCM__ entre otros.

Citar
//Que es esto a que te refieres??
Todas las directivas, las que comienzan con " # ", como define, include, etc, la unica excepcion es la de las interrupciones que irian junto con las funciones

Citar
Veras el compilador se me queja que no reconoce tanto variables como funciones si no las declaro antes de #INT_EXT Todas las que esten dentro de esta interrupcion

Si definis variables + prototipos de funciones antes del codigo de cualquier funcion, entonces no deberias tener ningun problema.

Citar
De la misma me entiendo mejor con nombres cortos*
int8 co,con,cont es mi Standar en bucles ´for´ y mas rapido que leer contador*
*Y a menos que esto suponga un fallo en la ejecucion del programa prefiero segir haciendolo a si

No pasa por que vos te entiendas AHORA
Tampoco por que suponga un fallo de ejecucion. Pasan 2 razones:
- Que vos entiendas a futuro:  por experiencia es un dolor de cabeza aprender todos los nombrecitos de las variables cuando dejaste el codigo 1 mes masomenos o mas. Al igual que los comentarios son imprescindibles.
- Que los demas entiendan: es mas facil para otra persona entender lo que estas haciendo, en especial si trabajas en grupo. O pedis ayuda como el caso del foro.

Citar
El nombre no me va ¿pro que implica "!negacion" en una funcion?

Es lo mismo que antes, si no queres ponerle la i,b,v, etc directamente pones un nombre de funcion mas descriptivo. La negacion es un signo de admiracion, no una i latina. Las razones es por lo mismo de antes.
De todas formas es mi recomendacion, vos podes seguir haciendolo y seguir poniendo nombres cortos, solo te lo digo desde el punto de vista de una persona que no esta familiarizada con tu codigo, con lo que hace, con que es cada variable, y encima tener que aprender las miles de variables con nombres raros que no significan nada para mi, es complejo.

Creo que vos no quisieras ver un codigo donde las variables sean a,b,c,d,e,f,g,h,i,j,k,l,etc. es complejo entenderle y mas aprenderselas en un codigo de 700 lineas.

Citar
Algo se atasca siempre en un nuevo inicio dentro de la interrupcion con spi_read no hay posibilidad de quedarse encerrado en ningun bucle dentro de la int_ext Hay algo que pueda anularme el protocolo al final que salga de el si hay redundancia

A no ser que tengas un debugger y poder ver exactamente donde se atasca va a ser MUY dificil de saber que es.
Lo que puedo llegar a pensar es... ir "eliminando" (comentando) parte de lso codigos, o por ejemplo en la interrupcion, quitar los spi_read() y ponerles  los valores que recibiria, de esa forma no quedaria "esperando" y proceder a ver si ese es el problema, sino es dividir por partes el programa y ver que es lo que lo causa, pero mis probabilidades van a que es culpa de la interrupcion.

Incluso podrias cambiar todos los spi_read() por un 0x00, y ver si se cuelga en el while de nuevo.

Citar
Por favor dame un ejemplo de esto cualquier cosa que tengas hecha No importa que no entienda el codigo solo quiero ver como se separa

Con respecto al .h .. esta bastante basico como para indicarlo aca hay un ejemplo:

http://stackoverflow.com/questions/7109964/creating-your-own-header-file-in-c

Ahi tiene otro archivo que llama foo.c el cual tiene una funcion foo(), posee un archivo header foo.h, el cual incluye en el main, de esa forma poder utilizar la funcion foo() , tambien lo incluye en el foo.c de esa forma agrega el prototipo de la funcion, que es masomenos lo que harias.

Entonces no tenes un super archivo de 1000 lineas, sino varios archivos de unas cuantas. Y agrupados en otra forma. Ejemplo podria tener un archivo interrupt.c donde tengo todas las funciones de interrupcion y eso incluye a un .h que tiene los prototipos a esas otras funciones. Etc
« Última modificación: 24 de Octubre de 2015, 14:09:33 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #7 en: 24 de Octubre de 2015, 17:28:37 »
De primero decir que e cambiado micro1 a 18f452 me fije que cuando creas un proyecto te pide si quieres aplicaciones como spi e interrucciones Aunque no las eleji pude añadirlas luego veo que esto pasa tambien con el pic parece que todo se puede moldear a pesar de lo que elijas por defecto

Citar
El ¿por que? era de la union, pero esto va asi, vos cuando entras a una interrupcion se desactivan, si la interrupcion es del SPI, implica que tenes 1 dato en el buffer, entonces podes usar 1 ves spi_read(), la proxima ves que usas spi_read no hay nada, entonces el programa se cuelga en un while hasta que llegue otro dato. No van a funcionar ni las interrupciones, por que estan desactivadas al estar dentro de una. Y lo unico que te va a sacar de ahi es un dato que llegue al SPI, lo que me preocupa es que la primera pasada funcione bien por que va secuencialmente todo perfecto, pero las demas no por que tal ves esperas que todo vaya orden y perfecto, pero tenes que esperar cosas que lleguen en cualquier momento. Y es ahi donde creo que falla todo

Iva a decirte que no funciona #INT_SPP queria mostrarte el error pero ahora derrepente lo acmite no se que e cambiado a parte de quitar #if defined(__CCS__) con este pic no lo acmitia Lo probare

Citar
lo que me preocupa es que la primera pasada funcione bien
A mi me preocupa todo lo contrario
Si no obtengo resultados creo que podre obtar por reset_cpu() Siempre que aprenda a utilizar write_eeproom me acavo de meter en esto Veras e echo esta prueba con lo que se supone que es un cliente nº 1 registrado por defecto

Código: [Seleccionar]
cliente=1;
posicion=read_eeprom (cliente+100);//0-99 tarjeta    100-199 contraseña    200 o +...saldo
///printf(lcd_putc," posicion=%ld",posicion); delay_ms(2000);
if (posicion==255){//por defecto el contenido parece ser FF
contra[1]=1111;                                        // contra[5]=2345; contra[9]=1500; contra[17]=9871;
write_eeprom(cliente+100,contra[cliente]);//falla no se guarda 1111 guarda 87 (es int16) pero se nota el cambio ya no //es=255
//y cuando se resetea el micro no vuelve a entrar aqui dentro
//de hecho si le cambio el saldo durante el programa coincide siempre el nuevo valor "no se resetea a 2015"
saldo[1]=2015;                                           ///  saldo[5]=1400; saldo[9]=550; saldo[17]=50;
//write_eeprom(cliente+200,saldo[cliente]);//esto sera peor porque es int32
}
//supongo que el remedio es make8 o la union que me dijiste

Si aprendo a manejar write y read eeproon esto servira para todo registrado nuevos registros todo se guarda y no importara que se reste_cpu(); en cada pasada

Citar
La union la podrias haber definido afuera. No ocupa espacio y la tenes definida 2 veces, al comienzo y al final.
No entiendo. Una cosa es declarar la union y otra montarla como me dijiste, esto solo lo hago una vec de cada

http://stackoverflow.com/questions/7109964/creating-your-own-header-file-in-c
Si desde hace tiempo esto me interesava Esto ayuda mucho cuando el compilador se pone pesado cuando marca errores en lineas no debidas en codigos largos

Gracias por todo Que tengas un buen finde

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #8 en: 24 de Octubre de 2015, 21:22:02 »
Citar
Si aprendo a manejar write y read eeproon esto servira para todo registrado nuevos registros todo se guarda y no importara que se reste_cpu(); en cada pasada

Una memoria EEPROM posee limite de escritura, un PIC18 a 48Mhz con instrucciones a 89ns cuando termine el while tal ves 10s (siendo totalmente exagerado) despues con todos los delays en la primer pasada o tal ves 2s despues con menos delays, o 100ms despues sin delays exagerando tambien por que seria 1 millon de instrucciones ejecutadas para los 100ms. Si el while dura 10s, tu micro funcionaria por 112 dias, cada 2s son 23 dias, Y cada 100ms un reset con write eeprom es de 1 dia + 3hs, lo que viviria tu eeprom. Asi que no inventes, realmente tenes algo mal, y tenes que arreglarlo.

Citar
Iva a decirte que no funciona #INT_SPP queria mostrarte el error pero ahora derrepente lo acmite no se que e cambiado a parte de quitar #if defined(__CCS__) con este pic no lo acmitia Lo probare

Me parece que es #INT_SSP, el SPP es otra cosa , como cambia con el micro, podes fijarte en el .h que incluis al comienzo. Ahi estan definidas, tal ves en el otro micro tenia otro nombre, y nuevamente __CCS__ no existe.

Citar
No entiendo. Una cosa es declarar la union y otra montarla como me dijiste, esto solo lo hago una vec de cada

Declaraste tu variable y luego declaras una union, la union no ocupa espacio, asi que o importa si lo haces globalmente o dentro de una funcion. ¿ Montarla ? ¿ que es eso? es la primera ves que escucho el termino ese usado en C y no se a que te estas refiriendo, usarla ? crearla ?, usarla la podrias usar en cualquier momento, crearla lo haces debajo de la definicion (o en la misma definicion).

Citar
De primero decir que e cambiado micro1 a 18f452 me fije que cuando creas un proyecto te pide si quieres aplicaciones como spi e interrucciones Aunque no las eleji pude añadirlas luego veo que esto pasa tambien con el pic parece que todo se puede moldear a pesar de lo que elijas por defecto

Es un Wizard, el que te termina armando un pedacito de codigo con funciones asi tenes una guia, nada mas. Podes programar lo que sea que eso no te lo va a limitar.


Citar
Si desde hace tiempo esto me interesava Esto ayuda mucho cuando el compilador se pone pesado cuando marca errores en lineas no debidas en codigos largos

No deberias tener codigos laaaaargos, deberian ser todos cortos. Y me refiero a las funciones en si. No podes tener una funcion como tu main, dividi tu codigo en partes asi podes probar cada parte por separado. Es la idea de hacerlo de esa forma.

-----------------
Como frutilla de postre, o para terminar de ponerle la cereza a la torta:

Necesitas parar de buscarle parches al problema que tenes, no lo va a solucionar. Tenes que arreglar el problema mismo.

Mis consejos para vos si queres que tu codigo funcione son:
- Quita tus spi_read(), delays,while,dowhile,lcd, de las interrupciones. Solo un spi_read() en 1 sola interrupcion que es la de recepcion del SPI, Nada de inventar con otras interupciones como RB0 para el SPI
- Quita todo while y do..while que tengas en cualquier otro lado, solo tenes permitido 1 solo while, Y nada de for( ; ; ). ( Y si es posible hacer esto en todo programa )

Segui eso y lo vas a hacer funcionar. No queres hacer eso? yo no podria ayudarte mas. Si te ayudo tengo que estudiar tu codigo y eso son muchas lineas a ver, sin siquiera saber que necesitas hacer.

Creo imaginar que esto es para un cliente, asi que los consejos van para eso. Si es para vos la placa entonces hacelo como mas te guste. Sos vos el que va lidiar luego con esos problemas. Y esto suponiendo que lo hagas de particular.
Si estas en una empresa (mas si hay varios empleados que manejen codigos) todo lo que dije se deberia aplicar, o al menos una buena parte.

Y no lo dije antes, si a tu codigo no le podes poner un simple numero en ves de un spi_read(), esta mal programado. Asi de sencillo tiene que ser. Ya que deberias poder programar cada cosa por separado.
« Última modificación: 25 de Octubre de 2015, 09:14:58 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #9 en: 27 de Octubre de 2015, 17:58:45 »
¿ Montarla ? ¿ que es eso? (sobre union)
//slave
union UNI M32;//
   for(co=0;co<4;co++){
      M32.bytes[co] = spi_read();   }
//master
union UNI M32;
M32.dat32 =mony;
     for(co=0;co<4;co++) {
      spi_write(M32.bytes[co]);
No se como se define realmente pero a esto le llamo yo montarlas Segun yo M32 es una int32 preparada para ser "montada" en 4 partes mediante su correspondiente bytes[4]

Respecto a todo lo demas en general Me as hecho recordar que hay varios tipos de xeprom y llega un momento que su lectura no es fiable por un curso que hice hace mucho de un 8085 nada de c todo nemonicos insertados mediante un tal EDI
Y si va mas lento Aun a si tengo una duda referente a eeprom que utilidad practica tiene en la realidad e hecho pequeñas pruebas y ahora coinciden todos los valores tanto write como read en simulador nada pasa nada se quema pero veo que solo me sirbe para que no reset a registros que estan por defecto si creo un nuevo registro no es necesario por ejemplo guardar su contraseña en la eeprom esta se mantiene aunque resetees el micro
Tambien esta que este proyecto me tiene :5] Y no veo como solucionarlo :oops: Ni se lo quiero pedir a nadie micro1 es el que mas falla micro2 lo hace algo mejor quizas porque desde el inicio ya se preparo para ser master/slave pero ninguno de los 2 aprobechan la interrupcion como es devido, halgo aprendido hay pero creo que es mejor iniciar uno nuevo aprendiendo de todo lo que estuvo inicialmente mal :?
Citar
si a tu codigo no le podes poner un simple numero en ves de un spi_read()
Seria formidable trabajar para una empresa y cobrar por ello pero solo soy un aficionado A un a si esto ultimo no me parece valido en absoluto
Veras estoy mal-criado por lo que era el viejo VB 6 Tenia programa principal y modulos si queria acceder a una funcion de un modulo hacia lo siguiente modulo1.funcionTal era tambien comodo
Pero en CCS no hay manera de acceder de micro1 a funciones de micro2 (otra cosa es el  incluye a un .h (dentro del mismo micro))
Si hay otra forma me la muestras pero micro1 solo puede acceder a funciones de micro2 de la siguiente forma por lo que e visto
-
micro1 es master micro2 es slave
micro1 le pasa datos junto a una de estas variables contiene el numero de funcion que debe ejecutar micro2
una vec que micro2 obtiene todos los datos los trabaja dentro de la funcion que se le a pedido
combersion micro1 pasa a slave micro2 a master
micro1 recive todos los resultados que opero la funcion de micro2(yo solo conozco spi para esto)
-¿hay alguna forma mas directa de hacer esto?
Si veo cierto que no tienen porque tratar los mismos datos como hize inicialmente pero aunque tanto haya datos como funciones "locales" dentro de ellos en los que no es necesario ningun spi_read() los resultados que operaron si deben ser transmitidos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #10 en: 28 de Octubre de 2015, 01:00:07 »
Citar
Aun a si tengo una duda referente a eeprom que utilidad practica tiene en la realidad

Guardar informacion que no se borre ante la falta de energia, tenes varios tipos de programas y es una consideracion a tener en cuenta.
Tu programa tal ves se ocupe toda la EEPROM, supongamos 256bytes de informacion por ves , pero si lo hace cada 200 por dia, tu sistema tranquilamente duraria funcionando unos 10 años, y 200 veces es MUCHO para cualquier aplicacion que se te ocurra.
Tambien podrias tener el caso de que tuvieras que grabar 32bytes de informacion, Y aprovechas toda la EEPROM, es decir haces 1millon de escritura en las direcciones 0 a 31, luego de 32 a 63 y asi... eso te permite grabar mucho mas. Tal es asi que si fuera ese el motivo y tomando el mismo ejemplo anterior de tamaño de EEPROM , podrias grabar 1600 veces por dia que igual va a durar 10+ años. Aca te estoy dando distintas aplicaciones.

El problema es que en tu caso el programa finaliza rapido, demasiado rapido, y esas 200/1600 veces por dia pasan a valores indecentes. Tales como 500.000/700.000 veces por dia grabando la EEPROM. Lo cual no dura nada.

Citar
Tambien esta que este proyecto me tiene :5] Y no veo como solucionarlo :oops: Ni se lo quiero pedir a nadie micro1 es el que mas falla micro2 lo hace algo mejor quizas porque desde el inicio ya se preparo para ser master/slave pero ninguno de los 2 aprobechan la interrupcion como es devido, halgo aprendido hay pero creo que es mejor iniciar uno nuevo aprendiendo de todo lo que estuvo inicialmente mal :?

Yo veo en vos una falta de conocimientos de C o del microcontrolador y sus tecnologias mas que nada. Tal ves es por que has programado en computadoras como decis con VB6 donde te abstraes completamente del hardware normalmente. Pero por debajo ocurre lo que estas haciendo aca.

Citar
Pero en CCS no hay manera de acceder de micro1 a funciones de micro2 (otra cosa es el  incluye a un .h (dentro del mismo micro))
No, es que normalmente eso no es la practica, vos no tenes funciones del micro1 en el micro2, lo que normalmente haces es delegar funciones al otro micro. es decir que el micro2 se encargue de hacer otras cosas. Y el micro 1 podria estar tranquilamente haciendo otra. Cuando necesite algo del otro micro, por ejemplo supongamos que el micro1 maneja un LCD y el micro2 el teclado, si se presiona algo en el teclado, el micro2 va a ejcutar su funcion, leer que tecla se presiono, ejecutar un antirebote, etc, y avisar al micro1. El micro uno recibira y actuara dependiendo de lo recibido. El micro1 no le importa para NADA lo que hace el micro2.

No tiene razon de ser tener 2 micros creo como estas haciendo vos, en el que envias datos para que el micro2 los procese y luego te los devuelva. El unico caso que esto es viable es si estamos hablando de que el micro2 posea una tecnologia mejor, Supongamos algo simple, tengo que hacer un filtro digital, mi PIC no posee nada, de hacerlo con el PIC no me daria la velocidad, pero tengo otro micro que puede hacer el filtro mucho mas rapido, el tema es que se puede conectar al PIC nada mas. Suponiendo que la comunicacion dure poco (ojo que las comunicaciones SON lentas) ahi si le envio los datos al otro micro y que me los devuelva.

A lo que lleva a tu pregunta:
Citar
-¿hay alguna forma mas directa de hacer esto?

Si, en el mismo micro. Es demasiado exigente las cosas que necesitas hacer como para involucrar otro micro?, con el costo de 2 micros te compras un micro mejor, mas rapido y con mas memoria. Y tenes todo en un solo microcontrolador.
No queres renegar con maestro/esclavo, usa la UART, es mas lenta que el SPI, pero es full-duplex.

Todavia ahora no se que hacen los codigos de cada uno de tus micros, o que tareas deben llevar a cabo. Asi que no puedo decirte demasiado, o decirte que con un micro te sobra.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #11 en: 30 de Octubre de 2015, 08:58:18 »
En lo que se refiere a este proyecto e pasado algo por alto Aunque estilizase reset_cpu() para tapar una champuza que no se resolver Todo lo hace bien dentro de lo que cabe y esto no supone prácticamente nada malo para la eeproom Si la lee constantemente en cada reset pero lo que es escribir en ella solo lo hace una vec Y tengo entendido que es el constante write el que acaba machacándola
En caso de corte de corriente Si seria bueno escribir en algunos casos si la idea seria variable tarje[5]=0 no se hace nada se pasa de todo pero si tarje[6]=1 Es un cliente registrado y necesitaría unas 1-2-4 posiciones de eeproom int1 tarjeta
  • int16 contraseña
  • int32 saldo

¿Se puede simular un apago en proteus?

También os escribo y siento molestar a vos con lo mismo ya que en un momento dado tendréis cosa mas importantes que hacer
Citar
Con respecto al .h ..
No lo e conseguido No creo que sea porque la pagina esta en ingles Visualmente es muy esplicita
pero creo que faltan cosas que da por supuesto que yo debería saber
Un par de códigos completos señalando las partes que me interesan estaría bien

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #12 en: 30 de Octubre de 2015, 09:20:37 »
Tengo que darte ejemplos simples igual, creo que esto resumen bastante las cosas

main.c
Código: C
  1. #include <picxxxxxxx.h>
  2. #include "funciones.h"
  3.  
  4. void main(){
  5.    while(1){
  6.      funcion1(PARAMETRO_1);
  7.     funcion2();
  8.   }
  9. }

funciones.c
Código: C
  1. #include "funciones.h"
  2.  
  3. #define xxxxxx x     // Si solo pensas usarlo aca dentro
  4. int8    bla, ewq, qwe;
  5. int16 eeee;
  6. extern volatile int8 var_interrupcion; // Accedo a la variable var_interrupcion definida en el otro .C (se usa en los 2 archivos)
  7.  
  8. void funcion1(int8 parametro){
  9.    //funcion 1
  10. }
  11.  
  12. void funcion2(){
  13.    //funcion 2
  14. }

funciones.h
Código: C
  1. #ifndef FUNCIONES_H_   /* guarda para no incluirse varias veces */
  2. #define FUNCIONES_H_
  3.  
  4. #define PARAMETRO_1  xxx
  5.  
  6. //Prototipo de funciones, cualquiera que tenga incluido este archivo podra acceder a las funciones definidas aca.
  7. void funcion1(int8 parametro);
  8. void funcion2();
  9.  
  10. #endif // FUNCIONES_H_

interrupciones.c
Código: C
  1. volatile int8 var_interrupcion;
  2.  
  3. #INT_SSP
  4. void InterrupcionSSP(){
  5.      if( var_interrupcion) xxxxx;
  6. }

El unico while es el del main.
« Última modificación: 30 de Octubre de 2015, 09:24:41 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Problema al iniciarse el ciclo While principal de programa
« Respuesta #13 en: 31 de Octubre de 2015, 11:09:42 »
NADA despus de fracarsar con mis codigos e cortado y copiado practicamente todo esto. Todo esta dentro de la misma carpeta . ¿Que falta ahora?

Nombre: principal.c
Código: [Seleccionar]
//Aqui si le doi a open_all_files solo aparece su 16f877.h y el funciones.h que e tenido que crear por mi cuenta
#include <16f877.h>
#include "funciones.h"

void main(){
  while(1){
     funcion1(PARAMETRO_1);
    funcion2();
  }
}
//*** Error 112 "principal.c" Line 7(1,1): Function used but not defined:  ... funcion1 450  SCR=657

Name: funciones.c
Código: [Seleccionar]
//Aqui no se me permite open_all_files disable
#include "funciones.h"
//#define "funciones.h"  //es indistinto ponerlo No entiendo el concepto de si solo quiero utilizarlo dentro
//las funciones solo se operan aqui dentro pero los resultados an de salir fuera
int8    bla, ewq, qwe;
int16 eeee;
void funcion1(int8 parametro){
bla=parametro; ewq=5; qwe=5;
eeee=parametro*10;
}
void funcion2(){
bla=0; ewq=0; qwe=0;
eeee=1;
}

//*** Error 128 "C:\Users\TEMP.desde-PC.000\Documents\MISPROYECTOS\separacodigo\funciones.h" Line 3(9,15): A #DEVICE required before this line
Name: funciones.h
Código: [Seleccionar]
//Esto no lo deberia qrear automaticamente desde programa principal??
//Lo e tenido que hacer yo y el compilador nunca acaba de compilar se bloquea
#ifndef FUNCIONES_H_
#define FUNCIONES_H_
#define PARAMETRO_1  100 // indistinto si pongo ";"
void funcion1(int8 parametro);
void funcion2();
#endif //