-
init PORTD FOR 16F877A
Hello everyone,
Before posting this, I've documented myself, but still I have the same annoying problem for one week now.
I have designed a circuit, using a 16F877A, that is intended to display different
messages on an HD44780 based LCD, when different keys are pressed, along with switching on a LED, corresponding to the key.
For my purpose I use PORT B, as 4bit and control lines for the LCD, and PORT D
as keys interface and LED driver.
The LCD works fine, but my problem is with PORT D. Even if it is switched to general purpose I/O port (bcf TRISE,PSPMODE), and configured accordingly to my needs (movlw b'00011111'; movwf TRISD), it acts chaotically, especially on RD 0 to 3, by interpreting the inputs as being key-pressed(0 V), and this combined with the fact that the corresponding LED is not lighting.
Did anyone had this problem also and has a solution to this?
Thank you in advance,
PS: Downwards is a chunk of my code, the init part and how I verify my PORTD imputs and command the LEDs.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
list p=16f877A ; list directive to define processor
#include <p16f877A.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
ERRORLEVEL 0, -302
;;;;;;;;;;;;;;; pini necesari LCD;;;;;;;;
#define D7 PORTB,1
#define D6 PORTB,2
#define D5 PORTB,3
#define D4 PORTB,4
#define E PORTB,5
#define RS PORTB,7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lcd_port equ PORTB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LCD
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;BUTOANE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
btn_port equ PORTD
btn1 equ 0
btn2 equ 1
btn3 equ 2
btn4 equ 3
btn5 equ 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iesiri
#define out5 PORTB,0
#define out4 PORTB,6
#define out3 PORTD,7
#define out2 PORTD,6
#define out1 PORTD,5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; sfarsit definire iesiri
cblock 0x20
d1,d2,d3,var,var_dly,count
endc
;;;;;;;;;;;;;;;;;;;;;;;;; sfarsit declaratii etc
;;;;;;;;;;;;;;;;;;;;;;;;; progr principal
init_porturi:
; ports init
clrf STATUS
clrf PORTB
clrf PORTD
banksel TRISB
;bsf OPTION_REG,7
;bcf INTCON,4
clrf TRISB
; my LCD uses only 6 lines, and 2 pins are used for light switch on, and one for powering up the LCD for proper INITIALIZATION when a
PIC hardware RESET
bcf TRISE,PSPMODE
movlw 0x1f
movwf TRISD
banksel PORTB
clrf PORTB
clrf PORTD
clrf STATUS
call LCD_Init
; ;;;;;;;;;;;;;;;;;end of init side
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; main loop
pre_main:
call stare_de_veghe
; this is something for LCD
main:
;btfss btn_port,btn1
;call cmd_1
btfss btn_port,btn2
call cmd_2
btfss btn_port,btn3
call cmd_3
btfss btn_port,btn4
call cmd_4
btfss btn_port,btn5
call cmd_5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;fina l main loop
cmd_1 ;; the same for rest of cmd mnemonics
; bla bla bla
bsf out1; set the LED for out1
call delay ; generic 1s delay
bcf out1; clear LED
;bla bla bla
return
-
Hi, Coss_cat
@ first, i must tell you here is a PicBASIC Pro Forum ... so it is not the best place to ask for Assembler relative questions ... :o
NOW, I see two possibilities ...
1) PortD is controlled by the TrisE register ... so check that.
2) may be a simple debounce problem ... :rolleyes:
Alain
-
Thank you Acetronics. I am new to the forum, just registered yesterday. I thought it is not such a stupid question to ask for PORTD init, considering the fact that I already did the TRISE thing.
Also it is good to know rules arround, and so please tell me where exactly this thread should be posted. I will try to repair my mistake.
:)
Thank you in advance,
-
The best place to ask questions on PIC asembly language would be on the Microchip web forum at http://www.microchip.com/forums/Default.aspx?
This forum is for the MicroengineeringLabs PicBasic Pro & Picbasic compilers.
The primary focus here is helping folks having problems with BASIC, but we do on occasion offer help with assembler.
You should have external pull-up resistors holding your portd inputs high, with each button press grounding an input pin. If you don't have the external pull-ups that would explain erratic behaviour.
Also - be sure on return from any called routine that you're in the proper bank to test portd pins.
I would post all of your code on the Microchip forum for quicker help. It's hard for people to help if they can't see all of your code since the parts you don't show could be where the problem is.