Ik wil een lcd scherm (2x16) in 4 bit mode aan een pic hangen, maar ik krijg hem niet aan de praat. ik wil nu alleen nog maar de cursor zien.

ik heb al op het forum gezocht maar kan niet het antwoord vinden.


		; Disable warning : Register in operand not in bank 0
		ERRORLEVEL -302 
				

		LIST p=16F628A
		INCLUDE <p16F628A.inc>
		__CONFIG        _BODEN_OFF & _CP_OFF & _DATA_CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
		
#define lcd		PORTB				;d4 = portb.0, d7 = portb.3
#define rs		PORTA, 4
#define	en		PORTA, 3
		

		cblock 	0x20
				wacht1_1
				wacht1_2
				wacht1_3
				wacht1_4
				wacht2_1
				wacht2_2
				wacht2_3
				aantalms
		endc
		

		org		0x00
		movlw	D'7' 		; 
        movwf	CMCON		; Comparators off, all pins digital I/O 
		clrf	PORTA
		clrf	PORTB
		bsf		03h, d'5'						;bank 1
		bcf		81h, d'7' 						;portb pull-ups on
		clrf	TRISA
		clrf	TRISB
		bcf		83h, d'5'						;bank 0

;-------------------------------------------------------
		
main	
		movlw	d'5'
		call	delay100ms
		call 	init 	
		goto 	einde


;-------------------------------------------------------

delay100ms										
		movwf	wacht1_1						;1 stap
		movlw	d'100'							;1 stap
		movwf	aantalms
delayms	movf	aantalms,0						;1 stap
		movwf	wacht1_2						;1 stap
delayms1
		movlw	d'2'							;1 stap
		movwf	wacht1_3						;1 stap
delayms2
		movlw	d'166'							;1 stap			]
		movwf	wacht1_4						;1 stap			]
delayms3										;				]500 stappen
		DECFSZ	wacht1_4, f						;1 stap			]				
		goto	delayms3						;2 stappen		]
		decfsz	wacht1_3, f						;1 stap
		goto	delayms2						;2 stappen
		decfsz	wacht1_2, f						;1 stap
		goto	delayms1						;2 stappen
		decfsz	wacht1_1, f						;1 stap
		goto	delayms							;2 stappen
		return									;2 stappen

;---------------------------------------------------------------------------------------------------------------------------------------------------------------

delayus											;wachtijd -4 delen door 3 en antwoord invullen
		movwf	wacht2_1						;1 stap
delayus1
		decfsz	wacht2_1, f						;1 stap
		goto	delayus1						;2 stappen
		return

;-----------------------------------------------------------------------------------------------

cls		
		bcf		rs
		clrf	lcd
		call	enabled
		movlw	b'00000001'
		movwf	lcd
        call	enabled
		bsf		rs
		return

;--------------------------------------------------------------

init	
		bcf		rs
		movlw	b'00000100'
		movwf	lcd
		call 	enabled
		call	enabled
		movlw	b'00001100'
		movwf	lcd
		call 	enabled

		clrf	lcd
		call 	enabled
		movlw	b'00001111'
		movwf	lcd
		call 	enabled

		call 	cls
		bcf		rs

		clrf	lcd
		call 	enabled
		movlw	b'00000100'
		movwf	lcd
		call 	enabled
		bsf		rs
		return		
		
;--------------------------------------------------------------

enabled
		bsf		en
		nop
		nop
		nop
		nop
		nop
		bcf		en
		movlw	d'50'
		movwf	aantalms
		call 	delayms	
		return

;--------------------------------------------------------------

einde
                sleep                              ;toegevoegt
                goto    einde                      ;toegevoegt
		end
		

Zonder je listing verder te bekijken, moet bij het label einde nog staan: goto einde, anders blijft je PIC elke keer opnieuw beginnen, als hij alle NOPs in het geheugen heeft afgelopen en weer bij adres 0 uit komt.

"end" is een assembler directive, geen processor instructie. De PIC loopt dus gewoon door een deel van het programmageheugen waar ongedefinieerde instructies staan. Bij een nieuwe PIC zijn dat NOPs, maar wie weet wat voor programmaresten er nog rondslingeren....

