PicBasicPro Programeringshjälp

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
G-man
EF Sponsor
Inlägg: 1368
Blev medlem: 21 december 2005, 20:04:36
Ort: Lkpg

PicBasicPro Programeringshjälp

Inlägg av G-man »

Har ägnat en "liten" stund till att läsa egenom PICBasicPro manualen och fått grepp på en hel del mot vad jag hade innan(total nybörjare på programering) PICBasic känns ok med tanke på att det var sånt man använde som liten för att skriva småsaker på sin första dator!

En massa frågor uppstår :) PIC kör koden från början till slut och om igen hela tiden? korrekt?

PWM...

I exempel PWM Pin, Duty, Cycle

tex PWM PORTB 2,127,1000

Kommer den ge ut "värde" 127 i 1000(5 sek vid 4MHz) cykler då eller kommer den i 100 cykler stega upp till värde 127?

Det är ju stegandet från 1-256 jag försöker uppnå, Cycle(om den stegar) skulle isåfall vara en variabel från typ POT för att kunna ställa stegandets hastighet från 1-256..

Ett bättre alternativ här kanske kan vara HPWM men, jag är inte med på hur stegningen upp och ner ska fungera då.

Många fler frågor kommer ;) hoppas nån har tid att ge bra svar :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Bara för att sätta "nivän" rätt, :-)

> "total nybörjare på programering...

Programering överhuvudtaget ?
Eller bara på PIC/mikrokontrollers ?

> PIC kör koden från början till slut och om igen hela tiden? korrekt?

Nja, en PIC kör i princip alltid *någonting* (förrutom "sleep" läge då den
ligger helt i vila, men vi bortser från det tillsvidare...).

Ett program till en PIC har inget "slut" till skillnad från ett program på t.ex
en PC, som ju kan avslutas och man åker tillbaka till (t.ex) Windows.

Sen är det lite fel att säga "från början till slut". Ett PIC-program har i
och för sig en början (reset-punkten på address h'0000') men det har
inget slut !

> Har ägnat en "liten" stund till att läsa egenom PICBasicPro manualen

LÄNK !
Låt inte de som vill hjälpa till själva leta över hela nätet efter den...

> tex PWM PORTB 2,127,1000
> Ett bättre alternativ här kanske kan vara HPWM men,

Absolut ! Om du använder en PIC med CCP modul. HWP "låser" upp
processorn under hela tiden (t.ex 5 sek i ditt exemepel). HPWM ställer
bara in hårdvaru-PWM modulen som sedan går av sig själv.

> jag är inte med på hur stegningen upp och ner ska fungera då.

Vill du ändra duty ? Det är bara att ändra "Dutycycle" i HPWM kommandot.
Eller vilken "stegning" ?

EDIT : Det var en sak jag glömde/missade...

> PICBasic känns ok med tanke på att det var sånt man använde som
> liten för att skriva småsaker på sin första dator!

Ett ganska dåligt kriterium för att välja verktyg till PIC programmering !
Det kommer du att upptäcka under vägen om du håller kvar vid Basic. :-)

Det finns igentligen ingen anledning att inte kör assembler, och det finns
flera anledningar att *göra* det :
- Helt gratis verktyg.
- Du kan göra "allt" med processorn.
- Fullt stöd för alla processorer.
- Enklare att få hjälp eftersom alla (i princip) som jobber med PIC kan ASM.
- Massor av exempelkod på nätet, t.ex på www.piclist.com ("Server Busy" just nu dock...)
- Du lär dig snabbare (och bättre) hur PIC processorerna fungerar.
G-man
EF Sponsor
Inlägg: 1368
Blev medlem: 21 december 2005, 20:04:36
Ort: Lkpg

Inlägg av G-man »

>>Bara för att sätta "nivän" rätt, :-)

Ok! :)

>> "total nybörjare på programering...

>Programering överhuvudtaget ?
>Eller bara på PIC/mikrokontrollers ?

Om man bortser från det lilla basic man skrev i början av 90talet så är jag total nybörjare.

>> PIC kör koden från början till slut och om igen hela tiden? korrekt?

>Nja, en PIC kör i princip alltid *någonting* (förrutom "sleep" läge då den
>ligger helt i vila, men vi bortser från det tillsvidare...).

>Ett program till en PIC har inget "slut" till skillnad från ett program på t.ex
>en PC, som ju kan avslutas och man åker tillbaka till (t.ex) Windows.

