Sida 1 av 2
Nybörjarfråga om OSCCAL och andra register.
Postat: 29 februari 2008, 10:09:33
av m4rtin
Hej.
Jag är helt grön på Pic-programmering, men har ändå läst lite assamblerprogrammering, så jag borde kunna reda ut mina problem...
Jag har en PIC 10f206 som jag tillslut bara vill skall vakna när en insignal ändras, sen skall den göra en utgång hög, och sedan hamna i vila igen. jag tror inte det skall vara ett omöjligt jobb, men behöver lite hjälp att förstå hur man sätter register som de skall vara.
Jag använder MPLAB IDE tillsammans med en Picstart plus, och har tyvärr ingen chasn att välja nån annan pic än ju st 10f206. "Fördelen" men denna pic är att den har en intern klocka, doch vet jag inte hur den används
Mitt mål till att börja med är enbart att kunna göra en utgång hög, tillex för att tända en lysdiod.
Jag har läst på i några dagar nu om PIC-programmering, men jag har rätt svårt att ta i nya saker i huvudet... Att läsa datablad är något av det svåraste som finns ju... Vad jag förstått är det första man skall göra att sätta registerna korrekt.
Hur skriver jag rent praktiskt i OSCCAL and Registert för att få min interna klocka att fungera?
På något sätt känns det som om jag skall sätta OSCCAL = %00000001, så den hamnar i "center-freq". Allt en nolla i slutet beroende på vad jag vill ha GPIO.2 att göra?
Är enbart starten av koden jag gjort rätt på än...
list p=10F206 ; Berätta villken processor som används
#include <p10F206.inc> ; Inkludera fil med definerade grejor
Mvh MArtin S
Postat: 29 februari 2008, 10:27:38
av bos
OSCCAL används om du ska kalibrera den interna klockan. Av ditt projekt att döma så är inte exekveringen tidskritisk. Jag har bara skumläst databladet men jag ser ingenstans där det står att du *måste* kalibrera klockan, så du kan med andra ord skippa i kalibreringen.
Databladet säger också:
9.2.1 OSCILLATOR TYPES
The PIC10F200/202/204/206 devices are offered with
Internal Oscillator mode only.
INTOSC: Internal 4 MHz Oscillator
Vilket innebär att du inte kan ställa in vilken klocktyp du ska ha. Med andra ord så får du 4MHz-klockan direkt.
Och läsa datablad är svårt om man är ovan. Fördelen är att de flesta PIC-datablad är så gott som exakta i sina upplägg. Har man väl läst igenom ett datablad så kommer resten att flyta på av egen maskin.
Postat: 29 februari 2008, 10:37:33
av m4rtin
Okej, men det var ju bra. Nä, exekveringen är inte det minsta tidskritisk, bara jag som trodde att man var tvungen att sätta nått kalibreringsvärde, annars skulle det inte fungera överhuvudtaget.
Kommer snart en ny fråga när jag läst vidare om vad jag skall göra.
/Martin
Postat: 29 februari 2008, 21:07:24
av probe
Kod: Markera allt
list p=10F206 ; list directive to define processor
#include <p10f206.inc> ; processor specific variable definitions
;Center LED on GP0
;Two seris LED´s on GP1 and GP2
;Pulledupp trigg input on GP3 (start blink when pulled low)
;******************************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _MCLRE_OFF & _IntRC_OSC
;=====================================
;Memory map
;=====================================
temp EQU 0x10
delay1 EQU 0x11
delay2 EQU 0x12
i EQU 0x13
;*************************************
org 0x3FF ;Reset vector
org 0x00
movwf OSCCAL ;Write OSCAL
bcf OSCCAL,FOSC4
goto MAIN
;=======================================
;subroutines
;========================================
;Long delay //loop 63750 times//
;========================================
delay
movlw 0xfa
movwf delay1
movlw 0xFF
movwf delay2
delay_loop1
decfsz delay1,F
goto delay_loop2
retlw 0x00
delay_loop2
decfsz delay2,F
goto delay_loop2
goto delay_loop1
;========================================
;Short delay //loop 21165 times//
;========================================
wait
movlw 0x53
movwf delay1
movlw 0xFF
movwf delay2
delay_loop11
decfsz delay1,F
goto delay_loop12
retlw 0x00
delay_loop12
decfsz delay2,F
goto delay_loop12
goto delay_loop11
;========================================
;Low light CenterLed //light CenterLed at 9% dutycykle//
;========================================
flash
movlw 0xFA
movwf delay1
movlw 0xFF
movwf delay2
flash1
decfsz delay1,F
goto flash3
retlw 0x00
flash3
bsf GPIO,0
bcf GPIO,0
nop
nop
nop
nop
nop
nop
decfsz delay2,F
goto flash3
goto flash1
;========================================
;High light CenterLed //light CenterLed at 17% dutycykle//
;========================================
flash_h
movlw 0xFA
movwf delay1
movlw 0xFF
movwf delay2
flash1_h
decfsz delay1,F
goto flash3_h
retlw 0x00
flash3_h
bsf GPIO,0
bcf GPIO,0
nop
nop
decfsz delay2,F
goto flash3_h
goto flash1_h
;=======================================
;MAIN
;=======================================
MAIN
movlw b'10000000' ;Turn on WPU
option
movlw b'11110011'
movwf CMCON0
movlw b'00000000' ;Turn off all ports
movwf GPIO
movlw b'11111000'
tris GPIO ;Set TRIS GP0,GP1,GP2 outputs, GP3 input
TRIGG_WAIT
btfsc GPIO,3
goto TRIGG_WAIT ;Wait for GP3 to go low
movlw 0x04 ;Load counter
movwf i
bsf GPIO,1 ;Light GP1
call wait
bcf GPIO,1 ;Turn off GP1
bsf GPIO,2 ;Light GP2
call wait
bcf GPIO,2 ;Turn off GP2
call wait
bsf GPIO,1 ;Light GP1 and GP2
bsf GPIO,2
call wait
bcf GPIO,1 ;Light GP0 and turn off GP1 and GP2
bcf GPIO,2
bcf GPIO,0
blink ;Run flash 4 times
call flash
decfsz i,F
goto blink
bsf GPIO,0 ;Light GP0
call wait
bsf GPIO,1 ;Light GP1 and GP2
bsf GPIO,2
call delay
bcf GPIO,1 ;Turn off GP1 and GP2
bcf GPIO,2
call delay
bsf GPIO,1 ;Light GP1 and GP2
bsf GPIO,2
call delay
bcf GPIO,1 ;Turn off GP1 and GP2
bcf GPIO,2
call wait
call flash ;Run flash
call flash_h ;Run flash_h (high brightness)
call flash ;Run flash
decfsz i,F
bcf GPIO,0 ;Turn off GP0 -not needed, just to be sure-
goto TRIGG_WAIT ;Start again waiting for trigg
END
Där har du ett fungerande exempel för en 206á tror att koden förklarar sig själv nästan
Postat: 29 februari 2008, 21:25:55
av bos
Ett plus är om kommentarerna stämmer, blir lättare att följa koden då.
Jag tänker på detta:
Kod: Markera allt
bcf GPIO,1 ;Light GP0 and turn off GP1 and GP2
bcf GPIO,2
bcf GPIO,0
Dessutom inbjuder tre bcf i rad - på samma port - till R-M-W-problem. Det kanske råkar fungera i detta fall, men det är inte säkert det går det på nästa processor.
Jag skulle ha gjort såhär:
Kod: Markera allt
movfw GPIO
andlw b'11111000' ; Keep a copy of bits 3-7, 0-2 will be destroyed
iorlw b'00000001' ; Light GP0
movwf GPIO
(om nu en etta anger att dioden ska tändas)
En rad kod mer, men då undgår man R-M-W och samtidigt så behåller man eventuellt viktiga bitar i GPIO.
Postat: 1 mars 2008, 20:44:32
av probe
Det spelar ingen roll i detta fall men visst. Gör inte anspråk på att vara någon perfekt kod, men dock något som fungerar -
Postat: 3 mars 2008, 16:22:39
av m4rtin
ny fråga... JAg ka ninte föra över programmet till min pic! Tetstat göra ett program till en 16f-serie-pic, det fungerar utmärkt. Men när ajg föröker föra över nått till min lilla 10f206 står det :
Program Memory Errors
Address Good Bad
0000: 04E3 3FFF
0001: 0583 3FFF
0002: 0C00 3FFF
0003: 0025 3FFF
0004: 0526 3FFF
0005: 0446 3FFF
0006: 0CF8 3FFF
0007: 0006 3FFF
0008: 0A04 3FFF
Vad menas med det? Kan picen vara sönder? Kan ha råkat koppla fel innan när jag skulle prova den....., kanske brände jag den?
Postat: 3 mars 2008, 17:33:37
av sodjan
Programmerare ?
Postat: 3 mars 2008, 20:07:28
av probe
Det är en annan algoritm för 10F är 16F vid programmering - går att läsa mer om det på microchips sidor, eller välj en programmerare som säkert tar 10F. Jag har programmerat 10F med ICD-2 och någon "base-line-demo-kit-mumbo-jumbo" microchip programmerare. Hade dock problem med ISP-PRO med 10F, har för mig att det gick om man tvingade över den till samma algoritm som de gamla 12-bitarstyperna (typ 12f84), men som sagt enklast att köra med en dyr microchip programmerare eller välja WISPén som jag TRO fungerar med 10F (har inte testat med 10F med WISP fast jag har en..)
PG164101 hette visst den gamla baseline programmeraren, men den tillverkas nog inte längre.
Postat: 3 mars 2008, 21:53:03
av sodjan
> eller välja WISPén som jag TRO fungerar med 10F
Ja, det är en av de få saker som VOTI's original Xwisp klarar.
För övrigt (och 10F är inte speciellt vanlig) så är Xwisp2 från
Rob Hammerling lite smidigare och snabbare.
Postat: 4 mars 2008, 08:38:19
av m4rtin
Använder den senaste versionen av picstart plus, så den borde stödja 10f-serien...
Postat: 4 mars 2008, 09:07:05
av sodjan
Vadå "borde" ? Varför inte ta reda på det ?
Visst, det är sannolikt så, men i alla fall....
Postat: 4 mars 2008, 10:11:18
av m4rtin
Okej, menar att den "borde" det för att den stödjer ju min PIC. Den finns med i rulllisten när man skall välja vilken pic man programmerar så. Är det något mer ställe jag skall kika på?
/Martin
Postat: 4 mars 2008, 11:56:54
av sodjan
Jaha, ja då så...
Hur som helst, ingen annan än du själv kan nog
säga vad som är problemet här. Med den information
som vi har.
Har du programmerat någon 10F tidigare ?
Har du programmerat någon annan PIC alls ?
Postat: 4 mars 2008, 13:32:55
av m4rtin
Jag är helt nybörjare på programmera PIC, men föröker lära mig så gott det går. Har som sagt testat att programmera några enkla rader kod till en 16F pic, och det fungerade som det var tänkt. Sen gör jag likadant till min 10F, men det fungerar inte alls. Koden jag skickar har jag plockat från givna, fungerande program, så det borde itne vara det som felar.