Hallo,

Ik ben bezig met het programmeren van een PIC18F4550.
Echter werk de postscaler niet.
Er zit op de 12MHz kristal aangesloten op OSC2 en OSC2 en op uitgang RE2 is een scoop aangesloten.

Ik heb even een stukje test code geschreven:


//oscillator test PIC18LF4550 toggle pin RE2.
#include "INT18XXX.H"

#pragma bit RE2 @ PORTE.2	

#pragma config[0] = 0b.0000.0000		//Primary oscillator used directly for system clock (no postscaler)
#pragma config[1] = 0b.0000.1100		//HS oscillator (HS)
#pragma config[2] = 0b.0000.0000		//USB voltage disabled, brown out disable, powerup timer eneable
#pragma config[3] = 0b.0000.0000		//watchdog disable

void main(void)
{
	clearRAM();
	IDLEN=1;		//1 = Device enters Idle mode on SLEEP instruction 0 = Device enters Sleep mode on SLEEP instruction
	SCS1=0;			//SCS1:SCS0: System Clock Select bits 1x = Internal oscillator 01 = Timer1 oscillator 00 = Primary oscillator
	SCS0=0;

	PORTE = 	0b.0000.0000; 		//set all ports to 0
	TRISE =  	0b.1111.1011;		//tris settings: make RE2 output 

	while(1)
	{

		RE2=1;
		RE2=0;
		RE2=1;
		RE2=0;
		RE2=1;
		RE2=0;
		RE2=1;
		RE2=0;
		RE2=1;
		RE2=0;
		RE2=1;
		RE2=0;
	}
}

Op uitgang RE2 meet ik zoals verwacht met de scoop een hoog/laag tijd van 333nano Seconden.

Echter als ik de postscaler verander:


#pragma config[0] = 0b.0001.1000		//Primary oscillator divided by 4 to derive system clock

Blijft de hoog/laat tijd hetzelfde.
Ik verwacht een hoog/laag tijd van 1,33milli seconden.

Wellicht doe ik iets verkeerd, maar ik kan het zo niet vinden.
iemand een idee?

gr,

Config registers kun je alleen met table read/write TBLWT en de table pointer benaderen. sectie 25.1 datasheet
Dit werkt niet word or byte wise ,maar gaat in blocken van 16 words of 32 bytes. lees sectie 6.5

"The user will note that address 300000h is beyond the
user program memory space. In fact, it belongs to the
configuration memory space (300000h-3FFFFFh), which
can only be accessed using table reads and table writes.
"

btw. Een bittoggle kan eenvoudiger met: BTG LATE,2

Dus.. Tblptr zetten, 16 words uitlezen, de juiste bits op de goede divider zetten en terugschrijven.
Met inachtneming van
EECON1 schrijven/lezen
EEPGD > CFGS bit 1
WREN
Disablen van Interrupts
schrijf 55h EECON2
" AAh EECON2
schrijf de config byte
en dat 32 keer,..TBLPTR is auto_increment dus die hoef je niet te verhogen.

enfin in sectie 6.5.1 staat het haarfijn uitgelegd hoe je deze "versnellingsbak" maakt.

'#pragma xxx' zijn preprocessor/compiler settings. Ik neem aan dat de compiler de config settings in de hexfile verwerkt. Dus zou zo moeten werken.
Weet je zeker dat de compiler bytes verwacht en geen words? (config1L en config1H zijn samen een word)

Hallo,

Bedankt voor het meedenken.

Volgens mij gaat

#pragma config[0] = 0b.0001.1000"

etc. wel goed, gezien er in de ASM file staat:


	__config 0x300000, 0x18
	__config 0x300001, 0xC
	__config 0x300002, 0x0
	__config 0x300003, 0x0

Of zie ik dit verkeerd?

Ik gebruik overgins knudsen c compiler

gr,