MSSP - "SPI Mode" -[SPI stöds ej av simulatorn]

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
wolfheat
Inlägg: 202
Blev medlem: 14 oktober 2007, 20:42:51
Ort: Gävle

MSSP - "SPI Mode" -[SPI stöds ej av simulatorn]

Inlägg av wolfheat »

Har suttit en hel dag med att försöka förstå mig på hur MSSP funktionen på PICen jag programmerar fungerar, och då SPI varianten.

Använder en PIC18F2685.

När jag simulerar så ger processorn ingen utsignal på varken SCK(PORTC,3) eller SDA(PORTC,4). Enligt min avläsning av databladet så skall detta ske automatiskt då jag skriver till SSPBUF-registret.

ber om ursäkt om det är något ostrukturerat:


Jag gör följande:

CLEARAR TRISC (bsf TRISC,RC4) ;Det är RC4-pinnen som SDI ligger på

ADCON1,PCFG3:PCFG0 sätts till '1111' för samtliga digitala ut/in-gångar

sätter SSPCON1 och SSPSTAT enligt

Kod: Markera allt

		movlw	b'00010000'
		movwf	SSPCON1

		movlw	b'10000000'
		movwf	SSPSTAT
nedan sätts SSPCON1,05h=SSPCON1,SSPEN till '1'(Enablar SDI/SDO/SCK/SS)

Kod: Markera allt

		bsf		SSPCON1,SSPEN	;CHIP ENABLE
		movlw	b'00100000'
		movwf	SSPBUF
ff		BTFSS SSPSTAT, BF
		goto	ff
Efter flyttningen av 00100000 till SSPBUF förväntar jag mig att SCK samt SDA skall ändra sig då jag stegar mig fram simuleringen, men inget händer. Jag fastnar i loopen. Jag trodde att så fort SSPBUF skrivits till så kommer den automatiskt skicka ut pulsklockor på SCK-porten enligt SSPCON1,(SSPM3:SSPM0) hastigheten (kör med 500 kHz intern osc för närvarande). Så i simuleringen (i MPLAB 8.00 MPLAB SIM) hade jag förväntat mig att se PORTC,03 och PORTC,04 ändras när jag stegar mig fram i koden, men icke. Vad gör jag för fel.? Har dubbelkollat allt enligt databladet, men kan inte komma fram till vad jag gjort för fel.
Senast redigerad av wolfheat 19 oktober 2008, 02:03:28, redigerad totalt 1 gång.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Hej!
Kolla för säkerhets skull om SPI stöds i simulatorn. Jag har försökt simulera för dspic och rapporterade fel till teknisk support som bara hänvisade till att den perferienheten inte stöds i simulatorn.

Det funkar bättre i verkligheten dock :-)
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

klippt från hjälpfilen för simulatorn i MPLAB under "limitations->general limitations"


Limitations that apply to all devices are listed below. Some devices may have specific limitations.

Note: If you have trouble with I/O pins on processors that have A/D (e.g., PIC16F877A), make certain that the ADCON registers are configuring those pins for digital I/O rather than for analog input. For most processors, these default to analog inputs and the associated pins cannot be used for I/O until the ADCON (or ADCON1) register is set properly.
MPLAB SIM is a discrete-event (as opposed to real-time) simulator.
Interrupt latency may not be accurate.
Weak pull-ups on ports not implemented.
The internal oscillator can be changed in software, but will not effect of the speed of the oscillator during runtime.
For devices with the listed peripherals, the following limitations apply:
Timer1 increments on RC0, not RC1, for Timer1 enabled.
A/D conversion time is not completely simulated across frequencies.
Comparator modes that use CVref will not be simulated.
PWM output resolution is limited to 1 Tcy.
For devices with the listed peripherals, these peripherals are NOT supported:
User ID memory.
Programmable Switch-Mode Controller (PSMC).
Brown-out detection (BOD) and low voltage detection (LVD).
"Doze" power saving mode.

Serial I/O (i.e., SSP including I2C and SPI). As a result, the SSPSTAT register has been made readable and writable.
Note: You can use stimulus to emulate many of the signals of SPI and have firmware read data as if it was SPI.

USB and CAN.
Parallel Slave Port (PSP).
D/A converter (DAC) and Op Amp (OPA).
Quadrature Encoder Interface (QEI) of the Motion Feedback module.
Code protection
Oscillator switching is not supported by the simulator.
Ultra Low Power Wake Up Enable (ULPWUE) is not supported by the simulator.
The dead time of PWMs is not simulated under the MPLAB IDE simulator.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Kolla för säkerhets skull om SPI stöds i simulatorn.

SSP (I2C och SPI) stöds inte i MPSIM.
Det är tydligt angivet...
Användarvisningsbild
wolfheat
Inlägg: 202
Blev medlem: 14 oktober 2007, 20:42:51
Ort: Gävle

Inlägg av wolfheat »

