Intern Osc-inställning 16F88 (Löst)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Tjille
Inlägg: 43
Blev medlem: 4 februari 2007, 14:33:00
Ort: Göteborg

Intern Osc-inställning 16F88 (Löst)

Inlägg 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
Senast redigerad av Tjille 21 februari 2009, 16:00:34, redigerad totalt 1 gång.
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: Intern Osc-inställning 16F88

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Intern Osc-inställning 16F88

Inlägg av sodjan »

> MOVLW B'0110000' ;4MHz internal osc

Koden stämmer inte med kommentaren.
Rätta det som är fel av dom...
Tjille
Inlägg: 43
Blev medlem: 4 februari 2007, 14:33:00
Ort: Göteborg

Re: Intern Osc-inställning 16F88 (Löst)

Inlägg 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!
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Intern Osc-inställning 16F88 (Löst)

Inlägg 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...
Tjille
Inlägg: 43
Blev medlem: 4 februari 2007, 14:33:00
Ort: Göteborg

Re: Intern Osc-inställning 16F88 (Löst)

Inlägg av Tjille »

Bra tips. Tack.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Intern Osc-inställning 16F88 (Löst)

Inlägg 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).
bearing
Inlägg: 11674
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Intern Osc-inställning 16F88 (Löst)

Inlägg 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.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Intern Osc-inställning 16F88 (Löst)

Inlägg 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.
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: Intern Osc-inställning 16F88 (Löst)

Inlägg 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å.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Intern Osc-inställning 16F88 (Löst)

Inlägg 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å.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Intern Osc-inställning 16F88 (Löst)

Inlägg 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
Skriv svar