Autor Tema: problema timer 1 con hitech  (Leído 2216 veces)

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

Desconectado claudioja2011

  • PIC10
  • *
  • Mensajes: 12
problema timer 1 con hitech
« en: 15 de Enero de 2017, 10:12:09 »
Estoy intentando migrar del ccs al hitech y quiero cargar el timer con una variable entera pero, no funciona bien. el timer  carga el tiempo pero es como que se reinicia  :( :( :(
aca les dejo el codigo, el pic es un 16f628a.

PD:disculpen que no tiene comentarios :oops: :oops:.

#include<htc.h>
#include<stdio.h>
#include<math.h>
#define _XTAL_FREQ 4000000

__CONFIG(FOSC_INTOSCIO & MCLRE_OFF & BOREN_ON & CPD_OFF & CP_OFF & LVP_OFF & BOREN_ON & PWRTE_OFF);

int paso=23869;

int rps=1;
int j=0;
int motor [6] = {0b00011000,0b00010100,0b01000100,0b01000010,0b00100010,0b00101000};


int contador (int rps ){
int num1=0;
float num2=0;
num2=65536-(1000000/(24*rps));
num1=ceil(num2);
return num1;
}




void interrupt TIMER1 (void){

if(TMR1IE&&TMR1IF){
if (j>6){
j=0;
};

PORTB=motor[j];
++j;

TMR1=paso;

TMR1IF=0;
return;
}

}
void main (void){
T1CON=0b00101100;//oscilador interno, prescaler 4,fosc/4
TMR1IF=0;
TMR1IE=1;
PEIE=1;
GIE=1;
TRISB=0;
PORTB=0;
TRISA=0b00000010;
TMR1=paso;
TMR1ON=1;
while(1) {

if(RA1==0){

__delay_ms(10);

if(RA1==1){
++rps;
}
}

paso=contador(rps);
}
}
« Última modificación: 15 de Enero de 2017, 10:15:17 por claudioja2011 »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:problema timer 1 con hitech
« Respuesta #1 en: 15 de Enero de 2017, 11:04:52 »
No sueles tabular el código??? :oops: :oops: :oops: Es muy poco legible...

No veo el porqué se resetea pero veo algo raro, que quieres hacer con: "if(TMR1IE&&TMR1IF)"?.

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema timer 1 con hitech
« Respuesta #2 en: 15 de Enero de 2017, 12:38:46 »
Citar
el timer  carga el tiempo pero es como que se reinicia

A que te referis como "que se reinicia".

Veo un par de cosas luego de anidarlo correctamente al codigo,
- Una variable de 16bits que lo estas cambiando en el main + asignando en la interrupcion. Esto puede hacer que en mitad de la asignacion ( en tu funcion contador ) se llame a la interrupcion, lo cual esos 16 bits que son en realidad registros de 8 y 8, 8 bits serian los nuevos y 8 bits los viejos. Para evitar esto lo de contador esta en la interrupcion. Y no en el main.
- Usas innecesariamente un float, simplemente que 1000000/(24*rps) te de un entero no importa la coma, asi que saque directamente todo lo que es contador.
- Preferentemente no uses return en una interrupcion, ya que la instruccion para salir de la misma es distinta que de una funcion comun. Ya que ademas debe activar nuevamente la interrupcion global que se desactiva al entrar. Por eso mismo la elimine.
- Cambie el codigo de los botones, hasta el momento pedias que tu boton se presionara en el momento justo, asi como lo tenias tenias que presionarlo en la ventana del delay, lo cual no es muy dificil de lograr ya que dura mucho mas tiempo que procesar los ifs, pero se acrecenta a medida que agregamos cosas, por eso puse un codigo distinto, en el cual solo al soltar es cuando ejecuta lo de adentro. Este codigo tiene la desventaja de que si tenes presionado constanemente el boton queda encerrado en el while. Supuse que RB tiene que ser 1 cuando esta presionado.


Código: C
  1. #include<htc.h>
  2.  
  3. #define _XTAL_FREQ 4000000
  4.  
  5. __CONFIG(FOSC_INTOSCIO & MCLRE_OFF & BOREN_ON & CPD_OFF & CP_OFF & LVP_OFF & BOREN_ON & PWRTE_OFF);
  6.  
  7. int paso=23869;
  8.  
  9. short int rps=1;
  10. int j=0;
  11. int motor [6] = {0b00011000,0b00010100,0b01000100,0b01000010,0b00100010,0b00101000};
  12.  
  13.  
  14. void interrupt TIMER1 (void)
  15. {
  16.  
  17.         if(TMR1IE&&TMR1IF)
  18.         {
  19.                 if (j>6)
  20.                 {
  21.                         j=0;
  22.                 };
  23.  
  24.                 PORTB=motor[j];
  25.                 ++j;
  26.  
  27.                 TMR1=65536-(1000000/(24*rps));
  28.  
  29.                 TMR1IF=0;
  30.         }
  31.  
  32. }
  33. void main (void)
  34. {
  35.         T1CON=0b00101100;//oscilador interno, prescaler 4,fosc/4
  36.         TMR1IF=0;
  37.         TMR1IE=1;
  38.         PEIE=1;
  39.         GIE=1;
  40.         TRISB=0;
  41.         PORTB=0;
  42.         TRISA=0b00000010;
  43.         TMR1=paso;
  44.         TMR1ON=1;
  45.        
  46.         while(1)
  47.         {
  48.  
  49.                 if(RA1==1)
  50.                 {
  51.                         __delay_ms(10);
  52.                         while(RA1==1);
  53.                         ++rps;
  54.                 }
  55.         }
  56. }

Desconectado claudioja2011

  • PIC10
  • *
  • Mensajes: 12
Re:problema timer 1 con hitech
« Respuesta #3 en: 15 de Enero de 2017, 15:35:05 »
gracias por los arreglos del codigo. a lo que me referia es que cuando pulso el boton y suelto el timer 1 tiene que cambiar el tiempo de desbordamiento, sin embargo cuando lo suelto vuelve al tiempo anterior, porque lo realise en ccs y corre bien pero quiero hacer lo mismo en hitech y no sale :( :(
 te paso el codigo en ccs.
#include<16F628A.h>

#include<math.h>

#fuses NOWDT,INTRC_IO,NOMCLR

#use delay(clock=4M)

#use fixed_io(b_outputs= pin_b1, pin_b2, pin_b3, pin_b4, pin_b5, pin_b6)

#use standard_io(a)


int32 paso=23869;

int16 rps=1;
int j=0;


int32 contador (int16 rps ){
int32 num1=0;
float num2=0;
num2=65536-(1000000/(24*rps));
num1=ceil(num2);
return num1;
}

#int_TIMER1
void rev (){
//int motor [6] = {0b00100010,0b01000010,0b01000100,0b00010100,0b00011000,0b00101000};
int motor [6] = {0b00011000,0b00010100,0b01000100,0b01000010,0b00100010,0b00101000};
if (j>6){
j=0;
};
output_b(motor[j]);

j++;

set_timer1(paso);

}



void main (void){






SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_4 );


set_timer1(paso);


enable_interrupts(INT_TIMER1);

enable_interrupts(GLOBAL);



while(true){





if(input(PIN_A1)==0){

delay_ms(10);

if(input(PIN_A1)==1){
rps++;
}
}

paso=contador(rps);
}
}
« Última modificación: 16 de Enero de 2017, 13:46:46 por claudioja2011 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema timer 1 con hitech
« Respuesta #4 en: 18 de Enero de 2017, 20:14:59 »
Lo mas seguro es que no te funcione por que no pusiste el PORTA como digital.. Este codigo deberia funcionar, aunque lo hice para XC8 , creo que podrias reemplazarlo correctamente

Código: C
  1. #include <stdint.h>
  2. #include <xc.h>
  3.  
  4. #define _XTAL_FREQ 4000000
  5.  
  6. uint16_t paso=23869;
  7.  
  8. uint8_t rps=1;
  9. uint8_t tmp;
  10. uint8_t j=0;
  11. const uint8_t motor [6] = {0b00011000,0b00010100,0b01000100,0b01000010,0b00100010,0b00101000};
  12.  
  13.  
  14. void interrupt TIMER1 (void)
  15. {
  16.  
  17.         if(PIR1bits.TMR1IF)
  18.         {
  19.                 TMR1=65536-(125000/(3*rps));
  20.                
  21.                 if (j >= sizeof(motor))
  22.                 {
  23.                         j=0;
  24.                 };
  25.  
  26.                 PORTB = motor[j];
  27.                 ++j;
  28.  
  29.                 PIR1bits.TMR1IF = 0;
  30.         }
  31.  
  32. }
  33. void main (void)
  34. {
  35.         T1CON = 0b00101100;     //oscilador interno, prescaler 4,fosc/4
  36.         PIR1bits.TMR1IF = 0;
  37.         PIE1bits.TMR1IE = 1;
  38.         INTCONbits.PEIE = 1;
  39.         INTCONbits.GIE = 1;
  40.         TRISB = 0;
  41.         PORTB = 0;
  42.         CMCON = 0x07;           // A digitales
  43.         TRISA = 0b00000010;
  44.         TMR1 = paso;
  45.         T1CONbits.TMR1ON = 1;
  46.        
  47.         while(1)
  48.         {
  49.  
  50.                 if(PORTAbits.RA1)
  51.                 {
  52.                         __delay_ms(10);
  53.                         while(PORTAbits.RA1);
  54.                         tmp = rps + 1;
  55.                         (!tmp) ? rps = 1 : ++rps;
  56.                 }
  57.         }
  58. }

Desconectado claudioja2011

  • PIC10
  • *
  • Mensajes: 12
Re:problema timer 1 con hitech
« Respuesta #5 en: 24 de Enero de 2017, 21:15:51 »
Anda perfecto genio  ((:-)) ((:-)) ((:-)) ((:-)) +10. disculpa mi codigo es que nunca fui a ningun curso de programacion y lo que aprendi fue de tutoriales de youtube :? :? :?. seria muy bueno si sabes donde puedo sacar mas info para mejorar mi codigo :oops: :oops:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema timer 1 con hitech
« Respuesta #6 en: 24 de Enero de 2017, 22:37:30 »
La verdad que yo también aprendí como vos estás haciendo, aprender más lo haces por curiosidad, viendo otros códigos y también programando más cosas.

En este caso que fue tu problema, era no conocer el integrado. En la primer hoja del módulo de I/O te dice del registro ese.


 

anything