bedankt, ik dacht dat dat ook zorgte dat de pic er niet mee verder ging. ik heb eerst met picbasic gewerkt en daar was het zo dat het programma daarmee ophield. nu zag ik het ook in de tuts staan maar zonder echte uitleg dus dacht ik dat het het zelfde deed.

iemand???
kom er zelf niet uit.

ik doe het zo:


;****************************************************************************
; program for making a standard hitachi lcd controllable by serial commands
;runs on a pic 16f628A on 4Mhz, comms is 19k2,8,n,1
; (c) M.A. Pals 2007
;****************************************************************************
; Revision	: 0.06 Init LCD now works
;		: 0.07 inproved lcd routines. no garbage on screen anymore!
;		: 0.08 trying to be fasterrrr...
;             : 0.09 faster! faster!
;		: 0.10 trying 9600 baud and 19k2: pass!
;		: 0.11 now implemement the interrupt handling of RX data: done!
;****************************************************************************
LIST    P=16F628A,f=inhx8m,r=hex

INCLUDE ".\P16F628A.inc"

; Special symbolic names for this project
LCD_POS	EQU		0x30 	;position on the LCD
LCD_CHR	EQU		0x31 	;character or command to send to the LCD
LCD_PNT	EQU		0x32 	;RS232/LCD memory pointer
LCD_DAT	EQU		0x40 	;RS232/LCD memory start (20 bytes)
						;data is on port B: 4 bit LCD data is on RB4 to 7
E		EQU		0		;PORTA, bit 0
RS		EQU		1		;PORTA, bit 1
RW		EQU		2		;PORTA, bit 2

;Configuration word setting
 
__CONFIG _BODEN_ON &_CP_OFF &_DATA_CP_OFF &_PWRTE_OFF &_WDT_OFF &_LVP_OFF &_MCLRE_ON &_HS_OSC

; Begin code at 0

	org     0x00				; origin
		goto	start			;goto start vector
	org		0x04				;this is the INT vector
		goto	inthnd			;this is the name of the inthandler subroutine

;---- initilisiation ---- 

start:
		call 	initall			;initialize all PIC global settings
		call 	LCDInit			;initialize LCD
		call    ActivateInt		;activate the interrupts
;---- main program ----	
mainlp:
		btfsc	PORTB,3
		goto	dolo
		bsf		PORTB,3
		goto	mainlp
dolo	bcf		PORTB,3
		goto	mainlp
;---- init routines and subroutines go here ----		
initall:	
		call	bank0			;be sure we're in bank 0 
		movlw	H'007'
		movwf	CMCON			;comparators off
        movlw 	b'00000000'		; set up portA
        movwf 	PORTA
		movlw 	b'00000100'		; RB2(TX)=1 others are 0
        movwf 	PORTB
        call	bank1			;set bank 1
        movlw	b'11110000'		; RA0-3 output, others input
        movwf 	TRISA			; portA all pins input
        movlw 	b'00000010'		; RB1(RX)=input, others output
        movwf 	TRISB 
		movlw	0x0C			; 0C hex = 19200 baud / 19hex = 9600 baud / 33hex = 4800 baud
		movwf	SPBRG			; put in register
		movlw	b'00100100'		;BRGH=1 and TXEN=1
		movwf	TXSTA			;put in register
		call	bank0			;set bank 0 
		movlw	b'10010000'		;SPEN=1 and CREN=1
		movwf	RCSTA			;put in register
		call	longwt			;wait some
		movf	RCREG,W			;flush receive buffer
		movf	RCREG,W			;flush receive buffer
		movf	RCREG,W			;flush receive buffer
		return	

ActivateInt:
		call	bank0
		clrf	PIR1			;make sure these interrupt flags are clear
		movlw   b'11000000'		;enable interrupt mask to peripheral interrupts & set interrupt enable
		movwf   INTCON
		call    bank1
		movlw   b'00100000'		
		movwf	PIE1			;enable serial RX interrupt
		call	bank0
		return

