Komma igång med PIC och SPI för att driva LCD

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
tobias_84
Inlägg: 8
Blev medlem: 22 juli 2012, 14:25:21

Komma igång med PIC och SPI för att driva LCD

Inlägg av tobias_84 »

Hej!

Jag försöker få igång ett projekt med en PIC16F690 och en LCD modul som drivs via SPI.

Behöver lite hintar för att komma vidare. Målet just nu är att få ut ett 'Hello World' på LCD modulen.

Här är min exempelkod som jag tänkt använda för övningen.
Hittar lite olika kod exempel men dom är basserade på C och jag vill gärna fortsätta att hålla mig till ASM ett tag till.

Bifogar även en pdf över instruktionerna på LCD modulen.

Kod: Markera allt

#include <p16f690.inc>

     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

     cblock 0x20
Ctr0
Dly0
Dly1
     endc


     org 0
     nop


; Set up the SPI Support
        BANKSEL     TRISA		; BANK 1
        movlw		0x00		; Set PORTA as
        movwf		TRISA		; all Outputs
        movlw		0x06		; Turn off A/D
        movwf		ADCON1		; so PORTA can be used


; Set up the SPI Port
        BANKSEL     TRISB
        movlw       b'0001'     ; RB4 = SDI
        movwf       TRISB

        bcf         TRISB,6     ; 


        BANKSEL     TRISC		; BANK 1
        movlw		0xFF		; SCK is output (Master), SDI is input,
        movwf		TRISC		; SDO is output, all others output
        movlw		0x40		; Mode 1,1 SPI, middle of output
    	movwf		SSPSTAT		; time sampling
        BANKSEL     SSPCON		; BANK 0
        movlw		0x31		; Mode 1,1 SPI Master Mode, 1/16 Tosc bit


time
        movwf		SSPCON  	; SSP is on
Send_DT
;          bcf		PORTA,CS	; Enable Chip Select Output (low)


        movf		Ctr0,W 		; Get Ctr (Counter Value) in W
        movwf		SSPBUF 		; put in SSPBUF
        BANKSEL     SSPSTAT		; BANK 1
Char1	btfss		SSPSTAT,BF	; Data transfer complete? (Buffer Full?)
        goto		Char1		; if not, check again
        BANKSEL     SSPBUF		; BANK0
        movf		SSPBUF,W	; Get Data from SSPBUF
						; Throw it away
;    	bsf         PORTA,CS		; Disable Chip Select Output (high)


Update_Test_Counter
    	incf		Ctr0,F		; Increment counter variable

Delay	movlw		0x01		; Simple delay Loop
        movwf		Dly1		;
        movlw		0x0F 		;
        movwf		Dly0 		;
DlyLoop decfsz      Dly0,F		;
        goto		DlyLoop 	;
        decfsz 		Dly1,F		;
        goto 		DlyLoop 	;
                                ; Done Delay
                        ; Simple Delay loop

DoAgain	goto        Send_DT		; Done, Send Next Byte

     end

     
   
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Komma igång med PIC och SPI för att driva LCD

Inlägg av sodjan »

Har du gjort några grundläggande kontroller?
Som att det över huvudtaget blir någon signal på SPI linjerna?
Du skriver ingenting om vilken felsökning du redan har gjort.
tobias_84
Inlägg: 8
Blev medlem: 22 juli 2012, 14:25:21

Re: Komma igång med PIC och SPI för att driva LCD

Inlägg av tobias_84 »

Jag har tyvärr inte tillgång till något instrument för att övervaka kommunikationen. Men om jag skickar signaler via RS232 och en MAX232 så får jag ett svar. Dok vet jag att det inte går att kommunicera på detta vis då SPI byter data hela tiden.


Det jag behöver hjälp med är att få upp en grund, skicka initiering till modulen, och bygga upp en kodrad som skickar informationen korrekt till modulen.

Vill som sagt bara ha lite hintar så jag kommer vidare med att bygga upp programmet såpass att jag själv kan komma vidare.
ElectricNooB
Inlägg: 600
Blev medlem: 26 juli 2011, 20:58:06

Re: Komma igång med PIC och SPI för att driva LCD

Inlägg av ElectricNooB »

Hm, RB4, är det verkligen 0b0001? Var ett tag sen jag höll på med 16f690...

Kod: Markera allt

; Set up the SPI Port
        BANKSEL     TRISB
        movlw       b'0001'     ; RB4 = SDI
        movwf       TRISB
Edit: Vad jag kan se i databladet så är inte det. :humm:
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Komma igång med PIC och SPI för att driva LCD

Inlägg av sodjan »

ElectricNooB har *sannolikt* helt rätt här.
Men det är egentligen ointressant... :-)

> movlw b'0001'
> movwf TRISB

Jag kommer inte ihåg (och varför skulle någon behöva göra det?)
om det där ger '00000001' eller '00010000' till TRISB, jag skulle
gissa det första (de höga bitarna "fylls ut", så att säga).

Så, när det gäller 8-bit register, anga **ALLTID** alla 8 bitarna !
Att några bitar inte används är ointressant.

D.v.s:

> movlw b'00010000'
> movwf TRISB

eller:

bcf TRISB, TRISB7
bcf TRISB, TRISB6
bcf TRISB, TRISB5
bsf TRISB, TRISB4

vilket fungerar lika bra.

Men försöka aldrig att ta genvägar vid hantering av hela 8-bits
register, det blir alldeles för lätt fel...
Användarvisningsbild
Klas-Kenny
Inlägg: 11828
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Komma igång med PIC och SPI för att driva LCD

Inlägg av Klas-Kenny »

Jag kommer inte ihåg (och varför skulle någon behöva göra det?)
om det där ger '00000001' eller '00010000' till TRISB, jag skulle
gissa det första.
Helt rätt, blir glasklart om man funderar över vad talen representerar i decimalform.

b'0001' är decimalt 1. Dvs. samma som b'00000001' (till vänster kan man ju alltid lägga till eller ta bort nollor som man vill, gäller alla talsystem).

b'00010000' där emot är ju decimalt 16.

Att ta bort nollor till höger blir även det samma sak som att ta bort nollor till höger i vårt decimala talsystem, 1000 och 1 är ju inte *riktigt* samma tal, det är ju "tusen" och "ett".


Kände bara att det kunde vara värt ett förtydligande till TS. :)

Edit: Hoppsan, hade råkat skriva Vänster där det skulle stå höger.
Senast redigerad av Klas-Kenny 22 december 2013, 00:32:12, redigerad totalt 1 gång.
ElectricNooB
Inlägg: 600
Blev medlem: 26 juli 2011, 20:58:06

Re: Komma igång med PIC och SPI för att driva LCD

Inlägg av ElectricNooB »

Jo, det där kan ta ett tag att få känslan för. :)
Skriv svar