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