;---- LCD init routines and subroutines go here ----		
LCDInit:	
		call	longwt			;wait for the LCD to become settled

		movlw	b'00100000'		;goto 4 bit mode 
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command

		movlw	b'00100000'		;lcd data setup: font etc (only upper nibble is significant) : 1st part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		movlw	b'10000000'		;lcd data setup: font etc (only upper nibble is significant) : 2nd part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		
		movlw	b'00000000'		;lcd display on (only upper nibble is significant) : 1st part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		movlw	b'11110000'		;lcd  display on (only upper nibble is significant) : 2nd part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		
		movlw	b'00000000'		;clear display (only upper nibble is significant) : 1st part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		movlw	b'00010000'		;clear lcd display (only upper nibble is significant) : 2nd part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		
		movlw	b'00000000'		;autoincrement display (only upper nibble is significant) : 1st part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		movlw	b'01100000'		;autoincrement display (only upper nibble is significant) : 2nd part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		return

LCD_SendCMD:	
								;THIS ROUTINE DOES HALF A COMMAND!  so it has to be run twice for each command (except goto 4 bit that is)
		bcf		PORTA,RS		; Set RS in command mode
		bcf		PORTA,RW		; Set RW in write mode
		movlw	b'00001111'		;set mask
		andwf   PORTB,SAME		; Clear the upper nibble on the port 
		movf    LCD_CHR,W		; load the char to send in W (upper nibble)  
		andlw   b'11110000'		; Get upper nibble of char
		iorwf   PORTB,SAME		; Send data to LCD	
		call	ToggleE			;issue the command
		call	lcdwt			;wait some
		return
		
LCD_SendCHR:
		bsf		PORTA,RS		; Set RS in char mode
		bcf		PORTA,RW		; Set RW in write mode
		movlw	b'00001111'		; set mask
		andwf   PORTB,SAME		; Clear the upper nibble on the port 
		movf    LCD_CHR,W		; load the char to send in W (upper nibble)  
		andlw   b'11110000'		; Get upper nibble of char in W only
		iorwf   PORTB,SAME		; Send data to LCD	
		call	ToggleE			; issue the command
		call	lcdwt			; wait some
		movlw	b'00001111'		; set mask
		andwf   PORTB,SAME		; Clear the upper nibble on the port
		swapf   LCD_CHR,W		; load the char to send in W (lower nibble)  
		andlw   b'11110000'		; Get upper nibble of char in W only
		iorwf   PORTB,SAME		; Send data to LCD	
		call	ToggleE			; issue the command
		call	lcdwt			; wait some
		return

ToggleE:
		bsf		PORTA,E			;put E high
		call	shrtwt			;wait some
		bcf		PORTA,E			;Put E low
		return
;---- Interrupt handling routines and subroutines go here ----		
inthnd:
		btfss	PIR1,RCIF		;check whether char was received
		retfie	 				;it wasn't.....
		movf	RCREG,W		    ;store char in w
		movwf	LCD_CHR			; store the char in LCD_CHR RAM
		movwf	TXREG			;send away char in W
		call	LCD_SendCHR		;send to the LCD
		clrf	PIR1			;reset the interrupt
		retfie					;return from interrupt.
;---- wait routines and subroutines go here ----		
	
;short wait loop
shrtwt	movlw	0x3
		movwf	SR1
lusje	decfsz	SR1,SAME
		goto	lusje
		return

;long wait loop
longwt	movlw	0x20
		movwf	SR1
outer	movlw   0xFF
		movwf	SR2
inner   decfsz	SR2,SAME
		goto	inner
		decfsz	SR1,SAME
		goto	outer
		return

;lcd wait loop: 
lcdwt	movlw	0x05
		movwf	SR1
lusje2	decfsz	SR1,SAME
		goto	lusje2
		return
		
;---- bank switch routines go here ----				
bank0	bcf		STATUS,RP0
		bcf		STATUS,RP1
		return

bank1	bsf		STATUS,RP0
		bcf		STATUS,RP1
		return
END

deze code is tried and tested!

FRIPSTER

bedankt :D
maar ik wou eigenlijk de rw pin niet gebruiken. of werkt deze code ook als de rw pin niet is aangesloten

hoi,

zou eigenlijk ook moeten kunnen, ik heb de RW ook niet echt gebruikt (ik zet hem laag, en daarna nergens meer hoog), dus altijg op laag zetten zou ook moeten kunnen. Waarom niet eerst proberen?

