Webcampista.com

mucho más que un foro

PIC 18f4550 y CCS compiler

Pues si, la deteccion es otra cosa, Ayer tras varias pruebas, forzar la desabilitacion y habilitacion de las interrepciones, poner un delay para los rebotes, ponerle imanes a los coches mas bajo de lo normal para augmentar el campograbitatorio, para mejorar la captacion, poner un condensador de 200nf en paralelo al captador. Conseguimos, sobre todo con el concensador, que la captacion fuera como un clavo, con un coche, ha la que volvemos a poner los dos, mierda, si solo fuera al pasar por meta estaria claro que la respuesta no es lo suficientemente rapida, pero en ocasiones el coche uno me activa el paso 2 o sin pasar ninguno por meta, se me activa el paso 2.

Así que decidimos mirar hoy con un oscilo que es lo que pasa, y que señal hay. Así que esta tarde os lo digo.

Os dejo el codigo con el que estado trasteando ayer.

YA no hay delays largos, jejejejeje

PHP:
#include <18F4550.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12                    //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4                  //System Clock by 4
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES VREGEN                   //USB voltage regulator enabled
#FUSES ICPRT                    //ICPRT enabled

#use delay(clock=8000000)
#use i2c(Master,Fast,sda=PIN_B0,scl=PIN_B2)
#use fast_io (A)
#use fast_io (B)
#use fast_io (C)
#use fast_io (D)



#int_RB
void  RB_isr(void) 
{
   disable_interrupts(GLOBAL) ;
   if(input(pin_B4)==0)
      {
      output_bit(PIN_d0,~input(pin_d0));
      }
    if(input(pin_B5)==0)
      {
      output_bit(PIN_d1,(~input(pin_d1)));
      }
   if(input(pin_B6)==0)
      {
      output_bit(PIN_d2,(~input(pin_d2)));
      }
   if(input(pin_B7)==0)
      {
      output_bit(PIN_d3,(~input(pin_d3)));
      }
   delay_ms(20);
   enable_interrupts(GLOBAL);
}

/*#int_COMP
void  COMP_isr(void) 
{
   if(C1OUT==1)output_high (pin_D4);
   else output_low (pin_D4);
   if(C2OUT==1)output_high (pin_D5);
   else output_low (pin_D5); 
}*/



void main()
{
   set_tris_D (0b11000000);
   set_tris_A (0b11111111);
   set_tris_B (0b11111100);
   
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  
   
   
   //setup_vref(VREF_LOW|15);
   //setup_comparator(A0_VR_A1_VR);
   
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RB);
   //enable_interrupts(INT_COMP);
   
   setup_oscillator(OSC_8MHZ|OSC_TIMER1|OSC_31250|OSC_PLL_OFF);
   output_D(0);
   // TODO: USER CODE!!
   while(1);
}
 
Oscar mirate el correo dentro de spam, es posible que mi respuesta se te haya ido allí por el link que te he puesto, pues el que me mandastes tu ayer a las 20:46 se me ha metido en la carpeta de posible spam.
 
Joer con el puñetero comapardor......

Aun ha riesgo de parecerme a cierto entrenador de futbol...... PORQUE??????????????? no entiendo PORQUE??????????????????? Alguein me podria decir PORQUE?????????

Me explico. Ayer ademas de probar las interrupciones, cuando estamos espesos, nos pusimos el profe y yo a diseñar las funciones, y esta mañana por indicacion del profe, si, si oscar, el profe, ahora se acuerda de que tiene un alumno....., he montado un sencillo programa para el pic16f627, y mira tu por donde...... finciiona to, almenos en proteus.....

Os pongo el código.

/*
RB1 <- RX
RB2 -> TX
RB3 -> CCP1
RB4 <- BUTTON_ON
RB5 <- BUTTON_OFF
*/

#include <16f627a.h>

#fuses NOWDT,NOPROTECT,NOPUT
#fuses NOBROWNOUT,NOMCLR,NOLVP,INTRC_IO,NOCPD

#use delay (clock=4000000)
//#use fast_io(a)
//#use fast_io(b)

#use standard_io(a)
#use standard_io(b)


#use i2c(master,sda=pin_b1,scl=pin_b2)

int dec7[10]={0b0111111, //0
0b0000110, //1
0b1011011, //2
0b1001111, //3
0b1100110, //4
0b1101101, //5
0b1111101, //6
0b0100111, //7
0b1111111, //8
0b1101111}; //9

void saa1064_putc(int,int,int,int);
char buffer_car[5];
int vueltas_car1;
int vueltas_car2;

#INT_RB
int1 int_rb_rb4()
{
if(input(pin_b5)==0){
vueltas_car1++;
if(vueltas_car1==100) vueltas_car1=0;
sprintf(buffer_car,"%02u%02u",vueltas_car2,vueltas_car1);
saa1064_putc(buffer_car[0]-0x30,buffer_car[1]-0x30,buffer_car[2]-0x30,buffer_car[3]-0x30);

//if(input(pin_b5)==0){
output_high(pin_a3);
delay_ms(150);
output_low(pin_a3);
}
}

