Estoy sorprendido que la cosa aun este tan asi
, pero, vamos de nuevo por parte, las definiciones de lcd normalmente se refieren a direcciones de memorias y funciones a esas direcciones a las cuales cargamos un dato y luego según el comando lcdout envía el carácter alfanumérico, todo eso lo hace en segundo plano el PBP. Por lo cual no lo percibimos, ahora, debemos tomar en cuenta que esos comando no configuran los puertos ni los pines, como entrada o salida, por regla general ya sea en pbp, asm, etc... Hay que configurar los pines. Entonces, eso se realiza con los registros TRISA, TRISB, TRISX, dependiendo de la cantidad de puertos que tenga el microcontrolador. Si vamos a configurar solo un pin, digamos el pin 0 "cero" del puerto A seria:
Cualquiera hace lo mismo.
Código:
TRISA.0 = %0 'En binario
TRISA.0 = $0 'En exadecimal
TRISA.0 = 0 'En decimal
Por costumbre, siempre se utiliza en binario o hexadecimal
Ahora si queremos ahorrar lineas de código podemos configurar todos lo pines de una sola vez. Digamos del puerto A, los pines del 7 al 4 son entradas y del 3 al 0 son salidas, entonces quedaria asi:
Código:
TRISA = %11110000 'Uno se refiere a entrada en ingles "In" y cero a salida en ingles "out"
Luego de configurar los pines como entradas y salidas, entonces ya podemos cargar un dato y sabemos que al pasarlo de las direcciones de propósito general donde se guarda la información que va a ser transmitida a la lcd, se cargue en el pin, el pín va a reflejarlo.
Otro dato importante, los fuses aunque no son todos obligatorios, hay unos que pueden afectarnos según sea su función. Ejemplo: el fuse del MCLR, si no se va utilizar debe indicarse de lo contrario hay que colocar un sistema que permita la puesta en marcha y el reset del microcontrolador. Pongamos que no indicamos nada para el fuse del MCLR, y programamos el microcontrolador y ese pin lo utilizamos como otro pin mas de entrada de proposito general, que va a suceder, el pic se va a estar reset siempre
hno: o en determinados momentos no va a funcionar adecuadamente, por eso es importante definirlos de una vez ya que para luego es tarde.
Una manera efectiva de hacerlo es con la hoja de datos ya que en ella aparecen todos bien detallados, y para ayudarnos, contamos con el archivo .INC, el cual se encuentra en la carpeta del PBP, alli hay una carpeta llamada INC, la abrimos con microcode o bloc de notas, y vamos a ver todo lo relacionado al microcontrolador, fuses, registros especiales, etc... Entonces copiamos los fuses y los pegamos en el codigo que estamos haciendo y alli ya esta, empezamos a configurar y definir los fuses. Para el caso del 16F84A seria:
localizamos el archivo INC, para el 16F84A, es "M16F8X.INC", se llama asi por que no solo se trata del 16F84A, y también el 16F84 Y 16F83.
Esto es lo que copias del archivo INC, y lo modificas.
Código:
PIC16F83 equ 50010400h ; 14-Bit, 512 Code, 64 EE, ID = 0
PIC16F84 equ 50020401h ; 14-Bit, 1K Code, 64 EE, ID = 1
PIC16F84A equ 50020401h ; 14-Bit, 1K Code, 64 EE, ID = 1
; *** DEVICE Fuses Definitions
RC_OSC equ 3FFC0003h ; XX XXXX XXXX XX11
HS_OSC equ 3FFC0002h ; XX XXXX XXXX XX10
XT_OSC equ 3FFC0001h ; XX XXXX XXXX XX01
LP_OSC equ 3FFC0000h ; XX XXXX XXXX XX00
WDT_ON equ 3FFB0004h ; XX XXXX XXXX X1XX
WDT_OFF equ 3FFB0000h ; XX XXXX XXXX X0XX
PWRT_OFF equ 3FF70008h ; XX XXXX XXXX 1XXX
PWRT_ON equ 3FF70000h ; XX XXXX XXXX 0XXX
PROTECT_OFF equ 000FFFF0h ; 11 1111 1111 XXXX
PROTECT_ON equ 000F0000h ; 00 0000 0000 XXXX
Y quedaría algo así según sea cada caso se modifica.
Código:
@ DEVICE PIC16F84A
@ DEVICE XT_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE PROTECT_OFF
Unas ves configurados los fuses, lo que sigue es la definicion de frecuencia del OSC, hay que tomar en cuenta que segun manual, debe escribirse "OSC" todo en mayuscula y no "Osc" o derivados ya que puede que el PBP no lo tome.
quedaria asi:
Aparte de eso que otra cosa puede afectarnos el funcionamiento del microcontrolador, bueno hay ciertas caracteristicas y registros especiales que trae cada microcontrolador, según sea el caso siempre es mejor leer la datasheet para estar seguro de lo que estamos haciendo. Los mas criticos son los ADC y comparadores ADC, lo que sucede es que hay y repito no se aplica en todos, ciertos microcontroladores a los cuales hay que desactivarle los ADC y/o los comparadaores ADC, estoy se hace con los comandos definidos para cada registro y como saber que nombre tiene el regstro en el PBP, pues en el mismo archivo INC, encontramos los renombres para cada registro.
Para el 16F84/16F84A/16F83 estan dispuesto asi:
Código:
INDF equ 00h ; Indirect Data
TMR0 equ 01h ; Real Time Clock/Counter
PCL equ 02h ; Program Counter (LSB)
STATUS equ 03h ; Status Flags
FSR equ 04h ; File Select Register
PORTA equ 05h ; Port A Data
RA equ 05h
PORTB equ 06h ; Port B Data
RB equ 06h
EEDATA equ 08h ; EEPROM Data
EEADR equ 09h ; EEPROM Address
PCLATH equ 0Ah ; Program Counter (MSB)
INTCON equ 0Bh ; Interrupt Control
OPTION_REG equ 81h ; OPTION Register
TRISA equ 85h ; Port A Tristate Control
TRISB equ 86h ; Port B Tristate Control
EECON1 equ 88h ; EEPROM Control 1
EECON2 equ 89h ; EEPROM Control 2
; *** STATUS Bits
C equ 0 ; Carry
DC equ 1 ; Digit (Half) Carry
Z equ 2 ; Zero
PD equ 3 ; Power Down
TO equ 4 ; Time Out
RP0 equ 5 ; Direct Data Page Select 0
RP1 equ 6 ; Direct Data Page Select 1
IRP equ 7 ; Indirect Data Page Select
; *** INTCON Bits
RBIF equ 0 ; PORTB[4..7] Change Interrupt Flag
INTF equ 1 ; RB0/INT Interrupt Flag
T0IF equ 2 ; Timer0 Overflow Interrupt Flag
RBIE equ 3 ; PORTB[4..7] Change Interrupt Enable
INTE equ 4 ; RB0/INT Interrupt Enable
T0IE equ 5 ; Timer0 Overflow Interrupt Enable
EEIE equ 6 ; EEPROM Interrupt Enable
GIE equ 7 ; Global Interrupt Enable
; *** OPTION_REG Bits
PS0 equ 0 ; Prescaler Divisor Select (3 Bits)
PS1 equ 1
PS2 equ 2
PSA equ 3 ; Prescaler Assignment
T0SE equ 4 ; Timer0 Source Edge Select
T0CS equ 5 ; Timer0 Clock Source Select
INTEDG equ 6 ; RB0/INT Edge Select
RBPU equ 7 ; Port B Weak Pull-Up Enable
; *** EECON1 Bits
RD equ 0 ; EEPROM Read Control
WR equ 1 ; EEPROM Write Control
WREN equ 2 ; EEPROM Write Enable
WRERR equ 3 ; EEPROM Write Error Flag
EEIF equ 4 ; EEPROM Interrupt Flag
Este archivo es muy útil y siempre lo busco para estar seguro, fijjence como fue renombrado el registro de la dirección 06h, que pertenece al PORTB, tiene dos reenombres que cualquiera puede ser usado, uno es el PORTB y el otro es RB. Como prefiero estar seguro pues siempre busco este archivo y comparo con la datasheet y hasta ahora siempre tiene coincidencia.
Como se observa no tiene ni comparador ni modulo ADC, eso se ve mejor en el datasheet, lo que si tiene que vi tratates de configurar, son resistencias para la colocación de 1 lógico, o PULL UP, están resistencias se configuran en este caso del 16F84A, solo para el puerto B, y se hace a través del registro especial llamado OPTION_REG, el bit 7, si esta en 1 desabilita y si esta en 0 habilitas las pull up.
Para ir terminando un poco, las definiciones de la LCD, dejo las características de cada uno:
Código:
Define LCD_DREG PORTB ' LCD data pin port, Se elige por que puerto del pic van a salir los datos del registro de datos de la LCD.
Define LCD_DBIT 0 ' LCD data pin bit ' Se elige a partir de que pin empieza (0 - 4)
se refiere a que si vamos a trabajar la lcd cpn 4 lineas de datos y que esos datos
van a salir por el puerto B, a partir de que pin empiezan los pines del registro de datos
como lo mínimo de pines de datos son 4, entonces lo máximo puede ser a partir del pin 4 del puerto.
Y quedaría pin 4 del pic con el PIN 4 de datos de la lcd, y luego el 5 del pic con el 5 de datos de la lcd y asi sucesivamente. Y si fuese a apartir del pin0 del pic, seria pin 0 del pic pin 4 del lcd.
Define LCD_RSREG PORTB ' LCD register select pin port ' Se elige por que puerto del pic va a salir los datos del registro reset de la LCD.
Define LCD_RSBIT 4 ' LCD register select pin bit, se elige el pin del puerto, para el reset de la lcd.
Define LCD_EREG PORTB ' LCD enable pin port, Se elige por que puerto del pic va a salir los datos del registro enable de la LCD.
Define LCD_EBIT 5 ' LCD enable pin bit, se elige el pin del puerto, para el enable de la lcd.
Define LCD_BITS 4 ' LCD number of data bits, se elige el modo de control de la lcd, 4 o 8 bits.
Define LCD_LINES 2 ' LCD number of lines, se elige de cuantas lineas va hacer la lcd.
Hasta aquí por ahora
Bueno cualquier duda, me avisan ...saludoss