Sida 1 av 2

Intern oscillator i PIC18F1320 ?

Postat: 10 mars 2006, 14:32:27
av JimmyAndersson
PIC-kretsen är rätt inkopplad. Kondensator för 'avstörning', så den delen är ok. Kretsen programmeras, men det händer inget.
Vad vill jag ska hända? Jo:

Som test gjorde jag en blink-a-led som blinkar med hela portarna, typ:

TRISA = 0
TRISB = 0
WHILE TRUE
PORTA = 1
PORTB = 0
delay_ms(500)
PORTA = 0
PORTB = 1
delay_ms(500)
WEND

i MikroBasic.


PORTA är hög hela tiden. PORTB är låg hela tiden. Hela tiden = tills jag stänger av labbagget. :)


Vill som sagt (i rubriken) köra med den interna oscillatorn. Maxfrekvensen för PIC18F1320 är då 8MHz. Därför har jag satt INTIO2 hög och ställt in clock = 8MHz i MikroBasic. Men jag måste ha missat något mer. Har läst databladet men inte hittat vad jag glömt.



Tips?

Postat: 10 mars 2006, 14:43:56
av DeVille
Grejar inte med PIC egentligen.. men kan det vara något register där du skall sätta PortA och B till utgångar..

Finns funktionen delay_ms() ?? kan man göra sådana funktionsanrop när du programmerar till en PIC?

Postat: 10 mars 2006, 14:44:34
av Icecap
Nu har jag inte databladet men man ska väl ange att den ska använda den interna osc i flaggorna, det ska jag i alla fall när jag kör PIC16F628A'n.

I "min" MikroC (mycket trevligt program faktisk) ställar jag in det under Projekt->Edit Project...->Device flags, jag ställer även in Code Protect osv. där.

Postat: 10 mars 2006, 14:56:09
av klasg
Jag säger bara osccon... :)
(Kan inte MicroBasic)

Postat: 10 mars 2006, 15:18:55
av JimmyAndersson
DeVille:
Den delen har jag koll på. Koden fungerar med extern oscillator. Pga utrymmesbrist (och inte särskillt CPU-tid-krävande kod) så klarar jag mig med den interna oscillatorn.

Icecap:
Det låter som om MikroC och MikroBasic är likadant uppbyggt. Troligen är det så med tanke på att det är samma tillverkare.

Klasg:
Jag har hittat osccon i databladet, men det finns ingen inställning för det i Device flags.


Här är databladet om ni vill kika. :)



edit: Med INTIO2 väljer man den interna oscillatorn. Men det har inte hjälpt tyvärr.

Postat: 10 mars 2006, 15:25:17
av dr. Agoz
skriv till OSCCON som du skriver till TRISx

Postat: 10 mars 2006, 15:30:44
av klasg
Eftersom jag inte använder MicroBasic så vet jag inte hur man ska göra där. Tog bara en snabbtitt på databladet nu, har du testat: idlen=0 och scs1=1?

EDIT: Och ircf2 och ircf0 så klart...

Postat: 10 mars 2006, 16:38:20
av Icecap
Det ska ställas in i "Config Register 1H", då jag gjorde ett projekt med den CPU var det bara att bocka in "INTIO2_OSC_1H = $00F8", sen var det klart.

Det är INGET man kan programmera under drift för hur ska programmet köra utan klocka? Man kan kanske välja senare men det är en annan sak.

Postat: 10 mars 2006, 16:42:01
av sodjan
Har du satt CONFIG till intosc ?
(Hur man gör det i M-B får du kolla själv !)

> PORTA = 1

PORTA är ett 8 bitars register !!
Ange ett hex värde eller ett 8 bitars binär värde.

> PORTA är hög hela tiden.

PORTA är 8 I/O pinnar. Vilken har du mätt på ? Alla 8 ?

Indentera WHILE/WEND, tack !
Så att det går att läsa koden utan ansträngning.

> Koden fungerar med extern oscillator.

OK. Och vad har du gjort för att byta till INTOSC ?
Förrutom att plocka bort kristallen, alltså... :-)

> Jag har hittat osccon i databladet, men det finns ingen inställning för det i Device flags.

Korrekt. OSCCON är en *FSR*, inget CONFIG register !
Kolla i CONFIG delen hur du switchar till INTOSC.

