Autor Tema: Error de simulación Proteus + LCD + 16F628a  (Leído 6631 veces)

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

Desconectado sonicTH

  • PIC10
  • *
  • Mensajes: 21
Error de simulación Proteus + LCD + 16F628a
« 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.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error de simulación Proteus + LCD + 16F628a
« Respuesta #1 en: 30 de Abril de 2010, 22:33:58 »
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
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado sonicTH

  • PIC10
  • *
  • Mensajes: 21
Re: Error de simulación Proteus + LCD + 16F628a
« Respuesta #2 en: 02 de Mayo de 2010, 15:05:42 »
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 ;)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error de simulación Proteus + LCD + 16F628a
« Respuesta #3 en: 02 de Mayo de 2010, 20:55:16 »
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
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado sonicTH

  • PIC10
  • *
  • Mensajes: 21
Re: Error de simulación Proteus + LCD + 16F628a
« Respuesta #4 en: 06 de Mayo de 2010, 12:02:57 »
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 ;)

Código: [Seleccionar]
////////////////////////////////////////////////////////////////////////////////
//////////////               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.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error de simulación Proteus + LCD + 16F628a
« Respuesta #5 en: 07 de Mayo de 2010, 14:22:28 »
  ¿Esta línea es correcta?
Código: [Seleccionar]
#use delay(internal=4M)

Yo siempre usé
Código: [Seleccionar]
#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
Código: [Seleccionar]
#include <lcd.c>
pero es cuestión de probar

Si querés conectar todo el LCD al puerto B podrías poner
Código: [Seleccionar]
#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
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado kilometro115

  • PIC10
  • *
  • Mensajes: 1
Re: Error de simulación Proteus + LCD + 16F628a
« Respuesta #6 en: 16 de Junio de 2010, 03:24:59 »
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.


 

anything