Sida 1 av 3

PIC16F688 Intern oscillator. Och: Hur löser man problem?

Postat: 24 maj 2010, 01:54:40
av JimmyAndersson
Kort sagt: Jag förstår tydligen inte databladet till PIC16F688.

Jag höll på med en PWM-styrning i assembler när jag märkte att lysdioderna blinkade synbart.
Avbröt det jag höll på med och gjorde ett litet testcase där jag togglade en pinne med en nop mellan varje "toggling" (hopplöst ord, jag vet) och mätte med oscilloskopet.

Det visade sig att klockan gick fem gånger för sakta. Dvs 1,6MHz istället för de förväntade 8MHz.

Jag testade i MikroBasic också (för att återanvända lite kod i ett annat sammanhang) och fick förstås samma resultat där.



Disablat: BOR, POR, BOD, WDT.

Fosc är satt till "INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN" enligt: Fosc:2:0 = 100


Fail-safe clock monitor är disabled.

IESO = 0 (Internal External Switchover mode is disabled)


OSCCON.6 = 1 '8MHz IRCF2
OSCCON.5 = 1 '8MHz IRCF1
OSCCON.4 = 1 '8MHz IRCF0
OSCCON.SCS = 1 'Internal oscillator for system clock


Jag har även provat sätta SCS till 0 och IESO till 1.



Jag har försökt hitta något som jag har missat, men Microchip är vanan trogen att skriva "See selection xx" med jämna mellanrum och så får man bläddra dit och läsa, sedan tillbaka igen och vidare till nästa "See selection xx"-sida, så efter ett tag är man vilse. Jag trodde att jag hade förstått, dvs:
Stäng av IESO. Välj prescaler med OSCCON4:6, sätt OSCCON.SCS = 1, men icke....


Det jag skulle behöva hjälp med är alltså att förstå hur jag sätter klockan till 8MHz.

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 02:31:26
av willmans
PIC, eller iallafall PIC16 serien, tar 4 klockcykler att utföra en instruktion, så det snabbaste du kan toggla en pinne om du kör med 8MHz är 2MHz,

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 10:13:40
av JimmyAndersson
Glömde skriva att även delay-loopar (räkneloopar) går fel.
Jag provade även att toggla en pinne med 0,5Hz men frekvensräknaren rapporterade 2,5Hz.

Upptäckte nu att det är när jag har PIE1.ADIE = 1 (AD-interrupt enabled) som allt tar 5 gånger så lång tid.
Interrupt-hanteringen för den ser ut såhär:

Kod: Markera allt

    if TestBit(PIR1,ADIF) = 1 then
       PIR1.ADIF = 0
       pot_lo = ADRESL
       pot_hi = ADRESH
       
       ADCON0.ADON = 1
       ADCON0.GO_DONE = 1
    end if

AD-klockan:

Kod: Markera allt

    ADCON1.ADCS2 = 0  'AD Conversion clock: Fosc/32 = 250kHz
    ADCON1.ADCS1 = 1  'AD Conversion clock: Fosc/32 = 250kHz
    ADCON1.ADCS0 = 0  'AD Conversion clock: Fosc/32 = 250kHz

Fascinerande att man kan fastna så totalt på något som borde vara så enkelt. :wall:

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 11:05:15
av sodjan
Av din beskrivning *låter det* som att du gör rätt.
Det går dock inte att veta, du kanske inte alls gör så som
du beskriver/tror i din faktiska kod, det kan jag inte kolla.

Att du skiver att det går just *5* gånger för sakta är lite
märkligt. 2, 4 eller 8 hade varit enklare att förklara.

Jag föreslår att du gör ett litet test-case som t.ex blinkar
en diod med en förväntat frekvens i assembler så får vi se.
Då går det enkelt att ladda den i MPSIM och testa...

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 13:11:12
av sugarman64
JimmyAndersson skrev:Jag provade även att toggla en pinne med 0,5Hz men frekvensräknaren rapporterade 2,5Hz.
Skrivfel? Är inte 2,5Hz 5ggr snabbare än 0,5Hz?

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 13:18:00
av sodjan
Det *kan* vara så att det ska vara "sec" istället för "Hz"... :-)

Aja, skit samma igentligen. Det hela är ganska ointressant innan Jimmy
presterar ett test-case som uppvisare de beskriva fenomenen. Innan
dess blir det bara lite onödiga spekulationer och gissningar. Chansen
är dessutom ganska stor att Jimmy hittar "felet" själv när test-caset
görs i ordning, det brukar ofta vara så... :-)

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 14:08:56
av jojje
Jag kör microBasic Pro, och där kan man tex ange Delay_ms(1000). Alltså att allt ska pausa 1 sekund.
Det funkar bra om man sätter den interna klockan till 8MHz. Ändrar man, så ändras även delay-tiden.
Jag har ingen extern kristall.

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 15:58:30
av JimmyAndersson
Jag bytte tillbaka till assembler igen för att göra ett litet test-case, men istället fick jag mer fel:

Kod: Markera allt

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "D:\Program\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F688 "ledbelysning.asm" /l"ledbelysning.lst" /e"ledbelysning.err" /o"ledbelysning.o" /c-
Error[111]   D:\PROGRAM\MICROCHIP\MPASM SUITE\P16F688.INC 182 : Missing symbol
Error[176]   G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 18 : CONFIG Directive Error:  (processor "16F688" is invalid for CONFIG directive)
Error[176]   G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 19 : CONFIG Directive Error:  (processor "16F688" is invalid for CONFIG directive)
Error[176]   G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 20 : CONFIG Directive Error:  (processor "16F688" is invalid for CONFIG directive)
Error[113]   G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 60 : Symbol not previously defined (RAPU)
Message[305] G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 198 : Using default destination of 1 (file).
Message[305] G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 200 : Using default destination of 1 (file).
Warning[211] G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 206 : Extraneous arguments on the line.
Halting build on first failure as requested.
BUILD FAILED: Mon May 24 15:30:30 2010
Jag fattar inte alls vad det beror på. Ja ja, jag förstår engelska, så jag förstår vad som *står* men inte vad det innebär eller hur man löser det.



Början på koden:

Kod: Markera allt

	list		p=16F688
	include		"p16f688.inc"
;****************************************************

	CONFIG OSC = INTRC_OSC_NOCLKOUT
	CONFIG FCMEM = OFF, IESO = OFF, BOD = OFF
	CONFIG MCLRE = ON, PWRTE = ON, WDT = OFF

	errorlevel	-302

;****************************************************
Det är troligen de två översta raderna i koden som är den stora orsaken till dessa nya fel.
Först skrev jag:
Processor PICxxFxxxx
#include <pxxfxxxx.inc>

men det blev ingen skillnad. Då letade jag upp den här tråden (eftersom jag mindes att jag haft problem med det där tidigare), men ändå ingen skillnad.


:wall:


Jag stöter *alltid* på problem när jag försöker programmera PIC-kretsar.
Hade jag inte varit så jäkla envis så hade jag slutat för länge sedan.
Mina PIC-baserade projekt kan lätt ta en månad, effektiv tid, och då står framstegen för en halvtimma av tiden.

Jag lusläser databladen i timmar effektiv tid, tar promenader, läser igen, försöker igen och igen och igen,
gör något annat ett par dagar, provar igen, men icke.

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 16:26:24
av jojje
Du har inte provat FlowCode?

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 16:44:17
av tecno
Jisses, va fasen ska man ha för skärmupplösning för att se den hemsidan jojje?

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 16:54:50
av jojje
Normal?
Vill du inte investera i nya glasögon, har du ju alltid zoomen nere till höger. :vissla:

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 16:55:53
av sodjan
Jag behöver fortfarande ett *komplett* exempel som visar de fel du får !
De där "inledande raderna" kan jag inte ladda i MPLAB.

Är du helt säker på att du kan skriva CONFIG parametrarna så där för en PIC16 ?
Se "config" samt "__config" i MPASM manualen (eller i hjälp-filen).

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 16:57:03
av tecno
:oops: vem fan har rattat om zoomen på min maskin ? jävla svart alfer :evil:

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 17:11:32
av JimmyAndersson
Sodjan:
Jag har inget komplett exempel än. Pga felen i förra inlägget (och i detta, mer om det nedan) så kan jag varken göra klart koden eller testa den.

Men här är den iallafall:


Kod: Markera allt

;****************************************************
	list		p=PIC16F688
	include		"p16f688.inc"
;****************************************************
;
;	PIC16F688. Intern oscillator på 8MHz.
;
;	LED-belysning till etshyllan
;
;	Lysdioder 1 - 6 : RC0 - RC5.
;	Knapp (JP1) : RA4. (pin 3).
;	JP2 : RA5. (pin 2.) - Satt som utgång eftersom den inte behövs än så länge..
;	Pot: RA2. (pin 11.)
;
;
;****************************************************

	__CONFIG _INTRC_OSC_NOCLKOUT & _FCMEN_OFF & _IESO_OFF & _BOD_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF

	errorlevel	-302

;****************************************************
;	Definiera diverse namn...

	#define		KNAPP		PORTA, 4

