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.

Hoe staan het Data Code Protection bit geprogrammeerd? (zie pagina 94 v.d. datasheet)

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.

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

Zal dat vanavond eens proberen.

Heb je ook eventueel de lees routine???

wordt vervolgt

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.