Sida 1 av 1
					
				Intern Osc-inställning 16F88 (Löst)
				Postat: 21 februari 2009, 12:24:38
				av Tjille
				Jag har en kod som fungerar bra i en 16F628A men har nu för avsikt att lyfta över den till 16F88. Detta är gjort och koden fungerar men jag märker en klar prestandaförsämring som yttar sig i att presentationen av text på LCD rullar fram i stället för att "poppa upp". Jag antar att jag har konfigurerat upp den interna osc felaktigt och undrar om någon kan se vad jag skall göra på annat sätt eller missat.
;Program Configuration Register 1
__CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
;Program Configuration Register 2
__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF
INI:	BSF	STATUS,RP0	;select bank 1
	MOVLW	B'00000111'
	MOVWF	CMCON 		;Disable Comparator modules
	CLRF	INTCON		;Disable interupts
	MOVLW	B'0110000'	;4MHz internal osc
	MOVWF	OSCCON
	MOVLW	B'00000000'	;Port digital
	MOVWF	ANSEL
	MOVLW	B'00111111'	;RA<7:6> as output RA<5:0> as input 
	MOVWF	TRISA		;
	MOVLW	B'00000000'	;RB<7:0> as output
	MOVWF	TRISB		;
	BCF	STATUS,RP0	;select bank 0
	CLRW			;clear w-register
	CLRF	PORTA		;clear port a
	CLRF	PORTB		;clear port b
			 
			
					
				Re: Intern Osc-inställning 16F88
				Postat: 21 februari 2009, 13:14:21
				av victor_passe
				...
MOVLW	B'01110000'	;8MHz internal osc
...
Då går den snabbare, men det kanske sabbar annat.
Och du saknar en bit där.
7bit i din kod.
Du kanske menar
MOVLW	B'01100000'	;4MHz internal osc
			 
			
					
				Re: Intern Osc-inställning 16F88
				Postat: 21 februari 2009, 13:30:10
				av sodjan
				> MOVLW B'0110000' ;4MHz internal osc
Koden stämmer inte med kommentaren.
Rätta det som är fel av dom...
			 
			
					
				Re: Intern Osc-inställning 16F88 (Löst)
				Postat: 21 februari 2009, 16:04:11
				av Tjille
				Det första man blir blind på är ögonen. Det var den sista nollan som saknades, vilket s-t-fel. När den kom på plats så fungerade det så som det skulle. Delay-rutiner mm i den ursprungliga koden var anpassad för 4MHz vilket gjorde att jag ville ha satt den interna osc till det samma i den nya PIC:varianten. Med rodnande kinder så tackar jag för hjälpen!
			 
			
					
				Re: Intern Osc-inställning 16F88 (Löst)
				Postat: 21 februari 2009, 16:14:07
				av sodjan
				Ett tips för att göra koden mer läsbar (och med mindre risk för att göra fel).
> MOVLW B'01100000' ;4MHz internal osc
> MOVWF OSCCON
Skriv istället t.ex :
BCF OSCCON, SCS0 ; Oscillator mode defined by FOSC<2:0>
BCF OSCCON, SCS1 ; -"-
BSF OSCCON, IRCF2 ; '110' = 4 MHz
BSF OSCCON, IRCF1 ; -"-
BCF OSCCON, IRCF0 ; -"-
Övriga bitar behöver inte sättas från koden. Då behöver man inte heller
leta i databladet för att se vad de olika bitarna har för funktion. Det blir
lite mer kod, men det görs ju normalt bara en gång vid start...
			 
			
					
				Re: Intern Osc-inställning 16F88 (Löst)
				Postat: 21 februari 2009, 22:20:24
				av Tjille
				Bra tips. Tack.
			 
			
					
				Re: Intern Osc-inställning 16F88 (Löst)
				Postat: 21 februari 2009, 22:45:47
				av sodjan
				Man kan generallisera tipset till att alltid sätta bitarna separat i register
där bitarna i alla fall inte har samma funktion (som t.ex OSCCON)
men gärna använda ett värde annars (som t.ex OSCTUNE).
			 
			
					
				Re: Intern Osc-inställning 16F88 (Löst)
				Postat: 22 februari 2009, 04:43:24
				av bearing
				sodjan skrev:
BCF OSCCON, SCS0 ; Oscillator mode defined by FOSC<2:0>
BCF OSCCON, SCS1 ; -"-
BSF OSCCON, IRCF2 ; '110' = 4 MHz
BSF OSCCON, IRCF1 ; -"-
BCF OSCCON, IRCF0 ; -"-
Går det att skriva såhär istället, eller liknande?
MOVLV !SCS0 | !SCS1 | IRCF2 | IRCF1 | !IRCF0
MOVWF OSCCON
Det skulle ju spara några instruktioner.
 
			
					
				Re: Intern Osc-inställning 16F88 (Löst)
				Postat: 22 februari 2009, 10:10:19
				av vfr
				Visst skulle det göra det! Nu vet jag inte precis vad "OR" i assemblersyntaxen heter ("|"?), men principen fungerar givetvis. Själv tycker jag nog att det är väl så bra då det är bättre samlat på det viset.
			 
			
					
				Re: Intern Osc-inställning 16F88 (Löst)
				Postat: 22 februari 2009, 12:22:43
				av victor_passe
				Nja, då skriver man väll över de andra bitarna med 0 eller?
Om man bara vill sätta några bitar och inte röra de andra så får man väll göra som Sodjan skrev.
Eller kanske något med xorwf eller något sådant men det orkar jag inte tänka på.
			 
			
					
				Re: Intern Osc-inställning 16F88 (Löst)
				Postat: 22 februari 2009, 12:29:39
				av vfr
				Jovisst gör man det. Men avsikten var nog inte så från bearings sida. Utan att man initierar hela registret på en gång, men lite tydligare med symboliska namn. Det är lite smaksak om man vill lägga all initiering på ett ställe eller sprida det per funktion.
Rent allmänt så tycker jag nog att det är bättre att initiera funktionerna där dom används, enligt Sodjans idé, men jag vill nog ändå initiera alla bitar till den funktionen i ett register på en gång istället för bit för bit. Det är lite smaksak också.
			 
			
					
				Re: Intern Osc-inställning 16F88 (Löst)
				Postat: 22 februari 2009, 12:39:03
				av sodjan
				När det gäller tydlighet i koden efter några år när kanske någon annan
ska förstå vad man tänkte och menade, så spelar en eller ett par
extra instruktioner ingen som helst roll. Speciellt inte i uppstartskoden
som i alla fall normalt bara körs en gång...
> MOVLV !SCS0 | !SCS1 | IRCF2 | IRCF1 | !IRCF0
För att det där ska fungera så måste väl de olika bit-variablerna vara
definierade som '00100000', d.v.s med en "1" i respektive *position*
för den bit som ska sätta. Det är de inte...
Ett alternativt sätt att skriva det som både blir tydligt och som sätter
hela registret med en instruktion är : 
Kod: Markera allt
   movlw     b'01100000' ; Set oscillator configuration
             ; X-------    Not defined...
             ; -110----    Select 4 MHz
             ; ----X---    Oscillator Start-up Time-out Status bit
             ; -----X--    INTOSC Frequency Stable bit
             ; ------00    Oscillator mode defined by FOSC<2:0>
   movwf     osccon