PDA

View Full Version : init PORTD FOR 16F877A



coss_cat
- 18th June 2010, 09:21
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

Acetronics2
- 18th June 2010, 12:20
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

coss_cat
- 19th June 2010, 14:08
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,

Bruce
- 19th June 2010, 17:16
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.