Verder: SRxx = een willekeurige RAM lokatie. Het is een naam die ik voor mijzelf heb bedacht (Scratch Ram = SR)

fripster

De RW pin kan je gewoon aan de massa hangen. Die RW pin gebruik je als de busyflag wilt uitlezen. Maar als je gewoon een voldoende lange delay in je software gebruikt heb je dat niet nodig. Het display werkt op 1MHz (bij 3V). Dus een delay van 1uS is genoeg.

hij geeft nu elke keer de error code:


Error[113]   D:\ASM\LCD.ASM 190 : Symbol not previously defined (SAME)

wat moet ik met dat SAME doen?

oh ja... dat betekent 'hetzelfde'. Zie ook mijn INC file hier:


        LIST
; P16F628A.INC  Standard Header File, Version 1.01    Microchip Technology, Inc.
        NOLIST

; Verify Processor


        IFNDEF __16F628A
           MESSG "Processor-header file mismatch.  Verify selected processor."
        ENDIF

; Register Definitions

W                            EQU     H'0000'
F                            EQU     H'0001'

; Register Files

INDF                         EQU     H'0000'
TMR0                         EQU     H'0001'
PCL                          EQU     H'0002'
STATUS                       EQU     H'0003'
FSR                          EQU     H'0004'
PORTA                        EQU     H'0005'
PORTB                        EQU     H'0006'
PCLATH                       EQU     H'000A'
INTCON                       EQU     H'000B'
PIR1                         EQU     H'000C'
TMR1L                        EQU     H'000E'
TMR1H                        EQU     H'000F'
T1CON                        EQU     H'0010'
TMR2                         EQU     H'0011'
T2CON                        EQU     H'0012'
CCPR1L                       EQU     H'0015'
CCPR1H                       EQU     H'0016'
CCP1CON                      EQU     H'0017'
RCSTA                        EQU     H'0018'
TXREG                        EQU     H'0019'
RCREG                        EQU     H'001A'
CMCON                        EQU     H'001F'
OPTION_REG                   EQU     H'0081'
TRISA                        EQU     H'0085'
TRISB                        EQU     H'0086'
PIE1                         EQU     H'008C'
PCON                         EQU     H'008E'
PR2                          EQU     H'0092'
TXSTA                        EQU     H'0098'
SPBRG                        EQU     H'0099'
EEDATA                       EQU     H'009A'
EEADR                        EQU     H'009B'
EECON1                       EQU     H'009C'
EECON2                       EQU     H'009D'
VRCON                        EQU     H'009F'

; STATUS Bits

IRP                          EQU     H'0007'
RP1                          EQU     H'0006'
RP0                          EQU     H'0005'
NOT_TO                       EQU     H'0004'
NOT_PD                       EQU     H'0003'
Z                            EQU     H'0002'
DC                           EQU     H'0001'
C                            EQU     H'0000'

; INTCON Bits

GIE                          EQU     H'0007'
PEIE                         EQU     H'0006'
T0IE                         EQU     H'0005'
INTE                         EQU     H'0004'
RBIE                         EQU     H'0003'
T0IF                         EQU     H'0002'
INTF                         EQU     H'0001'
RBIF                         EQU     H'0000'

; PIR1 Bits

EEIF                         EQU     H'0007'
CMIF                         EQU     H'0006'
RCIF                         EQU     H'0005'
TXIF                         EQU     H'0004'
CCP1IF                       EQU     H'0002'
TMR2IF                       EQU     H'0001'
TMR1IF                       EQU     H'0000'

; T1CON Bits
T1CKPS1                      EQU     H'0005'
T1CKPS0                      EQU     H'0004'
T1OSCEN                      EQU     H'0003'
NOT_T1SYNC                   EQU     H'0002'
TMR1CS                       EQU     H'0001'
TMR1ON                       EQU     H'0000'

; T2CON Bits
TOUTPS3                      EQU     H'0006'
TOUTPS2                      EQU     H'0005'
TOUTPS1                      EQU     H'0004'
TOUTPS0                      EQU     H'0003'
TMR2ON                       EQU     H'0002'
T2CKPS1                      EQU     H'0001'
T2CKPS0                      EQU     H'0000'

