TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Elvió 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 - Tienes que ingresar para ver archivos adjuntos -
-
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.
-
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 :(