>Sen är det lite fel att säga "från början till slut". Ett PIC-program har i
>och för sig en början (reset-punkten på address h'0000') men det har
>inget slut !

Ok, om man säger så här då, en PIC är inte multitask så den gör vad den gör "just nu" och har den kommit till slutet av koden och ingen hänvisning har funnits så gör den ingenting.. typ...

>> Har ägnat en "liten" stund till att läsa egenom PICBasicPro manualen

>LÄNK !
>Låt inte de som vill hjälpa till själva leta över hela nätet efter den...

http://www.melabs.com/downloads/pbpm304.pdf
Det är från denna manual som jag har läst om alla funktioner, allt detta konverteras till assembler i programmet men jag valde den för att jag iallafall känner igen lite av kommandona i PICBasic så att de får en logisk mening för mig ;)
Jag har inte hittat något motsvarande med assembler i instruktionsväg så detta blev starten ;)

EDIT: jo assembler är att föredra, men underlaget till det saknas tycker jag, att lära sig alltså, detta fanns mycket tillgängligt och sammlat! jag letade eftermotsvarande till assembler :)

> tex PWM PORTB 2,127,1000
> Ett bättre alternativ här kanske kan vara HPWM men,

>Absolut ! Om du använder en PIC med CCP modul. HWP "låser" upp
>processorn under hela tiden (t.ex 5 sek i ditt exemepel). HPWM ställer
>bara in hårdvaru-PWM modulen som sedan går av sig själv.

> jag är inte med på hur stegningen upp och ner ska fungera då.

>Vill du ändra duty ? Det är bara att ändra "Dutycycle" i HPWM kommandot.
>Eller vilken "stegning" ?

Jag tar båda sakerna i en här ;)

Den röda tråden i detta projekt är tid.

På en inställbar tid(2-1,5tim tex) så PWM gå från 0-256(fullt) för att sedan stå på fullt på en inställbar tid(tex 3-10tim), sedan ska PWM gå från 256-0 på en inställbar tid. därav att jag blandade in POT i det hela ;)
Detta är alltså första delen i detta projekt http://www.elektronikforumet.com/forum/ ... php?t=8536

frågan blev då, måste jag göra så här:

PWM 1,1,1000
PWM 1,2,1000
PWM 1,3,1000
osv osv

1000 här ovan tolkade jag som den tid som signalen ska pågå, på HPWM ser det inte lika ut, den är isåfall tänkt att ersättas med en variabel från tex POT..

eller har (H)PWM någon inbyggd funktion att stega upp och ner automatisk så att säga?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Om man bortser från det lilla basic man skrev i början av 90talet

OK, men det har ganska liten rellevans när det gäller val av "språk" nu.

> Ok, om man säger så här då, en PIC är inte multitask så den gör vad den gör "just nu"

Det gäller vilken dator som helst !

"Multitask" är bara ett sätt att få det att *se ut* som om den gör
flera saker samtidigt, vilket den naturligtsivs inte gör... Och med
den definitionen går det lika bra att få en PIC att "multitaska".

> och har den kommit till slutet av koden

Det är en bug och skall åtgärdas !
Ett PIC program ska inte ha något "slut".

> och ingen hänvisning har funnits så gör den ingenting.. typ...

Jo, det gör den. En PIC gör *alltid* någonting.
Den kommer att fortsätta att *försöka" att exekvera
det som ligger efter själva koden. Normalt exekveras detta som NOP
och processorn kommer att "snurra runt" till reset-punkten igen.
Det ser alltså ut som om processorn får en RESET !

>jo assembler är att föredra, men underlaget till det saknas tycker jag,

Alla dokument från Microchip är det som gäller. Samt mycket läsande... :-)

> eller har (H)PWM någon inbyggd funktion att stega upp och ner automatisk så att säga?

Nej. Den ger den dutycycle som du har angett. Precis som med PWM, för övrigt.

Du får göra nya HPWM kommandon med lämpligt intervall för att få en
varierade pulsbredd på utgången. Hur tätt det skall ändras beror
på vilken upplösning du behöver.
G-man
EF Sponsor
Inlägg: 1368
Blev medlem: 21 december 2005, 20:04:36
Ort: Lkpg

Inlägg av G-man »

Hur ser motsvarande funktion ut i assembler?
Jag lät PICBASIC konvertera detta:

PWM PORTB.2,2,1000
PWM PORTB.2,50,1000
PWM PORTB.2,100,1000
PWM PORTB.2,150,1000
PWM PORTB.2,200,1000
PWM PORTB.2,256,1000


Detta svarade konverteraren efter att jag översatt med PICBASIC(och lite mer runt, inledelse osv)

PWM?TCC _PORTB_2, 002h, 003E8h
PWM?TCC _PORTB_2, 032h, 003E8h
PWM?TCC _PORTB_2, 064h, 003E8h
PWM?TCC _PORTB_2, 096h, 003E8h
PWM?TCC _PORTB_2, 0C8h, 003E8h
PWM?TCC _PORTB_2, 00100h, 003E8h




(jag håller på att bestämma mig om jag ska slopa Basic eller om jag ska fortsätta med det ;) )
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kör på med BASIC du, snabbt kommer du till vägs ända med det och sen ska du börja om från början......om du inte tröttna på det hela o skiter i det.

Till små program i PIC vill jag rekommendera ASM via MPLAB och i MicroChips hemsida finns det oceaner med exempeln, application notes och annat gott.

Vill du programmera större saker rekommenderar jag C.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> PWM?TCC _PORTB_2, 002h, 003E8h

Det där är nogot slags mellansteg i PicBasic, det är inte ASM.
Du får antagligen fler filer från kompilatorn, någon av dom
innhållet sannolikt genererad ASM kod. Kanske en "list" fil.
Det är inte heller säkert att kompilatorn genererar (eller sparar)
denna fil som standard.

Från manualen :

"If it likes your file, it will create an assembler source code file (in this case
named BLINK.ASM) and automatically invoke its assembler to complete the
task."

och

"3.2.2. Option -C

The -C option causes PBP to insert the PICBASIC PRO source file lines as
comments into the assembly language source file. This can be useful as a
debugging tool or learning tool as it shows the PICBASIC PRO instruction
followed by the assembly language instructions it generates."

Låter väl precis som det du vill ha ! :-)

Hur som helst...

> PWM PORTB.2,100,1000

Detta kommer att ge en kodsnutt med ett par loopar där PORTB.2
togglas fram och tillbaka (med en duty cycle på ca 100/256 % i detta fall).
Alltså en bit kod där processorn är "upplåst" under hela exekveringen.
Jag skulle undvika PWM så långt det går.

Om man däremot skulle titta på den kod som motsvarande HPWM genererar,
så skulle man se att där sätter man bara ett par register (de som styr/kontrollerar
CCP modulen), och sedan gör inte koden mer, eftersom CCP modulen
går "av sig själv". HPWM kommandot i sig tar bara ett par us.

För att säga exakt vilka ASM kommandon PWM/HPWM skulle motsvara
måste man nog veta vilken processor som du tänker använda.
G-man
EF Sponsor
Inlägg: 1368
Blev medlem: 21 december 2005, 20:04:36
Ort: Lkpg

Inlägg av G-man »

Det är bra att man inte behöver låsa upp den undertiden den väntar MEN..

vad händer när jag staplar upp alla steg i HPWM? jag ställer värde 128 till PWM och raden under innehåller nästa steg tex 256.. det kommer ju då att mata på nästa steg hela tiden och jag antar att HPWM inte kan köa "requests"...

visserligen så kan PIC inte användas till något annat än denna funktion med enbart PWM kommandot eftersom det skulle kunna ta flera timmar innan den kom till den delen av koden där man har andra uppgifter..

Sånt här är inte självklart för mig som nybörjare, alltså att man inte kan "hoppa" mellan programsnuttar för att göra flera saker samtidigt..alltså att den utför en instruktion i den långa tabell jag har satt upp och sen hoppar över till en annan funktion och kör och sen hoppar tillbaks och gör en instruktion(ha tålamod jag har bara hunnit med de första 20 sidorna om PIC från microchip) ;) (ska gå ner o läsa om CCP modul med om det står med:) )
G-man
EF Sponsor
Inlägg: 1368
Blev medlem: 21 december 2005, 20:04:36
Ort: Lkpg

Inlägg av G-man »

Hittade detta exempel, inte rakt på sak men kanske en bit påvägen att använda HPWM iallafall... det kanske hoppar "inom" denna programkod och inte kommer vidare ändå?

' PicBasic Pro Program to demonstrate hardware PWM.
' Output is a 1Khz signal with duty cycle sweeping
' from 20% to 80% once per second

' Note: PWM output will be on the CCP1 pin. Register
' names are for the PIC16F87x devices.

' PR2 = Timer2 period register, controls PWM period.
' CCPR1L and CCP1CON<5:4>bits control the duty cycle,
' and should be treated as a 10-bit word.

' Fosc = Clock Frequency (4MHz)
' PS = Timer2 Prescale Value (T2CON<1:0>)
' Freq = PWM output frequency
' Duty% = Duty cycle (20% = 0.2)

' formulas:
' PR2=(Fosc/(4*PS*Freq))-1
' CCPR1L:CCP1CON<5:4>=(PR2+1)*4*Duty%

dutyVARWORD' Duty cycle value (CCPR1L:CCP1CON<5:4>)


TRISC.2 = 0' Set PORTC.2 (CCP1) to output
CCP1CON = %00001100' Set CCP1 to PWM
T2CON = %00000101' Turn on Timer2, Prescale=4

' Use formula to determine PR2 value for a 1KHz signal,
' 4MHz clock, and prescale=4. (4E6/(4*4*1E3))-1=249

PR2 = 249' Set PR2 to get 1KHz out

' Use formula to determine CCPR1L:CCP1CON<5:4> value for
' ends of range 20% to 80%. (249+1)*4*0.2=200 (20% value)
' (249+1)*4*0.8=800 (80% value)


duty = 200' Set duty cycle to 20%

loop:CCP1CON.4 = duty.0' Store duty to registers as
CCP1CON.5 = duty.1' a 10-bit word
CCPR1L = DUTY >> 2

duty = duty + 10' Increase duty cycle

' Since the total sweep of duty is 600 (800-200) and
' we are adding 10 for each loop, that results in 60
' steps min to max. 1 second divided by 60 = 16.67mS

Pause 17' Pause 1/60 of second

IF (duty < 800) Then loop' Do it again unless 80% duty cycle

duty = 200' Reset to 20% duty cycle

GoTo loop' Do it forever


Eller saxat från ett annat forum..

I tried the suggested PWM built in PBP and it works pretty good.
Here is the code I used to get a nice ramp up and down even with
high brightness LEDs which are harder to control linearly.


led VAR PORTB.5
steps VAR WORD
cycles CON 2

' Change limits for steps to play around 0 or 100% brightness
' Change steps for different duration of ramps
' Works good even with high brightness LEDs, harder to control linearly


fade:

up:
For steps=0 TO 255
PWM led,steps,cycles
Next
High led

Pause 2500

down:
For steps=255 TO 1 STEP -1
PWM led,steps,cycles
Next
Low led

Pause 2500


GoTo fade

End

Det måste ju saknas en massa från det sista exemplet men det såg inte jätte tokigt ut iallafall ;) det var nästan at tjag hajade det ;)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> vad händer när jag staplar upp alla steg i HPWM?

Staplar och staplar... :-)

Man skall ju bara köra ett nytt HPWM kommando när man vill
ändra inställningen på PWM modulen, inte annars.

Det normala är att man ha en timer som ger jämna avbrott.
Vid dessa avbrott bestämmer man om det är dags att ändra
PWM inställningen, och i så fall gör det. Du kan läsa på lite
om interrupt i PicBasic dokumentationen.

I det längre programexemplet du hade så använder de bl.a PAUSE
för att vänta mellan ändringarna, vilket är ungefär lika dåligt
som att använda PWM kommandot, eftersom man även då
låser upp processorn under tiden.

I ett av exemplen använder de inte PWM/HPWM alls, utan sätter
rellevanta register direkt, vilket igentligen är bättre äftersom det
ger full kontroll över vad som händer. Samtidigt börjar det hela
likna assemblerkod mer och mer, så "vinsten" med Basic (om
deet fanns någon alls :-) ) blir mindre och mindre...

> alltså att man inte kan "hoppa" mellan programsnuttar för att göra flera saker samtidigt..

M an kan aldrig göra mer än en sak "samtidigt", däremot kan man
låta processorn växla mellan olika uppgifter vid behov eller med vissa
intervall. Det är detta som interrupt är till för.
Så snart man kommer över de allra enklaste programmen, så visar det sig
att det mesta blir enklarem med interrupt, det blir helt enkelt en
mycket renare och snyggare "arkitektur" i applikationen. Finns knappast
en enda PIC applikation som inte använder interrupt, så det är en
central funtkion att lära sig...

> ha tålamod jag har bara hunnit med de första 20 sidorna om PIC från microchip)

Vad är det du läser i ?

> ska gå ner o läsa om CCP modul med om det står med

Alla PIC modeller som har en CCP (ellr ECCP) modul har ett kapitel om den
i databladet.
Skriv svar