; CCP1CON Bits
CCP1X                        EQU     H'0005'
CCP1Y                        EQU     H'0004'
CCP1M3                       EQU     H'0003'
CCP1M2                       EQU     H'0002'
CCP1M1                       EQU     H'0001'
CCP1M0                       EQU     H'0000'

; RCSTA Bits
SPEN                         EQU     H'0007'
RX9                          EQU     H'0006'
SREN                         EQU     H'0005'
CREN                         EQU     H'0004'
ADEN                         EQU     H'0003'
FERR                         EQU     H'0002'
OERR                         EQU     H'0001'
RX9D                         EQU     H'0000'

; CMCON Bits

C2OUT                        EQU     H'0007'
C1OUT                        EQU     H'0006'
C2INV                        EQU     H'0005'
C1INV                        EQU     H'0004'
CIS                          EQU     H'0003'
CM2                          EQU     H'0002'
CM1                          EQU     H'0001'
CM0                          EQU     H'0000'

; OPTION Bits

NOT_RBPU                     EQU     H'0007'
INTEDG                       EQU     H'0006'
T0CS                         EQU     H'0005'
T0SE                         EQU     H'0004'
PSA                          EQU     H'0003'
PS2                          EQU     H'0002'
PS1                          EQU     H'0001'
PS0                          EQU     H'0000'

; PIE1 Bits

EEIE                         EQU     H'0007'
CMIE                         EQU     H'0006'
RCIE                         EQU     H'0005'
TXIE                         EQU     H'0004'
CCP1IE                       EQU     H'0002'
TMR2IE                       EQU     H'0001'
TMR1IE                       EQU     H'0000'

; PCON Bits

OSCF                         EQU     H'0003'
NOT_POR                      EQU     H'0001'
NOT_BO                       EQU     H'0000'
NOT_BOR                      EQU     H'0000'
NOT_BOD                      EQU     H'0000'

; TXSTA Bits
CSRC                         EQU     H'0007'
TX9                          EQU     H'0006'
TXEN                         EQU     H'0005'
SYNC                         EQU     H'0004'
BRGH                         EQU     H'0002'
TRMT                         EQU     H'0001'
TX9D                         EQU     H'0000'

; EECON1 Bits
WRERR                        EQU     H'0003'
WREN                         EQU     H'0002'
WR                           EQU     H'0001'
RD                           EQU     H'0000'

; VRCON Bits

VREN                         EQU     H'0007'
VROE                         EQU     H'0006'
VRR                          EQU     H'0005'
VR3                          EQU     H'0003'
VR2                          EQU     H'0002'
VR1                          EQU     H'0001'
VR0                          EQU     H'0000'

; RAM Definition

    __MAXRAM H'01FF'
    __BADRAM H'07'-H'09', H'0D', H'13'-H'14', H'1B'-H'1E'
    __BADRAM H'87'-H'89', H'8D', H'8F'-H'91', H'93'-H'97', H'9E'
    __BADRAM H'105', H'107'-H'109', H'10C'-H'11F', H'150'-H'16F'
    __BADRAM H'185', H'187'-H'189', H'18C'-H'1EF'

; Scratch RAM (SR) byte locations

SR1	EQU		H'020'
SR2	EQU		H'021'
SR3	EQU		H'022'
SR4	EQU		H'023'
SR5	EQU		H'024'
SR6	EQU		H'025'
SR7	EQU		H'026'
SR8	EQU		H'027'
SR9	EQU		H'028'
SR10 EQU	H'029'

; Configuration Bits

