Autor Tema: AYUDA! , Tengo problemas con 2 códigos  (Leído 1692 veces)

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

Desconectado Elvió

  • PIC10
  • *
  • Mensajes: 2
AYUDA! , Tengo problemas con 2 códigos
« en: 21 de Octubre de 2018, 18:58:46 »
Ayuda ,tengo 2 códigos del el libro "02. Eduardo Garcia - Compilador C CCS y simulador Proteus para microcontroladores PIC" (adjunto libro en formato pdf) en donde no me funcionan los códigos correspondientes al controlador de velocidad en RPM y al Medición de ancho de pulso mediante TIMER1. Dice que el LCD.C tengo que modificarlo para que utilice el puerto C ,mi duda es como realizar los cambios en las librerias para modificar el LCD.C y el KBD.C o si tengo que agregar algo al codigo del CCS para que me funcione ,compila pero en la simulación realizada en Proteus 8 no me figura la pantalla LCD y no cumple con las funciones del teclado de 4x3. Adjunto archivo CCS que estoy intentando compilar y imágenes de la simulación que tengo que realizar ,igualmente el archivo del proteus 8.0 SP0 a ver si alguien me puede ayudar de antemano gracias.  :(

Controlador de velocidad en RPM:

#include <16f876A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#USE DELAY (CLOCK=4000000)
#INCLUDE <kbd.C>
#include <lcd.c>
#USE STANDARD_IO (a)
int16 counter=0;

//*************** INT TIMER1*********************
#int_TIMER1
void TIMER1_isr(void) {
counter=get_timer0();         //Lectura contador TMR0
counter=counter*2*120;     //Conversión a rpm
  printf(lcd_putc,"%6lu rpm",counter);
  lcd_gotoxy(1,1);
set_timer0(0);                      //Reinicia cuenta
set_timer1(3036);                // Recarga a 0.5s
 }
//**********************************************
VOID MAIN()
{           
   CHAR K,kant='0';
   char PWMH=0,PWML=0;
   lcd_init();
   kbd_init();
   PORT_B_PULLUPS(TRUE);
   
   setup_timer_0(rtcc_ext_l_to_h|RTCC_DIV_2);   //Configuración TMR0
   setup_timer_1(T1_internal|T1_DIV_BY_8);     //Configuración TMR1
   set_timer0(0);                               //Borrado contador
   set_timer1(3036);                         //Carga a 0.5s
   enable_interrupts(int_timer1);
   enable_interrupts(global);           //Habilitación interrupciones
   
WHILE (1) {
      k=kbd_getc();
      if (k=='\0') k=kant;
      if ((k=='*') || (k=='#')) k='0';
      kant=k;
       k=k-48;
       PWMH=k*28;
       PWML=255-PWMH;
for(PWMH;PWMH>0;PWMH--){
       OUTPUT_HIGH(PIN_A0);}
for(PWML;PWML>0;PWML--){
      OUTPUT_LOW(PIN_A0);}
}
}

Medición de ancho de pulso mediante TIMER1:

#include <16f876A.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <lcd.c>

Int16 TFB;                    // Tiempo flanco de bajada
float AP;                     // Valor final del ancho de pulso
int1 nuevopulso=0;            // Entra otro pulso
int1 cambio=0;                //Cambio de flanco de disparo

#int_ext
void funcion_ext_int(){       //Función Interrupción
  if(cambio==0){              // Flanco de Subida
    set_timer1(0);            //Inicializa TMR1
    ext_int_edge(0,H_TO_L);   // Configurar para flanco bajada
    cambio=1;                 // Control de cambio de flanco
  } else {                    // Flanco de Bajada
    TFB=get_timer1();         //Valor del Timer1 para el Flanco de bajada
    ext_int_edge(0,L_TO_H);   //Configurar para flanco subida
    cambio=0;                 //Control de cambio de flanco
    if(nuevopulso==0){        //Fin de pulso...
      nuevopulso=1;           //Pulso a calcular
   }
  }
}
void main() {
  lcd_init();
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // Configuración TIMER1
  ext_int_edge(0,L_TO_H);                   // Configurar para flanco subida
  cambio = 0;                             // Control de cambio de flanco
  enable_interrupts(int_ext);    //Habilitación interrupción RB0
  enable_interrupts(global);     //Habilitación general
  do {
    if(nuevopulso==1){            // ¿Pulso nuevo?
    AP = TFB*1.0;                 // Ancho de pulso en microsegundos de Timer1…
                                  // a 4MHZ el T=1us*Timer1
        printf(lcd_putc,"\nPulso = %6.1fuS ", AP);   //Visualiza medida en LCD
 
      nuevopulso=0;             //Pulso medido
    }
  } while (TRUE);              //Bucle Infinito
}

Utilizo el CCS v5.076
* Medición de ancho de pulso mediante TIMER1.c
(1.7 kB - descargado 156 veces)

Desconectado Ce.O

  • PIC10
  • *
  • Mensajes: 13
Re:AYUDA! , Tengo problemas con 2 códigos
« Respuesta #1 en: 21 de Octubre de 2018, 22:12:22 »
Te adjunto la librería que yo uso, si quiere borra la que tengas en la carpeta de librerías y pon esa.
Ahora, con esto puedes decir que pines usarás para la librería
#define LCD_ENABLE_PIN  PIN_D2
#define LCD_RS_PIN      PIN_D0
#define LCD_RW_PIN      PIN_D1
#define LCD_DATA4       PIN_D4
#define LCD_DATA5       PIN_D5
#define LCD_DATA6       PIN_D6
#define LCD_DATA7       PIN_D7

yo usó el puerto D ya que trabajo con el 4550 y es un puerto completo.
Espero y te ayude saludos.
Nota: el puerto que vas a usar para la lcd no se declara.

Desconectado Elvió

  • PIC10
  • *
  • Mensajes: 2
Re:AYUDA! , Tengo problemas con 2 códigos
« Respuesta #2 en: 21 de Octubre de 2018, 22:39:51 »
WHILE (1) {
      k=kbd_getc();
      if (k=='\0') k=kant;
      if ((k=='*') || (k=='#')) k='0';
      kant=k;
       k=k-48;
       PWMH=k*28;
       PWML=255-PWMH;
      for(PWMH;PWMH>0;PWMH--){
       OUTPUT_HIGH(PIN_A0);}
      for(PWML;PWML>0;PWML--){
      OUTPUT_LOW(PIN_A0);}
  }
}

Esta parte del código no funcionan bien, adjunto imagen con los errores :(

 


 

anything