Problem med att läsa programminne i en pic16F

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Problem med att läsa programminne i en pic16F

Inlägg av dangraf »

Hej!
jag sitter och försöker knopa ihop en rutin som skall kunna läsa programminnnet på en given adress i en pic16f88.

jag har läst manualen och lyckats skriva(kopiera) ihop en kodsnutt, men det verkar inte fungerar riktigt. När jag simulerar min kod i MPlab så verkar inte värdena till registerna EEADRH och EEADR bli satta till de inställda värdena. De förblir 0.

Jag har antagligen glömt att göra någon inställning, men förstår inte riktigt var.

Enligt exemplet i databladet så står det ibland t.ex "BANKSEL EEADRH" vilket jag kommenterat bort eftersom det ger kompileringsfel. Vad gör den raden egentligen, eller är det bara en förklaring till vad koden undertill gör? vad är BANKSEL för något??


Kompilatorn jag kör med heter bKnudsens c5 (eller nått åt det hållet).
uns16 = unsigned 16bit vaiabel


Kod: Markera allt

uns16 wReadFlash(char ADDRH,char ADDRL)
{
	uns16 Serial;
	char SerLo,SerHi;
	#asm

                               ;BANKSEL EEADRH ; Select Bank of EEADRH
		MOVF 	ADDRH, W 			;
		MOVWF EEADRH 				

		MOVF ADDRL, W ;
		MOVWF EEADR ; LS Byte of Program Address to read

                               ; BANKSEL EECON1
		BSF EECON1, EEPGD ; Point to PROGRAM memory

		BSF EECON1, RD ; EE Read

		NOP ; Any instructions
 		NOP ; program memory is

                                ;BANKSEL EEDATA
		MOVF EEDATA, W ; DATAL = EEDATA
		MOVWF SerLo ;
		MOVF EEDATH, W ; DATAH = EEDATH
		MOVWF SerHi ;
	#endasm
	
		Serial.low8 = SerLo;
		Serial.high8 = SerHi;
		return Serial;
}
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

banksel väljer vilken bank som programmet ska pilla i registre i, att du har kommenterat bort dom är anledningen till att programmet inte fungera.

Att instruktionen ger fel kan mycket väl vara för att antingen 'BANKSEL'-macrot inte är definierat eller (mer troligt) att du har utelämnat definitionen av 'EEADRH' och 'EEDATA'
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Jag har inte definierat något BANKSEL macro. Hur gör jag det? vad skall makrot göra?

mina definitioner

Kod: Markera allt

#pragma char EEDATA  @ 0x10C
#pragma char EEADR   @ 0x10D
#pragma char EEDATH  @ 0x10E
#pragma char EEADRH  @ 0x10F
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Enligt exemplet i databladet så står det ibland t.ex "BANKSEL EEADRH" vilket jag kommenterat bort eftersom det ger kompileringsfel.

Jahaja... Och *VILKET* fel som uppstår ??
Utan det är upplysningen ovan i princip helt värdelös...

> #pragma char EEDATA @ 0x10C
> #pragma char EEADR @ 0x10D
> #pragma char EEDATH @ 0x10E
> #pragma char EEADRH @ 0x10F

Det skulle förvåna mycket om du verkligen måste gör så !
Nog ser väll verktygen till att definiera dessa symboler ?
(vad är det du kör, förresten ? "bKnudsens c5" ger ingen träff i Google...)

> Jag har inte definierat något BANKSEL macro. Hur gör jag det? vad skall makrot göra?

BANKSEL är ett macro i MPASM, kolla att din C kompilator stöder det i inline-asm. Eller vilken annan metod de har för bank-hantering.
Den enda BANKSEL gör är att lägga till kod som sätter bitarna för bank-val. Du kan naturligtsvis (om inte din miljö stöder BANKSEL) själv manipulera bank-bitarna med BSF/BCF, men det blir lite större risk att det blir fel...

Men varför inte helt enkelt kolla i manualen för MPASM ? Där finns BANKSEL (och allt annat kring MPASM) dokumenterat.

Sannolikt har ditt problem något med integreringen av inline-ASM i ditt C verktyg att göra...
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Att det har med min skitkompilator att göra tvivlar jag inte en sekund på.

adressen hemsidan för kompilatorn är: http://www.bknd.com/
Förstasidan i manualen:
CC5X
C Compiler for the
PICmicro Devices
Version 3.1
User's Manual
B Knudsen Data
Trondheim - Norway


Jag kompierade definitionerna ur headerfilen i själva verktyget, så det är inte jag som definierat upp adresserna till registerna.

jag hittar inget i BKND manualen om BANKSEL, inte ens att det inte stödjs.

Vart definieras makrot? kan man inte bara kopiera definitionen till kompilatorn jag använder? Jag har kollat lite i en bootloader .asm fil, o där andänds inget "BANKSEL" kommando. Det måste väl gå att komma runt det på nått enkelt sätt?


Eller finns det någon färdig rutin att ladda ner nånstans från?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Nu har det löst sig. ursäkta för att jag krånglade till det. Eftersom jag använder en C-kompilator, så skrev jag om koden till C, och VIPS så fungerade det!
ibland ser man inte skogen för alla träd :?

Kod: Markera allt

uns16 wReadFlash(char ADDRH,char ADDRL)
{
	uns16 Serial;

	EEADRH = ADDRH;
	EEADR = ADDRL;
	EEPGD = 1;
	RD = 1;
	nop();
	nop();
	Serial.low8 = EEDATA;
	Serial.high8 = EEDATH;

		return Serial;
}
Skriv svar