TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: KARyKAR en 30 de Abril de 2021, 00:50:40
-
Buenas noches compañeros del foro, estoy comenzando con la programación del pic18f2520, realice un ejercicio modificando un ejemplo que encontré en la red pero el caso es que este programa no me muestra nada en la pantalla lcd por bus I2c ni los leds reaccionan.
por favor me pueden indicar que me hace falta en la configuración de los bits y registros para que el pic me funcione muchas gracias.
//************************************************************************************
//************************************************************************************
#include <18F2520.h>
#fuses NOMCLR,NOWDT,INTRC,PUT,NOBROWNOUT,NOLVP
#use delay(internal=8M)
#use i2c(Master,Fast=100000, sda=PIN_C4, scl=PIN_C3,force_sw)
#include "i2c_Flex_LCD.c"
#define PORTA4 PIN_A4
#define PORTA5 PIN_A5
#define PORTB4 PIN_B4
#define PORTB5 PIN_B5
int leer1 = 0;
void main()
{
SET_TRIS_A(0B00000000);
SET_TRIS_B(0B00111111);
int i=0;
lcd_init(0x4E,16,2);
lcd_backlight_led(ON); //Enciende la luz de Fondo
while (TRUE) {
//PORT_A = 0;
//PORT_B = 0;
lcd_clear(); //Limpia el LCD
//*****************************************************************************
lcd_backlight_led(ON);
// Backspace over 2nd line.
printf(lcd_putc, " PUSH BOTON ");
delay_ms(3000);
leer1 = (input_state(PIN_A4));
if((input(PIN_B4)== 1)&&(leer1 == 0))
{
lcd_gotoxy(2, 2);
printf(lcd_putc, "\BOTON ON ");
delay_ms(1000);
output_high(PIN_A4);
if((input(PIN_B4)== 1)&&(leer1 == 1))
{
printf(lcd_putc, "\BOTON OFF ");
delay_ms(1000);
output_low(PIN_A4);
delay_ms(100);
}
lcd_backlight_led(OFF);
output_high(PIN_A5);
delay_ms(300);
output_low(PIN_A5);
delay_ms(300);
output_high(PIN_A5);
delay_ms(300);
output_low(PIN_A5);
}
}
}
-
Buenas
Me he decidido a echar a andar este código, y por la mismísima tierra donde crecen los alcaparrones que lo he conseguido ((:-))
El código en sí funciona en proteus, los fuses o la configuración inicial no impiden que el pic funcione en principio. He creado una simulación partiendo de otra que he conseguido por internet, interpretando lo que querías hacer.
Entrando en el código, he visto que usas i2c por software. Lo ideal es que lo configures por defecto, y que use el inluido en el pic, ya que este 18f2520 lo lleva por hardware: #use i2c(Master,Fast=100000, sda=PIN_C4, scl=PIN_C3)
Y por otro lado, está este bloque en main():
leer1 = (input_state(PIN_A4));
if((input(PIN_B4)== 1)&&(leer1 == 0))
{
lcd_gotoxy(2, 2);
printf(lcd_putc, "\BOTON ON ");
delay_ms(1000);
output_high(PIN_A4);
if((input(PIN_B4)== 1)&&(leer1 == 1))
{
printf(lcd_putc, "\BOTON OFF ");
delay_ms(1000);
output_low(PIN_A4);
delay_ms(100);
}
lcd_backlight_led(OFF);
output_high(PIN_A5);
delay_ms(300);
output_low(PIN_A5);
delay_ms(300);
output_high(PIN_A5);
delay_ms(300);
output_low(PIN_A5);
}
}
He asumido que en PIN_B4 hay un botón, y en PIN_A4 un interruptor. Pues bien, si pulsas el botón y el interruptor está apagado aparece en el lcd "boton on", pero si pulsas el botón y el interruptor está encendido nunca aparecerá "boton off", ¡porque ese código está dentro del anterior!. Ahí entraríamos ya en física cuántica y no llego a tanto.
Y nada más. Ten paciencia con esto, es dificil al principio pero muy satisfactorio.
Suerte.
-
hola, los bit de configuracion de ese pic hay mucha informacion por ser un pic antiguo y comun
con un cristal de 20Mhz y ceramicos de 22pF a tierra es
#fuses HSPLL, NOWDT, NOPROTECT, NODEBUG, USBDIV, PLL5, CPUDIV1, VREGEN
#use delay(clock=48000000)
e ira a 12MIPS
https://controlautomaticoeducacion.com/microcontroladores-pic/comunicacion-usb-cdc-con-pic-ccs-c/
info de jemplo :o