_BODEN_ON                    EQU     H'3FFF'
_BODEN_OFF                   EQU     H'3FBF'
_CP_ALL                      EQU     H'03FF'
_CP_75                       EQU     H'17FF'
_CP_50                       EQU     H'2BFF'
_CP_OFF                      EQU     H'3FFF'
_DATA_CP_ON                  EQU     H'3EFF'
_DATA_CP_OFF                 EQU     H'3FFF'
_PWRTE_OFF                   EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_LVP_ON                      EQU     H'3FFF'
_LVP_OFF                     EQU     H'3F7F'
_MCLRE_ON                    EQU     H'3FFF'
_MCLRE_OFF                   EQU     H'3FDF'
_ER_OSC_CLKOUT               EQU     H'3FFF'
_ER_OSC_NOCLKOUT             EQU     H'3FFE'
_INTRC_OSC_CLKOUT            EQU     H'3FFD'
_INTRC_OSC_NOCLKOUT          EQU     H'3FFC'
_EXTCLK_OSC                  EQU     H'3FEF'
_LP_OSC                      EQU     H'3FEC'
_XT_OSC                      EQU     H'3FED'
_HS_OSC                      EQU     H'3FEE'


; FSR Bit locations

IRP		EQU 	H'7'
RP1		EQU		H'6'
RP0		EQU		H'5'
Z		EQU		H'2'
W		EQU		H'0'
SAME 	EQU		H'1'	;same defines destination of register instead of W


        LIST

Dit is de file P16F628A.INC die ge-include wordt aan het begin van de ASM file.

fripster

Het werkt!!! :):):) bedankt

edit: toch niet ik zie wel een cursor op het scherm, maar ik krijg er geen tekst op. ik heb de subroutines gekopieerd van Fripsters stuk en letters verzonden maar er komt niks op


main	
		call 	LCDInit			;initialize LCD
		movlw	b'01001000'  	;H
		movwf	LCD_CHR
		call	LCD_SendCHR
		movlw	'o'
		movwf	LCD_CHR
		call	LCD_SendCHR
		movlw   'i'
		movwf	LCD_CHR
		call	LCD_SendCHR
		
		goto 	einde

dit is het stukje dat ik zend
ps ik heb de datapinnen hangen aan b4 tot b7 klopt dit? ik heb het ook al geprobeert met b0 tot b3 toen lukte de initialisatie ook. dus begrijp ik er niks van

[Bericht gewijzigd door robojan op (92%)]

hoi,

dit zijn de pinnen:


Data RB4 bit 0 databus LCD
     RB5 bit 1
     RB6 bit 3
     RB7 bit 4
E    RA0
RS   RA1
RW   RA2

hope this helps!

ik weet wat er fout is op een of ander manier gaat de rs pin niet hoog. ik heb er nu een led aan hangen en die brand niet.

edit: ik heb nu de pic aangezet tot de initialisatie was gelukt en toen de rs pin handmatig hoog gemaakt en toen kwam de tekst.
(ik heb de instructie van schrijven in een oneindige lus gegooit.)

zou het een kapote poort kunnen zijn?

edit2: ik heb de rs pin op een andere poort aangesloten en nu werkt die wel