Då var det ju enkelt.
Användarvisningsbild
wolfheat
Inlägg: 202
Blev medlem: 14 oktober 2007, 20:42:51
Ort: Gävle

Inlägg av wolfheat »

Verkar som jag har gjort någon tabbe i programmeringen ändå:

använder en PIC18F2685 försöker kommunicera med en nokia 3310 display (PCD 8594) . http://www.myplace.nu/mp3/files/pcd8544.pdf

Har kopplat (DISPLAYPORT=>PICPORT)
RES=>PORTA,RA2,
Vlcd är kopplat via 22µC till jord
GND=>GND
SCE=>PORTA,RA1,
D/C=>PORTA,RA0,
SDI=>PORTC,RC5
SCK=>PORTC,RC3
Vdd=>Vdd

Har testat med två stycken olika 3310-displayer nu och ingen av dem ger något som helst liv ifrån sig. Tänkte att jag postar den kod jag använder, så om någon är haj på dessa displayer kanske kan se vad som blir fel.

Använde först den interna SPI-funktionen(därav InitdisplayConfig), men eftersom denna inte syns i simuleringen bytte jag till att skicka signalerna "för hand" (Init2).

Kod: Markera allt

		;*****Set up the Constants**** 
		include		<P18F2685.inc>
		CONFIG	OSC = IRCIO67, 	FCMEN = OFF, 	IESO = OFF
		CONFIG	PWRT = OFF, 	BOREN = OFF, 	WDT = OFF
		CONFIG	MCLRE = ON,		LPT1OSC = OFF,	PBADEN = OFF
		CONFIG	DEBUG = ON,		XINST = OFF,	LVP = OFF
		CONFIG	STVREN = OFF	
		CONFIG	CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF, CP4 = OFF, CP5 = OFF 
		CONFIG	CPB = OFF, CPD = OFF
		CONFIG	WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF, WRT4 = OFF, WRT5 = OFF
		CONFIG	WRTB = OFF
		CONFIG	WRTC = OFF	;Configuration register Code protected
		CONFIG	WRTD = OFF
		CONFIG	EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF, EBTR4 = OFF, EBTR5 = OFF
		CONFIG 	EBTRB = OFF
		org 0

		movlw	b'00110010'
;		movlw	b'01110010'
		movwf	OSCCON
		movlw	b'11111111'
		movwf	ADCON1

;*****initializing the PIC 18F4685**** 
InitPIC	nop

		clrf	TRISA
		;bsf	TRISA,SS	; SS=0 SS-disabled
		clrf	TRISB
		clrf	TRISC		;outputs for SCK, SDO
		bsf		TRISC,RC4	;input for SDI

		clrf	PORTA

		bsf	TRISA,RA0

		Cblock	08h
		COUNT1	;equ	08h                 ;First counter for our delay loops
		COUNT2 	;equ	09h                 ;Second counter for our delay loops 
		COUNT3
		variabel

		endC
DDC 	equ	RA0
SCE 	equ	RA1
DRES 	equ	RA2
		

loop1		call	loop
		call	longdelay
		call	longdelay
		;all Configg
		;call	InitdisplayConfig
		call	Init2
		call	loop
		goto loop1

Init2		; Commands
		;	call	reset_display 	[DRES clear, shortdelay DRES set]
		;	call	command_mode	[DDC clear]
		;	call	ram_mode		[DDC set]
		;	call	enable_data		[SCE clear]
		;	call	disable_data	[SCE set]

		bcf	PORTC,SCK
		;bsf	PORTA,DRES
		call  	disable_lcd_output		

		call	disable_data
		call	enable_data
		call	reset_display
		call	command_mode
		movlw	b'00100100'	; COMMAND last three 100=DB2:DB0
; DB2=0 LCD-chip power down	; DB1=0 horisontal adr.	; DB0=0 basic instructionset
; DB2=1 LCD-chip active		; DB1=1 vertical adres.	; DB0=1 extend. instructionset
		movwf	variabel
		call	send_data

		movlw	b'10011111'	; Contrast
		movwf	variabel
		call	send_data

		movlw	b'00001100'	; Normal mode
		movwf	variabel
		call	send_data

		call	ram_mode

fluiff	movlw	b'01110011'	; sends data 01110011 to display
		movwf	variabel
		call	send_data
		goto fluiff


InitdisplayConfig	nop

		movlw	b'00010000'
		movwf	SSPCON1

		movlw	b'10000000'
		movwf	SSPSTAT
		
		call	enable_lcd_output

		; D/C Low = commandbyte
		; SCE LOW = enables data to be clocked in
		; DDC=RA0	SCE=RA1	(D)RES=RA2 

		call	reset_display
;		bsf		PORTA,04h
		call	shortdelay
		call	command_mode
		call	enable_data

		movlw	b'00100000'
		movwf	SSPBUF

ff		nop
		goto	ff

		call	enable_data
