Programmera externt EEPROM (Tillsvidare löst...)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
marcusg
Inlägg: 189
Blev medlem: 7 juli 2007, 21:27:51
Ort: Mariehamn (FI)

Programmera externt EEPROM (Tillsvidare löst...)

Inlägg av marcusg »

Sitter och leker lite med BTc (http://romanblack.com/picsound.htm) på en PIC och skulle nu behöva använda externt EEPROM för att kunna spela upp lite längre ljudsekvenser.

Jag undrar därför hur man bär sig åt när man programmerar en 24LC256. Det bästa jag kan komma på för tillfället för mig vore att göra det via en PIC - finns det någon som känner till färdig mjukvara för det (både för PICen och dator, med RS232-kommunikation)?

Vilket sätt det än blir, kan man helt enkelt exportera ljudet som binär fil (*.btc i BTc 2.0) och ladda upp den filen rakt av?

Edit: rubriken...
Senast redigerad av marcusg 29 juni 2008, 20:57:29, redigerad totalt 2 gånger.
marcusg
Inlägg: 189
Blev medlem: 7 juli 2007, 21:27:51
Ort: Mariehamn (FI)

Inlägg av marcusg »

Har försökt skriva ihop kod för att prata med minnet via I2C, men det går inte så bra. Vet inte ens om minnet alls får mina signaler. Får fortsätta mina studier i detta ämne imorgon, men om någon råkar ha tid att ögna igenom och ge någon kommentar på koden jag slängt ihop så vore jag tacksam.

Verkar koden vara på rätt väg? Hur vet jag om minnet får mina signaler? PICen är en 16F886, minnet ett 24LC256.

När jag kör koden så körs allt, men jag får ingen data från minnet (buffern har kvar det som jag senast skickade till minnet, b'10100001').

Anropar följande funktioner:

Kod: Markera allt

		call	InitRs232 ; använder RS232 för att kommunicera med datorn
		call	InitI2C

Loop
		call	Receive ; tar emot ett tecken via RS232
		call	WriteByteEEPROM ; sparar tecknet
		call	ReadByteEEPROM ; läser (förhoppningsvis) tillbaka tecknet
		call	Send ; skickar tillbaka samma tecken som togs emot, förutsatt att skriv/läs mot EEPROM lyckades...
Och så själva I2C-koden...

Kod: Markera allt

		include		"p16f886.inc"

		global InitI2C, WritePageEEPROM, WriteByteEEPROM, ReadByteEEPROM
		extern	Send

VARS	UDATA
ByteBuffer	res	1

WaitDoneWrite	macro	
		local	Loop
		banksel	SSPSTAT
Loop
		btfsc	SSPSTAT, BF
		goto	Loop
		banksel	PORTA
		endm

;WaitDone	macro
;		local	Loop
;		btfss	PIR1, SSPIF			; wait for ready to send
;		goto	Loop
;		bcf		PIR1, SSPIF
;		endm

SendStart	macro
		local	SendStart_1
		banksel	SSPCON2
		bsf		SSPCON2, SEN
SendStart_1
		btfsc	SSPCON2, SEN
		goto	SendStart_1		; wait until start sent
		banksel	PIR1
		endm

SendReStart	macro
		local	SendReStart_1
		banksel	SSPCON2
		bsf		SSPCON2, RSEN
SendReStart_1
		btfsc	SSPCON2, RSEN
		goto	SendReStart_1		; wait until start sent
		banksel	PIR1
		endm

SendStop	macro
		local	SendStop_1
		banksel	SSPCON2
		bsf		SSPCON2, PEN
SendStop_1
		btfsc	SSPCON2, PEN
		goto	SendStop_1		; wait until stop sent
		banksel	PIR1
		endm

SendControlWrite	macro
		movlw	b'10100000'			; control code, adress and write
		movwf	SSPBUF
		WaitDoneWrite				; wait until control byte sent
		clrw
		movwf	SSPBUF
		WaitDoneWrite				; Send AddrH (0 för detta test)
		clrw
		movwf	SSPBUF
		WaitDoneWrite				; Send AddrL (0 för detta test)
		endm

SendControlRead	macro
		movlw	b'10100001'			; control code, adress and read
		movwf	SSPBUF
		WaitDoneWrite				; wait until control byte sent
		endm




MAIN	CODE

ReadByteEEPROM
		SendStart
		SendControlWrite		; skicka adress
		SendReStart
		SendControlRead
		banksel	SSPCON2
		bsf		SSPCON2, RCEN	; enable receive
ReadByteEEPROM_1
		btfsc	SSPCON2, RCEN
		goto	ReadByteEEPROM_1
		banksel	PORTA
		banksel	SSPBUF
		movfw	SSPBUF
		SendStop
		return
		


WriteByteEEPROM
		movwf	ByteBuffer
		SendStart
		SendControlWrite
		movfw	ByteBuffer
		movwf	SSPBUF
		WaitDoneWrite			; wait until data sent
		SendStop
		return
		
		
		


WritePageEEPROM


InitI2C
		banksel	TRISC
		bcf		TRISC, 4
		bcf		TRISC, 5
		banksel	PORTC
		bsf		PORTC, 3
		bsf		PORTC, 4
		
		banksel	SSPSTAT
		movlw	b'00000000'
		movwf	SSPSTAT
		movlw	.4			; 400KHz
		movwf	SSPADD
		movlw	b'00100000'	; bit 5 osäker
		movwf	SSPCON2
		banksel	SSPCON
		movlw	b'00101000'
		movwf	SSPCON		; I2C...
		return

		end

[/code]
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Nedanstående fungerar på en 16F???. Det är min specialassembler, men strukturen skall väl framgå.

Felet jag gjorde till att börja med var att master skall sända NAK och inte ACK som kvittens på sista mottagna byte som en signal att slave skall sluta sända.


Kod: Markera allt


******	I2C ROUTINES
*
DOI2C
.SETUP	SMB PORTC,2


	LOD A,#$28		SETUP FOR I2C
	LOD SSPCON,A
	SEF BSELA
	LOD A,#$3F
	LOD SSPADD,A
	LOD A,#$80
	LOD SSPSTA,A
	CLF BSELA
	RTS

.START	CLF SSPIF		CLEAR INTERRUPT FLAG
	SEF BSELA		BANK1
	SEF SEN 		SEND START BIT
	CLF BSELA		BANK0
	SFS SSPIF		WAIT FOR COMPLETION
	JMP @-2
	RTS

.RSTART CLF SSPIF		CLEAR INTERRUPT FLAG
	SEF BSELA		BANK1
	SEF RSEN		SEND REPEATED START BIT
	CLF BSELA		BANK0
	SFS SSPIF		WAIT FOR COMPLETION
	JMP @-2
	RTS

.STOP	CLF SSPIF		CLEAR INTERRUPT FLAG
	SEF BSELA		BANK1
	SEF PEN 		SEND STOP BIT
	CLF BSELA		BANK0
	SFS SSPIF		WAIT FOR COMPLETION
	JMP @-2
	RTS

.RX	CLF SSPIF		CLEAR INTERRUPT FLAG
	SEF BSELA		BANK1
	SEF RCEN		RECEIVE ONE BYTE
	CLF BSELA		BANK0
	SFS SSPIF		WAIT FOR COMPLETION
	JMP @-2
	LOD A,SSPBUF		GET RECEIVED BYTE
	RTS

.TX	CLF SSPIF		CLEAR INTERRUPT FLAG
	LOD SSPBUF,A		SEND BYTE
	SFS SSPIF		WAIT FOR COMPLETION
	JMP @-2
	RTS

.ACK	CLF SSPIF		CLEAR INTERRUPT FLAG
	SEF BSELA		BANK1
	CLF ACKDT		SET ACK
	SEF ACKEN		SEND ACK
	CLF BSELA		BANK0
	SFS SSPIF		WAIT FOR COMPLETION
	JMP @-2
	RTS

.NACK	CLF SSPIF		CLEAR INTERRUPT FLAG
	SEF BSELA		BANK1
	SEF ACKDT		SET NACK
	SEF ACKEN		SEND NACK
	CLF BSELA		BANK0
	SFS SSPIF		WAIT FOR COMPLETION
	JMP @-2
	RTS


. .
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Missade att få med koden som använder i2c-rutinerna, den är tämligen viktig för att få med hela hanteringen.

Den är för att läsa och skriva till en realtidsklocka. Den stökiga koden för att skriva är för att biten som signalerar trasigt innehåll (förhoppningsvis) skall fungera även om strömmen bryts just under skrivning.


Kod: Markera allt


******  READ TIME FROM RTC CHIP
*
RTCRD	JSR DOI2C.SETUP 	PREPARE FOR I2C
	JSR DOI2C.START 	SEND START BIT
	LOD A,#$A2+0		GET RTC ADDRESS, SET UP FOR WRITE
	JSR DOI2C.TX		SEND IT
	LOD A,#2		SET TO READ FROM REG# 2, SECONDS
	JSR DOI2C.TX		SEND IT

	JSR DOI2C.RSTART	SEND REPEATED START BIT

	LOD A,#$A2+1		GET RTC ADDRESS, SET UP FOR READ
	JSR DOI2C.TX		SEND IT

	JSR DOI2C.RX		RECEIVE SECONDS AND VALIDITY FLAG
	LOD PAD0,A		SAVE VALUE
	SBR PAD0,7		IS TIME IN RTC VALID?
	JMP .BADTIM		NO
	*			YES-PROCEED WITH READ AND SET
	JSR DOI2C.ACK		SEND ACK
	AND A,#$7F
	JSR BCDBIN		CONV. TO BINARY
	LOD CLOCK.SECOND,A	SET SECONDS
	JSR DOI2C.RX		RECEIVE MINUTES
	JSR DOI2C.ACK		SEND ACK
	AND A,#$7F
	JSR BCDBIN		CONV. TO BINARY
	LOD CLOCK.MINUTE,A	SET MINUTES FROM RTC
	JSR DOI2C.RX		RECEIVE HOURS
	JSR DOI2C.NACK		SEND NACK AS END-OF-DATA MARKER
	AND A,#$3F
	JSR BCDBIN		CONV. TO BINARY
	LOD CLOCK.HOUR,A	SET HOURS FROM RTC

	JSR DOI2C.STOP		SEND STOP BIT

	SEF FLAG.TIMRUN 	LET CLOCK START RUNNING

	RTS			DONE

.BADTIM *			TIME READING IS BAD
	*			CLOCK IS NOT RUNNING AS FLAG.TIMRUN
	*			CLEARS AT RESET AND HAS NOT BEEN SET
	JSR DOI2C.NACK		SEND NACK AS END-OF-DATA MARKER
	JSR DOI2C.STOP		SEND STOP BIT
	RTS			DONE


******	WRITE TIME TO RTC CHIP
*
*	WHEN RUN THERE IS NO RISK FOR CLOCK ROLLOVER AND NO NEED TO HOLD IT
*
RTCSET	JSR DOI2C.SETUP 	PREPARE FOR I2C
	JSR DOI2C.START 	SEND START BIT

	LOD A,#$A2+0		GET RTC ADDRESS, SET UP FOR WRITE
	JSR DOI2C.TX		SEND IT
	LOD A,#2		SET TO WRITE TO REG# 2, SECONDS & VALIDITY
	JSR DOI2C.TX		SEND IT

	LOD A,#$80		REG 2, SECONDS, ZERO IT TEMPORARY WITH..
	*			..VALIDITY FLAG AT ERROR
	JSR DOI2C.TX

	JSR DOI2C.RSTART	SEND REPEATED START BIT

	LOD A,#$A2+0		GET RTC ADDRESS, SET UP FOR WRITE
	JSR DOI2C.TX		SEND IT
	LOD A,#0		SET TO WRITE TO REG# 0
	JSR DOI2C.TX		SEND IT

	LOD A,#$20		REG 0, CONFIG1, SET TO STOP RTC CLOCK
	JSR DOI2C.TX

	LOD A,#0		REG 1, CONFIG 2, CLEAR IT
	JSR DOI2C.TX

	LOD A,#$80		REG 2, SECONDS, ZERO IT TEMPORARY WITH..
	*			..VALIDITY FLAG AT ERROR
	JSR DOI2C.TX

	LOD A,CLOCK.MINUTE	REG 3, MINUTES, SET IT
	JSR BINBCD		CONV. TO BCD
	LOD A,BCDACC		GET BCD VALUE
	JSR DOI2C.TX		SEND IT

	LOD A,CLOCK.HOUR	REG 4, HOURS, SET IT
	JSR BINBCD		CONV. TO BCD
	LOD A,BCDACC		GET BCD VALUE
	JSR DOI2C.TX		SEND IT

	JSR DOI2C.RSTART	SEND REPEATED START BIT

	LOD A,#$A2+0		GET RTC ADDRESS, SET UP FOR WRITE
	JSR DOI2C.TX		SEND IT
	LOD A,#2		SET TO WRITE TO REG# 2
	JSR DOI2C.TX		SEND IT

	LOD A,CLOCK.SECOND	REG 2, SECONDS, SET IT
	JSR BINBCD		CONV.TO BCD
	LOD A,BCDACC		GET BCD VALUE
	LOD PAD0,A		SAVE IT
	ORR A,#$80		FLAG NOT VALID
	JSR DOI2C.TX		SEND IT

	JSR DOI2C.RSTART	SEND REPEATED START BIT

	LOD A,#$A2+0		GET RTC ADDRESS, SET UP FOR WRITE
	JSR DOI2C.TX		SEND IT
	LOD A,#0		SET TO WRITE TO REG# 0
	JSR DOI2C.TX		SEND IT

	LOD A,#0		REG 0, CONFIG1, CLEAR IT, STARTS CLOCK
	JSR DOI2C.TX

	LOD A,#0		REG 1, CONFIG 2, CLEAR IT
	JSR DOI2C.TX

	LOD A,PAD0		SET SECONDS AGAIN & FLAG TIME IS VALID
	JSR DOI2C.TX

	JSR DOI2C.STOP		SEND STOP BIT
	RTS			DONE



marcusg
Inlägg: 189
Blev medlem: 7 juli 2007, 21:27:51
Ort: Mariehamn (FI)

Inlägg av marcusg »

Kollade igenom min kod mot den du visade, och efter lite mer debugging så har jag äntligen fått det att i.a.f. delvis fungera!

Kan läsa och skriva enstaka byte, men jag har fortfarande problem med page write (64 byte i gången). Endast den första byten skrivs till minnet, de resterande 63 verkar bli helt oförändrade. Jobbar vidare på det under kvällen, ska se om jag lyckas lösa det...

Edit: Kan ju berätta att jag använder ett program vid namn Yat3 för att kommunicera med picen. Planen är att välja funktion med ett tecken (w=write, v=write page), sedan 2 byte för adress. Vid Page Write finns det sedan en funktion i programmet för att skicka en binär fil.

Blev ett litet projekt det här...
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg av rehnmaak »

>>> någon som känner till färdig mjukvara för det

ponyprog programmerar det mesta...
marcusg
Inlägg: 189
Blev medlem: 7 juli 2007, 21:27:51
Ort: Mariehamn (FI)

Inlägg av marcusg »

Har ju kommit igång med ett eget program nu, så jag tar nog och skriver klart det. Men jag och lägger till ett bokmärke på de där länken, man vet aldrig när den kan komma till nytta!

Har lyckats få Page Write att fungera nu också. Problemet var att jag på ett ställe lyckats kasta om MSB och LSB i adresseringen. Stuck...
Skriv svar