Intern Osc-inställning 16F88 (Löst)
Intern Osc-inställning 16F88 (Löst)
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
;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.
-
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Re: Intern Osc-inställning 16F88
...
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
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
> MOVLW B'0110000' ;4MHz internal osc
Koden stämmer inte med kommentaren.
Rätta det som är fel av dom...
Koden stämmer inte med kommentaren.
Rätta det som är fel av dom...
Re: Intern Osc-inställning 16F88 (Löst)
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)
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...
> 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)
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).
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)
Går det att skriva såhär istället, eller liknande?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 ; -"-
MOVLV !SCS0 | !SCS1 | IRCF2 | IRCF1 | !IRCF0
MOVWF OSCCON
Det skulle ju spara några instruktioner.
Re: Intern Osc-inställning 16F88 (Löst)
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.
-
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Re: Intern Osc-inställning 16F88 (Löst)
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å.
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)
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å.
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)
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 :
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