edit3: :( :( :( nu weer niet en ik krijg nu op bijde poorten ook geen led meer aan het knipperen dus wat is er
dat die poorten kapot maakt?

dit is niet leuk.

heb je de led wel via een weerstand aangesloten?

ja 220 Ohm

[Bericht gewijzigd door robojan op (67%)]

Alles gecontroleerd op kortsluiting, dus ook bij het lcd? Als een pin stuk is is dat meestal een kortsluiting waardoor het poort na een tijdje sterft.

Plaats is een 2.2K weerstandje in de RS en EN lijnen (en eventueel de RW). Het display moet dan gewoon werken, maar je hebt wel een goede stroom begrenzing.

ik had dit misschien eerder moeten vertellen maar in pic basic lukt het me wel om tekst er op te krijgen en gaat de poort niet kapot. volgens hun aansluit metode. toch niet kapot ik krijg opeens weer alle poorten knipperen.

edit: hij werkt ik was de wachtijd vergeten na de initialisatie

[Bericht gewijzigd door robojan op (13%)]

ik ben nu met een projectje bezig. alleen het lukt mij weer niet om de lcd aan de praat te krijgen. het probleem is een beetje vreemd. namenlijk je krijgt 1 rij blokjes als de initialistatie niet goed gaat. maar ik krijg gewoon 1 rij blokjes zoals het hoort zonder pic, maar met pic krijg ik ook 1 rij blokjes op de eerste rij maar op de 2 rij zijn de 3 bovenste pixels ook aan. en de pixels worden wat doffer.

ik heb de lcd aangesloten op de pinnen 4 tot 7 van poort a en de en aan poort a.3 en rs aan poort a.2. dit heb ik gedaan omdat ik geen plaats meer had op poort b. ik heb dus alle poort b's in de code vervangen door poort a's. omdat de datapinnen op de zelfde plaats zaten maar dan op de andere poort en de en en rs poort veranderd.

hopelijk kunnen jullie helpen


;		Code bij Robbert-jan
;		led klok met speciale effecten
;		zie voor verdere informatie www.freewebs.com/robojan

		; Disable warning : Register in operand not in bank 0
		ERRORLEVEL -302 
				

		LIST p=16F628A
		INCLUDE <p16F628A.inc>
		__CONFIG        _BODEN_OFF & _CP_OFF & _DATA_CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
		
#define lcd		PORTA				;d4 = portb.0, d7 = portb.3
E		EQU		3					;PORTA, bit 0
RS		EQU		2					;PORTA, bit 1

LCD_PNT	EQU		0x34 	;RS232/LCD memory pointer
LCD_DAT	EQU		0x42 	;RS232/LCD memory start (20 bytes)
LCD_POS	EQU		0x32 	;position on the LCD

		

		cblock 	0x20	
				wacht1_1
				wacht1_2
				wacht1_3
				wacht1_4
				wacht2_1
				wacht2_2
				wacht2_3
				aantalms	
				LCD_CHR	
				SR1
				SR2
		endc
		org		0x00		
		goto 	start


		
	
start
		movlw	D'7' 							; 
        movwf	CMCON							; Comparators off, all pins digital I/O 
		clrf	PORTA
		clrf	PORTB
		bsf		03h, d'5'						;bank 1
		bcf		81h, d'7' 						;portb pull-ups on
		clrf	TRISA
		clrf	TRISB
		bcf		83h, d'5'						;bank 0 



;-------------------------------------------------------
		
main	
		movlw	d'5'
		call	delay100ms
		call 	LCDInit			;initialize LCD
		movlw	d'5'
		call	delay100ms

		


		goto 	einde

;-------------------------------------------------------



;-------------------------------------------------------



;-------------------------------------------------------

LCDInit:	
		call	longwt			;wait for the LCD to become settled

		movlw	b'00100000'		;goto 4 bit mode 
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command

		movlw	b'00100000'		;lcd data setup: font etc (only upper nibble is significant) : 1st part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		movlw	b'10000000'		;lcd data setup: font etc (only upper nibble is significant) : 2nd part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		
		movlw	b'00000000'		;lcd display on (only upper nibble is significant) : 1st part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		movlw	b'11110000'		;lcd  display on (only upper nibble is significant) : 2nd part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		
		movlw	b'00000000'		;clear display (only upper nibble is significant) : 1st part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		movlw	b'00010000'		;clear lcd display (only upper nibble is significant) : 2nd part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		
		movlw	b'00000000'		;autoincrement display (only upper nibble is significant) : 1st part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		movlw	b'01100000'		;autoincrement display (only upper nibble is significant) : 2nd part
		movwf	LCD_CHR			;put in RAM	
		call	LCD_SendCMD		;perform the command
		return

;-------------------------------------------------------

LCD_SendCMD:	
								;THIS ROUTINE DOES HALF A COMMAND!  so it has to be run twice for each command (except goto 4 bit that is)
		bcf		PORTA,RS		; Set RS in command mode
		movlw	b'00001111'		;set mask
		andwf   PORTA,SAME		; Clear the upper nibble on the port 
		movf    LCD_CHR,W		; load the char to send in W (upper nibble)  
		andlw   b'11110000'		; Get upper nibble of char
		iorwf   PORTA,SAME		; Send data to LCD	
		call	ToggleE			;issue the command
		call	lcdwt			;wait some
		return

;-------------------------------------------------------

LCD_SendCHR:
		bsf		PORTA,RS		; Set RS in char mode
		movlw	b'00001111'		; set mask
		andwf   PORTA,SAME		; Clear the upper nibble on the port 
		movf    LCD_CHR,W		; load the char to send in W (upper nibble)  
		andlw   b'11110000'		; Get upper nibble of char in W only
		iorwf   PORTA,SAME		; Send data to LCD	
		call	ToggleE			; issue the command
		call	lcdwt			; wait some
		movlw	b'00001111'		; set mask
		andwf   PORTA,SAME		; Clear the upper nibble on the port
		swapf   LCD_CHR,W		; load the char to send in W (lower nibble)  
		andlw   b'11110000'		; Get upper nibble of char in W only
		iorwf   PORTA,SAME		; Send data to LCD	
		call	ToggleE			; issue the command
		call	lcdwt			; wait some
		return

;-------------------------------------------------------

ToggleE:
		bsf		PORTA,E			;put E high
		call	shrtwt			;wait some
		bcf		PORTA,E			;Put E low
		return

;-------------------------------------------------------

delay100ms										
		movwf	wacht1_1						;1 stap
		movlw	d'100'							;1 stap
		movwf	aantalms
delayms	movf	aantalms,0						;1 stap
		movwf	wacht1_2						;1 stap
delayms1
		movlw	d'2'							;1 stap
		movwf	wacht1_3						;1 stap
delayms2
		movlw	d'166'							;1 stap			]
		movwf	wacht1_4						;1 stap			]
delayms3										;				]500 stappen
		DECFSZ	wacht1_4, f						;1 stap			]				
		goto	delayms3						;2 stappen		]
		decfsz	wacht1_3, f						;1 stap
		goto	delayms2						;2 stappen
		decfsz	wacht1_2, f						;1 stap
		goto	delayms1						;2 stappen
		decfsz	wacht1_1, f						;1 stap
		goto	delayms							;2 stappen
		return									;2 stappen

