Programmera externt EEPROM (Tillsvidare löst...)
Programmera externt EEPROM (Tillsvidare löst...)
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...
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.
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:
Och så själva I2C-koden...
[/code]
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...
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
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.
. .
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
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.
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
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...
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...
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...
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...