;****************************************************
knapp_vars		udata_acs
knapplage		res 1	; Vilken knapp som tryckts ner

; det blir mer här senare..

;****************************************************

Boot		CODE	h'0000'
	goto	start

;****************************************************

Int_vect	CODE	h'0008'
;	retfie
	goto	isr_rutin

;****************************************************
; MACRO

; kommer senare...

;****************************************************

Main	CODE

Start

;Generell setup


	bsf		OPTION_REG,	RAPU	;PORT A pull-ups disabled
	bsf		OPTION_REG,	INTEDG	;Interrupt on rising edge of RA2/INT
	bcf		OPTION_REG,	T0CS	;TMR0 internal clock
    bcf		WDTCON, SWDTEN		;WDT turned off


;	Interrupt
    bsf		INTCON, GIE		;Global interrupt enable bit  <--
    bsf		INTCON, PEIE	;Enable unmasked peripheral interrupts <--
    bcf		INTCON, T0IE	;Disable the Timer0 interrupt
    bcf		INTCON, INTE	;Disable the RA2/INT external interrupt  <--
    bsf		INTCON, RAIE	;Enable the PORTA change interrupt <--
    bcf		INTCON, T0IF	;Timer0 did not overflow
    bcf		INTCON, INTF	;RA2/INT external interrupt did not occur
    bcf		INTCON, RAIF	;None of the PORTA-pins have changed state <--<<
    
	movlw	b'00010000'		;RA4 interrupt on change. <--
    movwf	IOCA
    
    bcf		PIE1, EEIE		;Disable the EE write complete interrupt
    bsf		PIE1, ADIE		;Enable the ADC-interrupt <--
    bcf		PIE1, RCIE		;Disable the EUSART receive interrupt
    bcf		PIE1, C2IE		;Disable the comparator C2 interrupt
    bcf		PIE1, C1IE		;Disable the comparator C1 interrupt
    bcf		PIE1, OSFIE		;Disable the oscillator fail interrupt
    bcf		PIE1, TXIE		;Disable the EUSART transmit interrupt
    bcf		PIE1,	TMR1IE	;Disable the Timer1 overflow interrupt

    clrf	PIR1			;Cleara alla interrupt
    bcf		PIR1, ADIF		;AD interrupt clear <--


;	Klocka
	bsf		OSCCON, IRCF2	;8MHz
	bsf		OSCCON, IRCF1	;8MHz
	bsf		OSCCON, IRCF0	;8MHz
	bcf		OSCCON, SCS		;Fosc = systemklockan


;	I/O
	movlw	b'00010100'		;Allt till utgångar, bortsett från knappen och poten.
	movwf	TRISA
	clrf	TRISC			;Alla till utgångar, för lysdioderna.

	clrf	PORTA			;Tomt
	movlw	h'FF'			;Tomt (OBS: Inverterat för lysdioderna).	
	movwf	PORTC
    
    clrf	WPUA			;Inga pull-ups
    

;	Timers, comparators mm
	bcf		T1CON, TMR1ON	;Timer1 avstängd
	
    bsf		CMCON0, CM2		;Comparators avstängda
    bsf		CMCON0, CM1		;Comparators avstängda
    bsf		CMCON0, CM0		;Comparators avstängda
    bcf		VRCON, VREN		;CVref powered down

;	ADC
	movlw	b'00000100'		;AN2 (pin 11) analog. Resten digitala
	movwf	ANSEL
    
    bsf		ADCON0, ADFM	;Högerjusterad AD
    bcf		ADCON0, VCFG	;Vdd som referens
    bcf		ADCON0, CHS2	;Channel: AN2 (pin 11)
    bsf		ADCON0, CHS1	;Channel: AN2 (pin 11)
    bcf		ADCON0, CHS0	;Channel: AN2 (pin 11)
    bsf		ADCON0, ADON	;ADC enabled <--
    bsf		ADCON0, GO_DONE	;AD-conversion in progress <--    OBS! Måste vara *efter* ADON !

    bcf		ADCON1, ADCS2	;AD Conversion clock: Fosc/32 = 250kHz
    bsf		ADCON1, ADCS1	;AD Conversion clock: Fosc/32 = 250kHz
    bcf		ADCON1, ADCS0	;AD Conversion clock: Fosc/32 = 250kHz


;	USART
    bcf		TXSTA, TXEN		;EUSART transmit disabled
    clrf	RCSTA			;EUSART port disabled
    bcf		BAUDCTL,ABDEN	;Auto-baud detect disabled
    
   






;****************************************************
;****************************************************
;****************************************************


loop



	goto loop				;Om och om igen...
;
;****************************************************
;****************************************************


; Interrupt