#INT_COMP
void int_comp_a0_a1()
{
if(c1out==1){
output_high(pin_a3);
delay_ms(1000);
output_low(pin_a3);
}
}

void main()
{
//set_tris_a(0b11110111);
//set_tris_b(0b11101100);

enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
enable_interrupts(INT_COMP);

setup_vref(VREF_HIGH|8);
setup_comparator(A0_VR_A1_VR);

output_low(pin_a3);
vueltas_car1=0;
vueltas_car1=0;

saa1064_putc(0,0,0,0);


//sleep();
while(1);
}

void saa1064_putc(int d4,int d3,int d2,int d1)
{
i2c_start();
i2c_write(0b01110000); //dirección
i2c_write(0x00);
i2c_write(0b1000001); //modo dinámico, sin parpadeo, 12mA

i2c_write(dec7[d1]);
i2c_write(dec7[d2]);
i2c_write(dec7[d3]);
i2c_write(dec7[d4]);

i2c_stop();
}

Si os fijais las lineas de configuracion son igules, entonces PORQUE???? este si hace lo que tiene que hacer y el 18 no?????

Lstima que este pic solo tenga 4k de memoria y la i2c se la tengamos que hacer por sofware, con lo que problablemente no tenga suficiente memoria, por que sino este finde tendria liquidado el gestor, y tendria una semana pal box.

P.D. Oscar visto que nuestros correos no pitan muy bien, nos vemos a las 18:30 en el chat?????
 
Bueno, leí esta mañana los otros mensajes y ahora este ultimo.

¿Cual es el compilador del Proteus? ¿es el CCS? eso es una diferencia importante. aparte, ya se sabe que en el simulador todo funciona y luego...

Ya tengo instalado el CCS 4 no se qué, a ver si así puedo comparar.
He mirado por encima y he visto una directiva noclear si es lo que pienso, es decir, que no borre la interrupción, es que las borra él solo, pero por si acaso, echo en falta la instrucción que borra la interrupción en el comparador, sería algo así:


#INT_COMP
void int_comp_a0_a1()
{
.....if(c1out==1)
.....{
........output_high(pin_a3);
........delay_ms(1000); // esto es 1 segundo, en este tiempo,
.........................// como pase un coche por el detector,
.........................//
no le hará ni caso.
........output_low(pin_a3);
.....}
.....clear_
interrupt(INT_COMP); //esta es nueva, por si acaso
}

lo mismo se puede hacer con RB.

También has puesto en la referencia 8 y en el otro 15.


Me llaman, luego vuelvo...
 
Pues no oscar, creo que el tema esta en el hard, o en la configuracion incorrecta. el esquema lo tienes arriba.

Te cuento lo que me pasa, poniendo el tester sobre las resistencia del coche1, si el coche 1 circula en el tester tengo la tension, Si el coche 1 no circula pero si lo hace el 2 el tester me hace una lectura de 4,85 a 5,65 v, de donde viene este voltaje??????
 
Un momento...

Los círculos que hay encima de los detectores ¿son los motores?, pues ahí hay algo raro, por un lado conectas el positivo de la batería a una pata del PIC (en el de la derecha) y por otro conectas el negativo (masa, en el de la derecha)

¿Esto lo dices por que en el proteus funciona?... ya sabes lo que opino de los simuladores... aparte, en el proteus no hay problemas de tensiones ni nada de eso.

Ya sabes donde estoy, por si te pasas...
 
aqui una imagen que vale mas que mil palabras.
esquema comparador.jpg
 
no en proteus no puedo simular los comparadores internos, sopena no carges la libreria del 6.

Haber el esquema me he ahorrado un par de cosas, como la resistencia variable que hay en el mando que transfiere la tension al motor, jejeje

que yo vea ambas estan sacadas del positivo, o almenos en la realidad ambas son positivas.

en el código, ya esta puesta tu última recomendación, pero creo que el tema del comparador esta en solucionar este reflujo.
 
Ahora si, pero en el esquema anterior no... por cierto, le pondría un zener de 5V1 de la pata del PIC a masa, los 5.36 son por que está actuando el diodo de protección del PIC...

Lo que pones que pasa se parece más a un fallo del PIC que del circuito... ¿como si no llegan los 5V a la pata del PIC? (suponiendo que el cableado real sea como el esquema que pones)
 
estoy alli, en 1c1, no????
 
Aqui el esquema con los zeners.

esquema comparador.jpg
 
pues entonces ya es tema de soft, porque no va, como bien dices ahora esta bien protegido, ya no tengo el reflujo raro de antes, cuando uno corre el otro es 0 en todos los puntos.
 
Aaaaahora caigo, tal y como lo tenías antes, no tenías referencia a negativo, es decir, la pata, o estaba al aire (un uno, o ruido) o estaba a positivo a través del d1 y d2, ahora al poner el zener no solo lo has protegido si no que le has metido una tensión negativa (bueno, 0V) cuando no hay tensión. no es una buena referencia, pero debe funcionar, ahora te sobran D1 y D2, el zener también se come los picos negativos, si los hubiera, y tendrías mejor la referencia (0V) a través del motor.
 