;---------------------------------------------------------------------------------------------------------------------------------------------------------------

delayus											;wachtijd -4 delen door 3 en antwoord invullen
		movwf	wacht2_1						;1 stap
delayus1
		decfsz	wacht2_1, f						;1 stap
		goto	delayus1						;2 stappen
		return

;-----------------------------------------------------------------------------------------------

;short wait loop
shrtwt	movlw	0x3
		movwf	SR1
lusje	decfsz	SR1,SAME
		goto	lusje
		return

;long wait loop
longwt	movlw	0x20
		movwf	SR1
outer	movlw   0xFF
		movwf	SR2
inner   decfsz	SR2,SAME
		goto	inner
		decfsz	SR1,SAME
		goto	outer
		return

;lcd wait loop: 
lcdwt	movlw	0x05
		movwf	SR1
lusje2	decfsz	SR1,SAME
		goto	lusje2
		return
;-------------------------------------------------------------------------------------------
		
einde	sleep
		goto 	einde


		end

Misschien heb je net dezelfde fout gemaakt als ik 5 min geleden. Ik heb niet het hele topic gelezen maar poort a4 en a5 kunnen geen uitgang zijn :(
uit datasheet :
RA4/T0CKI/CMP2 RA4 ST OD Bi-directional I/O port. Output is open drain type.
RA5/MCLR/VPP RA5 ST — Input port

ik heb een ledje aan poort a.5 gehangen met een knipper programma maar hij brandt de hele tijd
is dit nu een poort die je als in en uitgang kan gebruiken want volgens mij heb ik deze poort al heel vaak als uitgang gebruikt

Zie ook boven...

RA4 = OD (sink) output
RA5 = input only

jammer dan, ik heb op poorten ledjes hangen die niet persee nodig zijn dus als ik die 2 poorten doorverbind met die lcd poorten. dus een printje maken die die poorten doorverbinden. hoe kan ik er voor zorgen dat 1 van die 2 poorten hoog (zou moeten) gaan dat dan die andere poort hoog gaat.

edit:


ooooooooo
   /---/|
  //----/
ooooooooo

dus zo'n printje

[Bericht gewijzigd door robojan op (14%)]

hij werkt nu maar ik krijg de 2e regel niet aangestuurt. als ik volgens de datasheet 0x40 stuur naar lcd zou ik op de 2e regel moeten komen. maar dan stuur ik tekst en op de lcd komt $WG6 en dan is het het einde van de lcd regel. wat zou het kunnen zijn