isr_vars		UDATA_ACS
flagga_knapp	RES 1
pot_lo			RES 1
pot_hi			RES 1
	

isr_rutin		CODE

isr_rutin
	;Knapp-interrupt.
	btfsc		INTCON,	RAIF		;PORTA change interrupt? Isåfall körs nästa rad.
	btfss		KNAPP				;Knappen som gett interrupt? Isåfall körs inte nästa rad.
	goto		slut				;Hoppa till slutet.
	bsf			flagga_knapp, 0		;Sätt flaggan.
	bcf			INTCON, RAIF		;Clerara PORTA change interrupt.
	bsf			INTCON, RAIE

	;Pot-interrupt.
	btfss		PIR1, ADIF			;AD-interrupt? Isåfall körs inte nästa rad.
	goto		slut				;Hoppa till slutet.
	bcf			PIR1, ADIF			;Cleara AD-interruptet.
	movf		ADRESL				;Innehållet i ADRESL till W.
	movwf		pot_lo				;..och vidare till pot_lo
	movf		ADRESH				;Innehållet i ADRESH till W.
	movwf		pot_hi				;..och vidare till pot_hi
	bsf			ADCON0, ADON		;Starta AD igen
	bsf			ADCON0, GO_DONE		;Ny avläsning

slut
	retfie		fast

;****************************************************








;****************************************************
;Delay-rutiner

DLY_VARS	UDATA_ACS
d1			RES 1
d2			RES 1
d3			RES 1

DLY_CODE	CODE


;Delay 1s  (1,00056s)
Delay_1s
	movlw	0x5A
	movwf	d1
	movlw	0xCD
	movwf	d2
	movlw	0x16
	movwf	d3
Delay_1s_0
	decfsz	d1, f
	goto	Delay_1s_1
	decfsz	d2, f
Delay_1s_1
	goto	Delay_1s_2
	decfsz	d3, f
Delay_1s_2
	goto	Delay_1s_0
	nop
	return


;Delay 5ms. (5,0003ms)
Delay_5ms
	movlw	0x07
	movwf	d1
	movlw	0x28
	movwf	d2
Delay_5ms_0
	decfsz	d1, f
	goto	Delay_5ms_1
	decfsz	d2, f
Delay_5ms_1
	goto	Delay_5ms_0
	nop
	nop
	return


;Delay 1us.
Delay_1us
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	return

;****************************************************

	end
(Tabbarna går sönder lite när man klistrar in i forumet...)




På min maskin genererar den dessa felmeddelanden:

Kod: Markera allt

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "D:\Program\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F688 "ledbelysning.asm" /l"ledbelysning.lst" /e"ledbelysning.err" /o"ledbelysning.o" /c-
Error[111]   D:\PROGRAM\MICROCHIP\MPASM SUITE\P16F688.INC 182 : Missing symbol
Error[113]   G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 18 : Symbol not previously defined (_FCMEM_OFF)
Error[113]   G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 58 : Symbol not previously defined (RAPU)
Message[305] G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 196 : Using default destination of 1 (file).
Message[305] G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 198 : Using default destination of 1 (file).
Warning[211] G:\PIC\ASM\PIC16F688\LEDBELYSNING\LEDBELYSNING.ASM 204 : Extraneous arguments on the line.
Halting build on first failure as requested.
BUILD FAILED: Mon May 24 17:00:07 2010
"_FCMEM_OFF" är kopierat från P16F688.INC och själva strukturen är kopierad från exempelkod jag fått tidigare.
(Har inte hittat något om config i MPASM-manualen.)


Jojje: Det har jag inte testat. Ska göra det lite senare. :)
edit: Hm.. står inget pris. Återförsäljaren verkar inte sälja till privatpersoner.

Re: PIC16F688 Intern oscillator 8MHz

Postat: 24 maj 2010, 17:25:21
av sodjan
Jag fattar inte var FCMEM kommer från. Det finns inte med i din kod.
Och jag får inte heller något sådant fel när jag kör din kod.

Jag tror inte att de felmeddelanden som du visar kommer från den kod du visar !!
Det är en väldig fördel om felmeddelandena kommer från körning av *SAMMA*
kod som du postar...

> Symbol not previously defined (RAPU)

MPASM har helt rätt. Den finns inte. Bara att rätta...

> retfie fast

"fast" inte rellevant för en PIC16.

> Int_vect CODE h'0008'

Stämmer inte för en PIC16, ska vara h'0004'.

> isr_vars UDATA_ACS

Fel för en PIC16.

Jag bytte 0008 mot 0004 och ändrade UDATA_ACS till UDATA_SHR så byggde det "rent"...