Postat: 10 mars 2006, 17:04:37
av dr. Agoz
Jag vet inte vad OSCCON har för startvärde i denna krets i 16F88 tror jag att det var 32KHz så där måste man sätta OSCON till rätt värde i början. annars kommer din delay ta LÅÅNG tid

men har man som, påpekats tidigare, glömt att ställa in kretsen på att körsa på INTOSC så spelar det mindre roll.

edit: behöver inte tilldela PORTA ett binär värde eller hex värde detta (i C iaf) det behandlas som ett unsigned char och förstår att 0xFF och 255 är samma sak, ser bara olika ut för programeraren. (sen är det kanske snyggare)

Postat: 10 mars 2006, 17:56:03
av sodjan
OSCCON = 31 Khz vid POR i den aktuella processorn...

Postat: 10 mars 2006, 19:03:13
av dr. Agoz
så det blir en delay på 64.5 sekunder ungefär =)

Postat: 10 mars 2006, 23:00:07
av JimmyAndersson
Filen explorer.exe (i WinXP) brakade ihop. Tog en stund att fixa men nu är jag tillbaka. :)

Icecap: Då hade jag alltså gjort rätt. Tack för att du bekräftade det. :)

sodjan: Koden var visserligen bara ett exempel, men du har helt rätt.
Det jag gjorde för att byta till INTOSC var precis som Icecap skrev i hans senaste inlägg.

Det jag hade missat var att jag behövde sätta OSCCON rätt. Det fungerar nu, men precis som dr.Agoz skrev så blir det en (för) lång delay.


Nu får jag kanske skylla mig själv som använder MikroBasic, :) men jag förstår inte förhållandet mellan delay_ms-kommandot och OSCCON. Jag menar: Skriver jag delay_ms(500) så betyder det ett delay på 500ms. Men i verkligheten så blir det mer än dubbelt så långt... Hur ska jag räkna för att kunna sätta OSCCON rätt?

Postat: 10 mars 2006, 23:45:03
av sodjan
MikroBasic (och delay_ms) har naturligtsvis inte en aning om hur
snabbt din PIC snurrar i VERKLIGHETEN. Koden du skriver har heller
inte någon som helst metod (utan en extern tidsref) att ta reda på
hur snabbt den går.

Alltså måste (t.ex) delay_ms *lita* på den hastighet du *påstår*
att den kommer att köras i med hjälp av något kommando/direktiv
i MikroBasic (eller inställning i någon meny). Om du påstår att du
tänker köra i 8 Mhz, så gör naturligtsvis MikroBasic en fördröjning på
500 ms av delay_ms(500), under förutsättning att du faktiskt kör
i 8 Mhz. Annars kan det bli vilken tid oms helst...

Det du säger med delay_ms(500) är :

"Gör en delay i det antal processorcykler som tar 500 ms vid 8 Mhz".

Oavsett med vilken hastighet du senare faktiskt kör din PIC, så kommer
den alltid att göra en delay med samma antal *cykler*.

Ett annat sätt att se på det är att en PIC inte har en aning om
vad en "sekund" är, den kan bara räkna sina egna cykler...

> Men i verkligheten så blir det mer än dubbelt så långt...

1. Bug i delay_ms()
2. Du har angivit fel hastighet i MikroBasic.
3. Du har ställt in OSCCON fel.

*Normalt* ska du inte räkna alls. Ställ in OSCCON rätt, tala om för M-B
vilket hastighet du har valt, och delay_ms() ska ge rätt tid.

Men problemet var väl att du hade en delay som var *mycket* mer än
dubbelt för lång ?

> Det jag hade missat var att jag behövde sätta OSCCON rätt.
> Det fungerar nu, men precis som dr.Agoz skrev så blir det en (för) lång delay.

Här hänger jag inte med, det var väl en för lång delay *innan* du fixade OSCCON !?

Postat: 11 mars 2006, 00:05:18
av JimmyAndersson
Tack för lektionen! Värdefullt. :)

>> Det jag hade missat var att jag behövde sätta OSCCON rätt.
>> Det fungerar nu, men precis som dr.Agoz skrev så blir det en (för) lång delay.

>Här hänger jag inte med, det var väl en för lång delay *innan* du fixade OSCCON !?

Helt riktigt. Det skulle ha stått "..så blev det en (för) lång delay."