;		call	w1
		call	shortdelay
		call	disable_data
		bcf		PORTA,04h

		call	enable_data
		movlw	b'00001001'
		movwf	SSPBUF
		call	shortdelay
		call	disable_data

		call	ram_mode
		movlw	b'00001001'
		movwf	SSPBUF
		call	enable_data
		call	shortdelay
		call	disable_data


		nop		;YES
		bsf		PORTA,DDC	; RAM-BYTE
		return


; ***  TESTPROGRAM   ***
loop	nop
		CLRWDT	
		call	longdelay
		bsf		PORTA,04h
		call	longdelay
		bcf		PORTA,04h
		return


; ***  SEND DATA TO DISPLAY ***
send_data		movlw	08h
		movwf	COUNT3
		nop	;8bits out
		call	shiftout
		return
; ***  SHIFTING OUT TO DISPLAY ***
shiftout	rlcf	variabel,F
		bcf	PORTC,SDO
		btfsc	STATUS,C
		 bsf	PORTC,SDO		 
		; SDO rätt värde		
 		call	shortdelay
		bsf	PORTC,SCK
		call	shortdelay
		bcf	PORTC,SCK
		decfsz COUNT3,F	;counts down from 8 to 0
		goto	shiftout
		return

;**** LONGDELAY **** 
longdelay	call	shortdelay
        	decfsz 	COUNT2,F       ;us to see it turned off
        	goto 	longdelay 
			return

;**** SHORTDELAY **** 
shortdelay	decfsz	COUNT1,F       ;This second loop keeps the
      		goto   	shortdelay      ;LED turned off long enough for 
			return

;**** CONFIG Utföres i början för att initiera picen **** 
		return
Configg	nop

;**** CONFIG Utföres i början för att initiera picen **** 
enable_lcd_output nop
		bsf		SSPCON1,SSPEN	;CHIP ENABLE
		return

;**** CONFIG Utföres i början för att initiera picen **** 
disable_lcd_output nop
		bcf		SSPCON1,SSPEN	;CHIP ENABLE
		return

; ***  DISPLAY OPTIONS  ***
; ***  RESET DISPLAY   ***
reset_display	nop
RES_OFF			bcf	PORTA,DRES	; RESET DISPLAY
				call	shortdelay
RES_ON			bsf	PORTA,DRES	; RESET DISPLAY
				return

; ***  TURN ON COMMAND MODE   ***
command_mode	nop
DC_OFF			bcf	PORTA,DDC	; COMMAND-BYTE
				return
; ***  TURN ON RAM MODE   ***
ram_mode		nop
DC_ON			bsf	PORTA,DDC	; COMMAND-BYTE
				return
; ***  TURN ON DATAENABLE   ***
enable_data		nop
SCE_OFF			bcf	PORTA,SCE	; ENABLES DATA IN
				return
; ***  TURN OFF DATAENABLE   ***
disable_data	nop
SCE_ON			bsf	PORTA,SCE	; DISABLES DATA IN
				return

		end
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Hallå!
Jag sitter på jobbet just nu och har inte tillgång till min kod hemma.
Tycker att initierings sekvensen ser lite kort ut, har för mig att jag själv skickar minst 7st bytes för att sätta upp den korrekt. Själv skriver jag all kod i C, tycker det e jobbigt med asm, svårt för mig att sätta fingret på exakt vad det är som e fel.

Har du kollat på vad andra gjort, det kan hjälpa en del. Här finns det lite kod att ladda ner:

http://www.gedanken.demon.co.uk/amb-pic-code/#Download

sen finns det även lite andra ställen med liknande projekt om just denna display:

http://www.piclist.com/techref/io/lcd/LPH7366.htm
http://www.100acre.org/elec/nokia_lcd/
http://www.8051projects.net/out.php?lin ... ItemID=282
http://serdisplib.sourceforge.net/ser/pcd8544.html


Om du inte får igång den så får jag väl ta en titt hemma, tidigast imorgon
Användarvisningsbild
wolfheat
Inlägg: 202
Blev medlem: 14 oktober 2007, 20:42:51
Ort: Gävle

Inlägg av wolfheat »

Hej igen.

Jag har nu lyckats fått något sorts liv från LCDn men kanske inte det jag önskat. Och dessutom verkar det helt oberoende utav om jag skickar in något till displayen eller ej.

Det jag gör när jag får ut något på displayen är att slå av och på strömmen. Då händer det ibland att vid avstängningen så ritas vertikala och horisontella streck ut, dessa mattas ut tills dess att de försvinner helt. Och det verkar ganska slumpartat ifall detta inträffar eller ej. Har testat att ta bort koden som skickar kommandon till LCDn och ingen skillnad inträffar. Så jag antar att det jag skickar in är fel.

Det verkar som om det enda som krävs för att displayen skall bete sig såhär (när jag slår ON-OFF på strömmen) , är att Reset är hög samt att GND och VDD är inkopplat.

Skall jobba vidare och se vad jag kommer på, har ni nåt tips på vad jag kan kolla eller ändra på så mottages det tacksamt.
Skriv svar