Pero el problema del software creo que sigue estando, por lo menos en el comparador... ¿no?

PD: vuelve al chat...
 
Lo siento, reedito-- lo tenia abierto desde hace rato y me habia tirado del server, me he perdido las ultimas entredas
---------------------------
Navegante,

ya te han comentado lo de las entradas del comp sobre RA...lo mismo para los circulos y la BAT1

El valor de las R de pull-up es un poco alto,no? eso puede hacer que sean demasiado sensibles frente a interferencias...si el cableado esta bien probaria 10K con 100nF, da una tau sobradamente rapida, si el cableado es largo hay que apantallar el cable y mejor poner condensadores tambien en las entradas de la pcb, pero que vayan a una "buena masa corta"
--------------
Entiendo que pasas de las resistencias internas de pull-up de RB del 18F por tanto no activas RBPU, correcto?
-------------
Tienes un condensador de desacoplo entre las patas de alimentacion del micro?, imprescindible que sea lo mas proximo posible al chip y es obligatorio que esté puesto !!!
-------------
La fuente que alimenta el chip es la misma que alimenta los motores de los coches ?, tienen la masa comun? ....de los +12V sacas +5V con un 7805 o parecido?

No se corresponden los pines definidos para i2c, pero no es el problema.
O si?, I2C usa int's? espera el ack y no llega? no se....
 
sep, estoy en el chat
 
Lo siento, reedito-- lo tenia abierto desde hace rato y me habia tirado del server, me he perdido las ultimas entredas
---------------------------
Navegante,

ya te han comentado lo de las entradas del comp sobre RA...lo mismo para los circulos y la BAT1

El valor de las R de pull-up es un poco alto,no? eso puede hacer que sean demasiado sensibles frente a interferencias...si el cableado esta bien probaria 10K con 100nF, da una tau sobradamente rapida, si el cableado es largo hay que apantallar el cable y mejor poner condensadores tambien en las entradas de la pcb, pero que vayan a una "buena masa corta"
--------------
Entiendo que pasas de las resistencias internas de pull-up de RB del 18F por tanto no activas RBPU, correcto?

Ahora miro esto del cable y las resistencias.
-------------
un condensador de desacoplo entre las patas de alimentacion del micro?, imprescindible que sea lo mas proximo posible al chip y es obligatorio que esté puesto !!!

Ok que valor le pongo?????
-------------
fuente que alimenta el chip es la misma que alimenta los motores de los coches ?, tienen la masa comun? ....de los +12V sacas +5V con un 7805 o parecido?

Los coches usan su fuente y el pic otra, pues inytente aprovechar la de los coches y el pic se volvia loco, asi que muerto el perro, muerta la rabia, la masa es comun.

se corresponden los pines definidos para i2c, pero no es el problema.
O si?, I2C usa int's? espera el ack y no llega? no se....

por lo que he leido ACK.
 
Con la tension en la ventana de 5V a 0V no va a hacer nada, presenta muy alta impedancia y representa que no esta conectado.

Si lo que queremos es tener una tension proporcional a los 14V escalada a 5V, entonces lo que hay que poner es un divisor de tension con resistencias.

En plan simple hacemos un divisor 3:1, es decir 15V/5V, lo mas facil es coger tres resistencia iguales por ejemplo 4k7 o 3k3 y conectarlas en serie, entre los 15V (14) y masa, la segunda pata de la R conectada a masa tiene Xv/3, o sea si la entrada a la serie oscila entre 0 y 15V sobre la primera R oscilara entre 0V y 5V

En el segundo nodo no se utiliza, no olvidar los condensadores.

En plan fino se pone un R de ajuste multivuelta cermet y se calibra sobre esa proporcion al gusto.
 
ya se me hace tarde, el ack es el Acknowledgement, es el bit de respuesta que espera el master del slave del I2C para saber que esta alli y le esta haciendo caso. eso lo hace a cada final de byte que le envia.

Si no le responde por que las lineas estan equivocadas de scl y sda anem malament, pero no se si solo es error de proteus o de hard real.
 
insisto, con int's es imprescindible que las señales sean limpias, con els osc no veras picos esporadicos que te volveran loco,
es imprescindible el condensador de desacoplo sobre el chip, las masa comunes pueden dar problemas, per es complicado medir V de forma optoacoplada, las masas de los condensadores de desacoplo de las entradas tienen que ser cortas respecto a la pata negativa del chip y de su condensador, las otras patas tambien, claro.
 
Toma, me había saltado el mensaje gordo de Gerard

Gerard, si no recuerdo mal, lo que quiere medir es el momento en que arranca el coche, en ese momento tal y como está hecho el sistema del excalectric la tensión en el motor cae un poco y creo que es lo que quiere medir, entonces no hace falta el divisor, salvo que la tensión de arranque esté por encima de 5V o tenga una tabla con la tensión de arranque de cada motor.

Si falla el ACK del I2C, el problema está en el otro PIC...
 
Arriba
© 2004-2024 Webcampista.com