Autor Tema: el t1gval del timer 1 no hace toggle con timer 0  (Leído 3706 veces)

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

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
el t1gval del timer 1 no hace toggle con timer 0
« en: 25 de Febrero de 2011, 08:44:13 »
buenas.


como siempre saludos a tod@s.

el caso es que en mi camino de ir aprendiendo a manejar modulos del PIc, pues despues de aprender a usar los lcd, las interrupciones, y el rs232, me he metido con el modulo mtouch....

para ello hay que controlar el timer0 y el timer 1.

el timer0, ya lo controlo (mas o menos), y se configura para que en cada desbordamiento provoque una interrupcion y esta ademas nos cambia Toglee el pin de eneble de la puerta del timer1, pero, lo simulo en MPsim y no cambia. si que veo que el timer0 desborda, pero no cambia el t1gval....

estoy adaptando un programa que vi en assembler de un tal graham, que explica como usar los m,touch, con lo cual voy aprendiendo paso a paso el funcionamiento porque lo tiene muy documentado.


os pongo la parfte de codigo que configuro el timer0 y el timer 1.

si quereis os voy posteando el codigo, pero es algo largo y chapucero (esta puesto por mi...)..


Código: C
  1. //********************************************************************
  2. //CONFIGURACION DE PUERTOS
  3. //********************************************************************
  4. void INIT(void)//OSCILADOR CON OSCON Y TIMER CON OPTION_REG
  5. {
  6. OSCCON = 0b11111011;//OSCCON = 0b11101011; //RELOJ INTERNO
  7. OSCTUNE = 0b00000000;
  8. INTCON=0b00000000;      //DESABILITA TODAS LAS INTERRUPCIONES
  9.  
  10. //INICIALIZACION DE VAR.
  11. CAPCH15_H = 0;
  12. CAPCH15_L = 0;
  13. //INIC PORTA
  14. //IOCA  = 0x00; WPUA  = 0x00;
  15. PORTA = 0x00; LATA = 0x00; ANSELA = 0b00000000; TRISA = 0b00000000;
  16. //INIC PORTB
  17. //IOCB  = 0x00;
  18. WPUB = 0X00;
  19. PORTB = 0x00; LATB = 0x00; ANSELB = 0x00; TRISB = 0b00000000;
  20. //INIC PORTC
  21. PORTC = 0x00; LATC = 0x00;  TRISC = 0b10000000;                
  22. //INIC PORTD
  23. PORTD = 0x00; LATD = 0x00; ANSELD = 0b10000000; TRISD = 0b10000000;
  24. //CONFIGURA EL TIMER0
  25. OPTION_REG      = 0b11000101;
  26. //CONFIGURA EL TIMER0
  27. TMR0IE =1;
  28. //el cap sensing
  29. //T0XCS = 0;
  30. //TMR0CS=0;
  31. CPSCON0=0b10001100;
  32. CPSCON1=0b00001111;
  33. //
  34. //CONFIGURA EL TIMER1
  35. T1CON=0b11000100;       //TIMER1 CONTROL REGISTER
  36. T1GCON=0b11100001;      //CONFIGURA EL GATE
  37. //CONFIGURA EL TIMER1

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: el t1gval del timer 1 no hace toggle con timer 0
« Respuesta #1 en: 25 de Febrero de 2011, 09:46:58 »
  Yo no tengo mucha experiencia con los PIC, y con los datos que das no me es suficiente como para llegar a entender que es lo que intentás hacer.

  Faltaría indicar el pic que estás utilizando y también poner el código, o al menos la parte en la que manejas el desbordamiento del timer0. Para ver porque es que no te cambia el pin. Tené en cuenta que además de tener que habilitar la interrupción del timer0 (que ya lo hacés con la línea "TMR0IE = 1") tenés que habilitar las interrupciones globalmente. En muchos PIC se logra haciendo 1 el bit GIE del registro INTCON.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: el t1gval del timer 1 no hace toggle con timer 0
« Respuesta #2 en: 28 de Febrero de 2011, 10:37:46 »
HOLA Y PERDON POR NO CONTESTAR ANTES, HE ESTADO COMPROBANDO ALGUNAS COSILLAS:

El pic que uso es el 16f1937, porque estoy aprendiendo a usar todos sus modulos y me parecio el mas completito...

y si, creo que habilito las interrupciones, pero por lo que explica este señor (en ingles), no hace falta habilitar interrupciones, si no que como estamos destro de la interrupcion, la interrupcion se produce pero no salta. ahora, si, el t1gval, siempre cambia de estado al desbordarse el tmr0, "toogle", como flip-flop, y eso es precisamente lo que no veo que haga...

te adjunto la parte de gestion de interrupciones:


Código: C
  1. //********************************************************************
  2. //RUTINA DE INTERRUPCIONES
  3. //********************************************************************
  4. static void interrupt isr(void)
  5. {
  6. di();
  7. if (TMR0IF==1)
  8.         {
  9.         if (RB0 = 0) {RB0 = 1;__delay_us(10);RB0 = 0;} else {RB0 = 1;__delay_us(10);RB0 = 0;}
  10.         if (T1GVAL == 0)
  11.                 {
  12.                 TMR1ON = 0;             //STOP TIMER1 - NOT REALLY NECESARY
  13.                 COUNT_L = TMR1L;        //SAVE ITS CONTENTS
  14.                 COUNT_H = TMR1H;
  15.                 switch (CPSCON1)        //VEMOS QUE CANAL ES EL ACTIVO
  16.                         {
  17.                         case 0x0F:
  18.                                 {
  19.                                 CPSCON1 = 0b00001111;   //AQUI PREPARAS EL REGISTRO PARA EL SIGUIENTE CANAL PARA LA PROXIMA VEZ
  20.                                 if ((CAPCH15_L ==0x00) && (CAPCH15_H == 0x00))
  21.                                         {
  22.                                        
  23.                                         //ISFIRSTTIME_15:
  24.  
  25.                                         CAPCH15_L = (PRESSTHRESHOLD_L - COUNT_L);
  26.                                         CAPCH15_H = (PRESSTHRESHOLD_H - COUNT_H);
  27.                                         goto BUTTONCHEKEND;//GOTO BUTTON CHECK ENDS;
  28.                                         }
  29.                                 else
  30.                                         {
  31.                                         COUNT = COUNT_H;
  32.                                         COUNT = COUNT <<8;
  33.                                         COUNT = COUNT | COUNT_L;
  34.                                         CAPCH15 = (CAPCH15_H<<8);
  35.                                         CAPCH15 = CAPCH15 | CAPCH15_L;
  36.                                         if (COUNT < CAPCH15)
  37.                                                 {                               //AL SER MAS PEQUEÑO ACTUAMOS
  38.                                                 RB2 = 1;
  39.                                                 goto BUTTONCHEKEND;
  40.                                                 }
  41.                                         else
  42.                                                 {                               //ES QUE ESTA NO PULSADO (RELEASE)
  43.                                                                                 //CHECAMOS DE NUEVO PERO AÑADIENDO EL RELEASE THRESHOLD PARA TENER HYSTERESYS
  44.                                                 CAPCH15_L= (CAPCH15_L + RELEASETHRESHOLD_L);
  45.                                                 COUNT_L = (COUNT_L - CAPCH15_L);
  46.                                                 PASSARG1 = (PRESSTHRESHOLD_L + RELEASETHRESHOLD_L);
  47.                                                 if (COUNT_L > PASSARG1)         //EST QUE NO SE HA PULSADO
  48.                                                         {
  49.                                                         RB2=0;
  50.                                                         goto BUTTONCHEKEND;    
  51.                                                         }
  52.                                                 break;
  53.                                                 }
  54.                                         }
  55.                                 break;
  56.                                 }
  57. //aqui chequear mas canales si quieres
  58.                         default://la opcion por defecto
  59.                                 {
  60.                                 }
  61.                 }//fin del switch
  62. BUTTONCHEKEND:
  63.                 //      TMR1ON = 1;                                     //nota de truco de graham
  64.                         TMR0 = 0xFF;
  65.  
  66. mm:                     if (T1GVAL == 1)
  67.                         {
  68.                         TMR1L=0;
  69.                         TMR1H = 0;
  70.                         TMR0 = 0;
  71.                         TMR1ON = 1;
  72.                         TMR0IF = 0;
  73.                         ei();
  74.                         return; //sale de la interrupción
  75.                         }
  76.                         else
  77.                         {
  78.                         goto mm;//BUTTONCHEKEND;
  79.                         }
  80.  
  81.  
  82.  
  83.  
  84.                 }
  85.         else
  86.                 {
  87.                 goto BUTTONCHEKEND;//GOTO BUTTON CHECK ENDS;
  88.                 }
  89.  
  90.         //ei();
  91.         }
  92. else            //si no es por timer0
  93. {
  94.         TMR1L=0;
  95.                         TMR1H = 0;
  96.         TMR0IF = 0;
  97.                         TMR0 = 0;
  98.                         TMR1ON = 1;
  99.                
  100.                         ei();
  101. return;
  102. }
  103.  
  104.  
  105.  
  106. }//fin de isr
  107. //



no me importa postear el programa entero si es necesario.


gracias :-/

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: el t1gval del timer 1 no hace toggle con timer 0
« Respuesta #3 en: 28 de Febrero de 2011, 10:59:40 »
  Si nunca habilitás las interrupciones globales, el programa nunca va a "saltar" hacia la rutina de interrupciones.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: el t1gval del timer 1 no hace toggle con timer 0
« Respuesta #4 en: 28 de Febrero de 2011, 13:07:47 »
ya, si a eso llego, pero el truco esta, en que cuando desborda el timer0, saltamos a la interrupcion.

eso lo hace perfecto.

y ahora viene el truco:

supongamos que el t1gval estaba a "0", entonces, segun la configuracion de "toggle", pasa de "0" a "1".

atiendo la interupcion y para volver a poner  el tgval a "0" usamos el truco:

cargamos el timer0 con 0Xff (para que desborde en un tiempo muy, muy corto.
el timer0 desborda, lo cual si hace. pero como no hemos habilitado las IRQs, pues no salta a ningun sitio, pero el bit tgval si pasa de "1" a "0".
que es justamente lo que no veo que realice.

y de esa manera salgo de la IRQ, sabiendo que tengo el bit de enable del gate a "0".


si ves que no me entiendes te posteo el texto explicativo del señor que lo explica en ingles....

PD: realmente lo que queremos es usar el timer0 como base de tiempos para por el timer1 leer pulsos.


saludos y mil gracias :P

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: el t1gval del timer 1 no hace toggle con timer 0
« Respuesta #5 en: 28 de Febrero de 2011, 14:25:51 »
  Mirá lo que dice el datasheet

Note:
Enabling Toggle mode at the same time as
changing the gate polarity may result in
indeterminate operation.

  ... y justamente al hacer

Código: C
  1. T1GCON=0b11100001;

  Estás habilitando el gate y configurando el resto de las cosas al mismo tiempo. Podrías probar configurando dicho registro pero siempre teniendo en bajo el bit 7. Luego en una línea posterior llevar a 1 el bit 7, que es el que habilita el gate
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: el t1gval del timer 1 no hace toggle con timer 0
« Respuesta #6 en: 01 de Marzo de 2011, 03:45:13 »
GRACIAS:

lo he hecho como me dices, pero tampoco.

cuando llego a estas lineas de codigo:

Código: C
  1. BUTTONCHEKEND:
  2.                         //TMR1ON = 1;                                   //nota de truco de graham
  3.                         TMR0 = 0xFF;
  4.  
  5. mm:                     if (T1GVAL == 1)

tengo desabilitadas las IRQs, cargo el tmro con FF y en lo que desborda deberia el T1GVAL cambiar, que esta a cero para pasar a ser "1", pero no lo hace.

lo estoy probando con el MPSIM porque con el IDC3 lo veo peor.

como ves, he intentado teniendo el timer1 encendido, pero nada. yo por si, he puesto la c decias en el anterior post.


seguiremos buscando...

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: el t1gval del timer 1 no hace toggle con timer 0
« Respuesta #7 en: 01 de Marzo de 2011, 06:16:39 »
ESTA ES LA PAGINA DEL SEÑOR QUE LO EXPLICA EN INGLES:

http://pcbheaven.com/circuitpages/PIC_Capacitance_Sensor_with_Multitouch_Function/?p=0

A ver si asi, lo ves mejor.

yo estoy con el oscilos y cambiando el software para verlo de poco en poco.

lo que saco en claro, es que por mas que diga microchip, lo del debug no es fiable (lineas que me saltan de dos en dos, registros que no veo que se actualicen)...
tengo el IDC3 y tambien el REAL ICE, pero nada...

y eso que microchip no dice que tenga limitaciones.

eso si, tanto poder ver variables en tiempo real pero para Hitecht del PIC16 no funciona....


que lastima

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: el t1gval del timer 1 no hace toggle con timer 0
« Respuesta #8 en: 02 de Marzo de 2011, 04:40:36 »
BUENAS, SIGO AVANZANDO:

 :shock:

yo creo que el T1GVAL si cambia, que no lo veo por algun fallo del MPLAB cuando simula , pues no seria de extrañar.

he ido colocando unas "marcas" usando una salida por ejemplo RB0, para activarla o apagarla, segun pasa por las diferentes partes del programa, y lo visualizo en el osciloscopio y parece que si cambia y corre.

aun asi, no me funciona, pero creo que es que todavia no he cogido el concepto de como capturar la frecuencia y medirla, pues veo que en principio el mtouch, funciona asi.

1- capturamos al principio la frecuencia del touch,
2- vamos comparando la del principio con las demas, cuando pulsamosues  vemos como varia la frecuencia.

3- segun el cambio de frecuencia actuamos.


creo que voy por buen camino, pero me quedan algunas dudas de concepto para  rematar y que me funcione.


saludos y gracias
 :D

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: el t1gval del timer 1 no hace toggle con timer 0
« Respuesta #9 en: 03 de Marzo de 2011, 08:39:49 »
 :-/

hurra!! conseguido!!!


despues de tanto estudiar, ha dado resultado...

pego un trozo de codigo donde detecte el problema:

Código: C
  1. static void interrupt isr(void)
  2. {
  3. di();
  4. if (TMR0IF==1)
  5.         {
  6.        
  7.         if (RB0 == 0) {RB0 = 1;} else {RB0 = 0;}//marca para ver en el oscilos
  8.         if (T1GVAL == 0) {RB1 = 0;} else {RB1 = 1;}//marca para ver en el oscilos
  9.         if (T1GVAL == 0)
  10.                 {
  11.                
  12.                 TMR1ON = 0;             //STOP TIMER1 - NOT REALLY NECESARY
  13.                 COUNT_L = TMR1L;        //SAVE ITS CONTENTS
  14.                 COUNT_H = TMR1H;
  15.                 switch (CPSCON1)        //VEMOS QUE CANAL ES EL ACTIVO
  16.                         {
  17.                         case 0x0F:
  18.                                 {
  19.                                 CPSCON1 = 0b00001111;   //AQUI PREPARAS EL REGISTRO PARA EL SIGUIENTE CANAL PARA LA PROXIMA VEZ
  20.                                 if ((CAPCH15_L == 0x00) && (CAPCH15_H == 0x00))
  21.                                         {
  22.                                        
  23.                                         //ISFIRSTTIME_15:
  24.                        
  25.                                         CAPCH15_L = TMR1L;
  26.                                         CAPCH15_H = TMR1H;
  27.                                         CAPCH15 = CAPCH15_H;
  28.                                         CAPCH15 = CAPCH15 << 8;
  29.                                         CAPCH15 = CAPCH15 | CAPCH15_L;
  30.                                         goto BUTTONCHEKEND;//GOTO BUTTON CHECK ENDS;
  31.                                         }
  32.                                 else

al hacer esto:
COUNT_L = TMR1L;   //SAVE ITS CONTENTS
COUNT_H = TMR1H;

pues correcto

pero despues hacia:

CAPCH15_L = COUNT_L;
CAPCH15_H = COUNT_H;

!!Y ESTO ES LO QUE NO HACIA BIEN"!!!  TODAVIA NO SE LA EXPLICACION!! :shock:


LO CAMBIE POR:

CAPCH15_L = TMR1L;
CAPCH15_H = TMR1H;


Y FUNCIONANDO.


YO AHORA QUIERO TRANSLADAR ESE CONTEO DE PULSOS A FRECUENCIA Y TRABAJAR CON  EL VALOR DE FRECUENCIA.


POR OTRO LADO, AHORA ME VEO CON LOS CONOCIMIENTOS ASENTADOS Y ME PREGUNTO SI SERIA BUENA IDEA APORTAR (PUES MI C ES RUDIMENTARIO), UNA LIBRERIA PARA HITECH DE MANEJO DEL MTOUCH....

Y POR OTRO LADO EXPLICAR ESTO, DE MANERA COMO LO HACE GRAHAM EN INGLES PERO PARA GENTE COMO YO ("LENTOS")....


UN SALUDO Y MIL GRACIAS

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: el t1gval del timer 1 no hace toggle con timer 0
« Respuesta #10 en: 03 de Marzo de 2011, 09:27:45 »

al hacer esto:
COUNT_L = TMR1L;   //SAVE ITS CONTENTS
COUNT_H = TMR1H;

pues correcto

pero despues hacia:

CAPCH15_L = COUNT_L;
CAPCH15_H = COUNT_H;

!!Y ESTO ES LO QUE NO HACIA BIEN"!!!  TODAVIA NO SE LA EXPLICACION!! :shock:


LO CAMBIE POR:

CAPCH15_L = TMR1L;
CAPCH15_H = TMR1H;


Y FUNCIONANDO.


  Y está bien que así sea. El porque, es sencillo. En el caso de

Código: C
  1. COUNT_L = TMR1L;        //SAVE ITS CONTENTS
  2. COUNT_H = TMR1H;

  Estás guardando el estado anterior del timer 1. Luego al hacer

Código: C
  1. CAPCH15_L = TMR1L;
  2. CAPCH15_H = TMR1H;

  ...guardas el nuevo estado del timer1.

  Después se puede hacer una resta y ya te queda justamente la diferencia que sería el período de tiempo de la señal. Al hacer 1/período se obtiene la frecuencia.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything