TODOPIC
Simuladores, editores de PCB, etc => Simuladores de circuitos => Proteus ISIS => Mensaje iniciado por: sonicTH en 30 de Abril de 2010, 21:44:49
-
HOla que tal:
Acudo a ustedes con la siguiente duda. Estoy probando el 16f628a con una rutina para Lcd en proteus. Cabe decir que es el mismo programa que estaba usando en el 16F84a solo que en físico no me quiso jalar :S tal vez por falta de memoria y por eso cambié el PIC. En fin. Aun no lo he montado, es solo que me queda esta duda ya que no es un error propiamente sino un 'warning'. "(PIC16 CORE)PC=0x144TRISB instruction is deprecated for PIC16628" me dá ese error a lo largo de la simulación solo cambiando la dirección de la memoria (0x127, 0x14B, etc). Espero sepan a que se debe antes de montar y pasar corajes :P je. Gracias.
-
Si mal no recuerdo eso se daba si en el programa (en el asm) aparece la instrucción TRIS. En lugar de dicha instrucción hay que "movwf".
En los PIC12C se podía usar la instrucción TRIS GPIO (para configurar el puerto)
Pero ya para el 16F84 microchip recomienda no usar dicha instrucción para la configuración de los puertos
-
Si mal no recuerdo eso se daba si en el programa (en el asm) aparece la instrucción TRIS. En lugar de dicha instrucción hay que "movwf".
En los PIC12C se podía usar la instrucción TRIS GPIO (para configurar el puerto)
Pero ya para el 16F84 microchip recomienda no usar dicha instrucción para la configuración de los puertos
mmm ¬¬ pero eso sería en ensamblador no? y estamos en C. Bueno a lo mejor no lo especifique. Estoy programando en C y a estas alturas ya lo armé y.... no jaló :( . No sé pq nunca me han jalado las rutinas de LCD con los pics. Es la maldición de los kemadiodos jeje XD.
En fin. En Basic hasta ahorita va todo bien, solo que no me quiero quedar con la duda del porqué no me funciona; y además ese 'warning' no me lo dá con el 84A y es la misma rutina. (entiendase que cambié la librería, obvio).
Bueno, Gracias por la ayuda bro ;)
-
Pero más haya de que esté programado en C o en ASM, si en el archivo compilado (.hex) se encuentra dicha instrucción (que sería el opcode 00 0000 0110 0fff, siendo f los bits correspondientes al registro utlilizado) te va a tirar dicho error.
Yo había hecho algunas cosas en CCS y cuando compilaba el programa y miraba el .LST donde se puede ver el "equivalente ASM" aparecía la instrucción TRIS y de hecho el proteus me daba el warning pero de todos modos la simulación funcionaba.
Si queŕes, subí el programa y lo miramos a ver que se descubre
-
Pero más haya de que esté programado en C o en ASM, si en el archivo compilado (.hex) se encuentra dicha instrucción (que sería el opcode 00 0000 0110 0fff, siendo f los bits correspondientes al registro utlilizado) te va a tirar dicho error.
Yo había hecho algunas cosas en CCS y cuando compilaba el programa y miraba el .LST donde se puede ver el "equivalente ASM" aparecía la instrucción TRIS y de hecho el proteus me daba el warning pero de todos modos la simulación funcionaba.
Si queŕes, subí el programa y lo miramos a ver que se descubre
OK, aquí está el código. Ya lo había puesto antes en otro tema, pero la respuesta fue 'cambia el PIC'. En fin, gracias por el interes bro ;)
////////////////////////////////////////////////////////////////////////////////
////////////// Practica 2 //////////////////////
////////////// practica que escribe en una LCD //////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////// By MARCO RECARGADO //////////////////////
////////////////////////////////////////////////////////////////////////////////
#include <16F628A.h> /// libreria para el manejo del pic16f877a
//#fuses XT,INTRC_IO,NOWDT,NOPUT,NOPROTECT
#fuses NOWDT,INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
//#use delay(clock=4000000)
#use delay(internal=4M) /// declara la frecuencia del cristal
#include <lcd.c> // Librería para el manejo del lcd para ver las conexiones
// abran el archivo C:\Archivos de programa\PICC\Drivers\lcd.c
// y ahi les muestra.
//#use fast_io(a)
////////////////////////////////////////////////////////////////////////////////
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
////////////////////////////////////////////////////////////////////////////////
//SET_TRIS_B(0x00);
//SET_TRIS_A(0xff);
void main(void)
{
int8 seleccion;
int8 compu=0;
int8 senal;
lcd_init(); // Antes de usar el lcd,hay que inicializarlo
lcd_putc("HOLA MUNDO Cruel\n");
delay_ms(1500);
lcd_putc("\f");
lcd_putc("\f Probador de\n ECM's");
delay_ms(3000);
lcd_putc("\fSeleccione Marca\nPresione: <- ->");
delay_ms(1000);
while (true){
menu:
do {
seleccion=0;
if( input(PIN_A2) ) /*lcd_putc("\f entrada 0");*/ seleccion=1;
if( input(PIN_A3) ) /*lcd_putc("\f entrada 1");*/ seleccion=2;
if( input(PIN_A4) ) /*lcd_putc("\f entrada 2");*/ seleccion=3;
}
while(seleccion==0);
lcd_putc("\f");
//printf(lcd_putc, "%i",seleccion);
delay_ms(500);
apurate:
switch (seleccion) {
case 1://lcd_putc("\fFord PCM");
compu++;
break;
case 3://lcd_putc("\fNissan F50");
compu--;
break;
case 2:lcd_putc("\finiciando...");
delay_ms(1000);
goto proceso;
break;
default://goto apurate;
break; }
//delay_ms(2000);
switch (compu) {
case 1:lcd_putc("\fFORD (Todos)");
//senal=1;
break;
case 2:lcd_putc("\fMarca DOS");
//senal=2;
break;
case 3:lcd_putc("\fMarca TRES");
//senal=3;
break;
case 4:lcd_putc("\fMarca CUATRO");
//senal=4;
break;
//case 2:lcd_putc("\finiciando...");
// goto proceso;
// break;
default:goto apurate;
break; }
delay_ms(300);
lcd_putc("...OK?\n");
//printf(lcd_putc," %i, %i",senal,compu);
delay_ms(1000);
goto menu;
//waits for B1 to go high
proceso:
switch (compu) {
case 1:lcd_putc("\fno");
//senal=1;
break;
case 2:lcd_putc("\fno");
//senal=2;
break;
case 3:lcd_putc("\fjalo");
output_high(PIN_A0);
output_high(PIN_A1);
output_high(PIN_B2);
output_high(PIN_B3);
delay_ms(1500);
break;
case 4:lcd_putc("\fMarca CUATRO");
senal=4;
break;
//case 2:lcd_putc("\finiciando...");
// goto proceso;
// break;
default:goto apurate;
break; }
delay_ms(1000);
lcd_putc("\fzax");
delay_ms(1000);
goto menu;
}
// Escribes en la lcd
} // fin de programa
PD: Me indicas aprovechando si estoy inicializando correctamente el OSC interno del pic? Gracias.
-
¿Esta línea es correcta?
#use delay(internal=4M)
Yo siempre usé
#use delay(clock=4000000)
Aunque utilice el oscilador interno, el tiempo de clock establecido con la línea anterior funciona bien.
Respecto al resto del código no veo en que lugar definís los puertos que vas a usar para la salida.
En el encabezado de la rutina de LCD te lo especifica bien
..................................
//// CONFIGURATION ////
//// The LCD can be configured in one of two ways: a.) port access or ////
//// b.) pin access. Port access requires the entire 7 bit interface ////
//// connected to one GPIO port, and the data bits (D4:D7 of the LCD) ////
//// connected to sequential pins on the GPIO. Pin access ////
//// has no requirements, all 7 bits of the control interface can ////
//// can be connected to any GPIO using several ports. ////
//// ////
//// To use port access, #define LCD_DATA_PORT to the SFR location of ////
//// of the GPIO port that holds the interface, -AND- edit LCD_PIN_MAP ////
//// of this file to configure the pin order. If you are using a ////
//// baseline PIC (PCB), then LCD_OUTPUT_MAP and LCD_INPUT_MAP also must ////
//// be defined. ////
//// ////
//// Example of port access: ////
//// #define LCD_DATA_PORT getenv("SFR:PORTD") ////
//// ////
//// To use pin access, the following pins must be defined: ////
//// LCD_ENABLE_PIN ////
//// LCD_RS_PIN ////
//// LCD_RW_PIN ////
//// LCD_DATA4 ////
//// LCD_DATA5 ////
//// LCD_DATA6 ////
//// LCD_DATA7 ////
//// ////
//// Example of pin access: ////
//// #define LCD_ENABLE_PIN PIN_E0 ////
//// #define LCD_RS_PIN PIN_E1 ////
//// #define LCD_RW_PIN PIN_E2 ////
//// #define LCD_DATA4 PIN_D4 ////
//// #define LCD_DATA5 PIN_D5 ////
//// #define LCD_DATA6 PIN_D6 ////
//// #define LCD_DATA7 PIN_D7 ////
//// ////
..................................
No sé si tiene que estar antes o después de
#include <lcd.c>
pero es cuestión de probar
Si querés conectar todo el LCD al puerto B podrías poner
#define LCD_DATA_PORT getenv("SFR:PORTB")
Es lo que figura en el encabezado de la rutina sólo que sustituí PORTD por PORTB, ya que el 16F628 no tiene puerto D
-
Hola AngelGris y sonicTH, tengo el mismo problema, a pesar del error simula en Proteus pero en la vida real el lcd no muestra nada, ya programé con otros uC con y sin cristal interno pero con el 16f628a es otra historia, alguno de ustedes podria indicarme que hacer ademas de lo descrito en post anteriores. Gracias de antemano.