Ik heb eens een vraagje.
Ik wilde ipv de PIC16F84A de PIC16F628A gebruiken.
Nu heb ik het volgende probleem.
Het lezen en schrijven naar EEPROM gaat niet juist, terijl het eerst met de PIC16F84 wel juist werkte.
Het volgende programma gebruikt ik: SourceBoost met C2C compiler.
Als volgt de broncode:
void EEPROM_WRITE(char adresa,char data) // write to EEPROM
{
EEADR = adresa;
EEDATA = data;
set_bit( EECON1, WREN );
EECON2 = 0x55;
EECON2 = 0xAA;
set_bit( EECON1, WR ); // start writing
while(EECON1&2); // cycle until WR reg. EECON1 = 1 (writing..)
clear_bit( EECON1, WREN );
}
char EEPROM_READ(char adresa) // read from EEPROM
{
EEADR = adresa;
set_bit(EECON1, RD); // start reading
return EEDATA;
}
In mijn main programma roept ik de sub's als volgt aan:
VALUE= (EEPROM_READ(0x00)* 10000);
VALUE = VALUE + (EEPROM_READ(0x01)* 1000);
VALUE = VALUE + (EEPROM_READ(0x02)* 100);
VALUE = VALUE + (EEPROM_READ(0x03)* 10);
VALUE = VALUE + EEPROM_READ(0x04);
Indien ik nu met MPLAB & ICD2 als programmer op desbetreffende plaatsen een waarde zet deze niet uitgelezen wordt..
Heeft iemand hier reeds eerder meegemaakt en hoe hebt je dat opgelost.
ik hoor het wel.
Bij de 16F628 zitten de EE registers in een andere memorybank vergeleken met de 16F84. Dit is één van de verschillen tussen deze twee types. Controleer de "migration guide" voor alle verschillen.
Fuzzbass
Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com
Hoi,
Heb als conf. word op adres 2007 staan $3F29
Maar helaas heb ik het nog niet werkende.
Heb de lees routine aangepast naar wat in de datasheets van de 628A staat.
asm
{
BSF STATUS, RP0 ; Bank 1
MOVLW param00_EEPROM_READ
MOVWF EEADR ; Address to read
BSF EECON1, RD ; EE Read
MOVF EEDATA, W ; W = EEDATA
BCF STATUS, RP0 ; Bank 0
}
}
En met de ICD2 zelf even bepaalde waardes in de EEPROM gezet.
Helaas leest hij deze nog niet goed.
Wordt vervolgt.
Fuzzbass
Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com
Ik gebruik deze routine om in de EEPROM te schrijven van de F628, deze is ruimschoots getest.
writeee bsf RP0 ;bank 1
movwf EEDATA ;W to EEPROM data
bsf WREN ;enable write
bcf GIE ;disable interrupt
movlf H'55',EECON2 ;key sequence
movlf H'AA',EECON2
bsf WR ;initiate write
bsf GIE ;reenable interrupts
bcf RP0 ;bank 0
waitee btfss EEIF ;poll EEPROM write ready bit
goto waitee
bcf EEIF
bsf RP0 ;bank 1
bcf WREN ;disable write
incf EEADR,F
bcf RP0 ;bank 0
return
Fuzzbass
Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com
Daar kun je echt niets aan verkeerd doen, lijkt me.
readee bsf RP0 ;bank 1
movwf EEADR
bsf RD ;EEPROM read
movf EEDATA,W ;retrieve data
incf EEADR,F ;next eeprom location
bcf RP0 ;bank 0
return
Ben eens weer bezig geweest.
Heb nu dat hij de eeprom goed leest.
Dit is de code zoals ik het nu heb.
char EEPROM_READ(char adresa) // read from EEPROM
{
asm
{
BSF STATUS, RP0 ; Bank 1
MOVWF param00_EEPROM_READ
MOVWF EEADR ; Address to read
BSF EECON1,RD ; EE Read
MOVF EEDATA, W ; W = EEDATA
BCF STATUS, RP0 ; Bank 0
}
}
gelukiig is dit nu werkende.
Heb reeds het schrijven naar eeprom nog niet werkende.
Denk dat ik maar eens een mailtje ga schrijven naar de firma die deze c-ompiler heeft gemaakt. misschien dat men daarook eens naar kan kijken.