Enklare kodexempel på pic basic??
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Okidoki, ta och läsa alla mina ändringar längst ner i min post som ligger längst ner på förra sidan, så kan du kanske hjälpa till att reda ut några frågetecken....
Kom på ett till nu, egentligen borde det stå
943,83144678017692380861790164558
i koden, men man får väll inte använda decimaler...? Och ändrar man pulstiden till 2*50us blir det helt fel när man sätter igång den, räknar alldels för sakta...
Man kommer ju aldrig kunna bygga en klocka på detta sättet...?
Kom på ett till nu, egentligen borde det stå
943,83144678017692380861790164558
i koden, men man får väll inte använda decimaler...? Och ändrar man pulstiden till 2*50us blir det helt fel när man sätter igång den, räknar alldels för sakta...
Man kommer ju aldrig kunna bygga en klocka på detta sättet...?
>> NSR_Martin
Bra försök, men det är fel metod att göra nån sorts klocka eftersom:
1. Högnivåspråk är mycket sällan bra på att hålla timingen, åtminstone inte när man inte har koll på den motsvarande maskinkoden bakom.
2. Du måste använda timers, interrupts och en klockkristall för att få en exakt uppräkning av tiden.
Det största felet du gör i din kod är att du har alldeles för många upprepningar av en mycket kort pause (pauseus 500), som kommer ge stora ackumulerade fel. För att multiplexera räcker det gott med 100 Hz. en "pause 5" repeterat 200 gånger bör generera mindre fel. Antagligen får du stämma av med din klock ändå så länge du använder denna metod.
Bra försök, men det är fel metod att göra nån sorts klocka eftersom:
1. Högnivåspråk är mycket sällan bra på att hålla timingen, åtminstone inte när man inte har koll på den motsvarande maskinkoden bakom.
2. Du måste använda timers, interrupts och en klockkristall för att få en exakt uppräkning av tiden.
Det största felet du gör i din kod är att du har alldeles för många upprepningar av en mycket kort pause (pauseus 500), som kommer ge stora ackumulerade fel. För att multiplexera räcker det gott med 100 Hz. en "pause 5" repeterat 200 gånger bör generera mindre fel. Antagligen får du stämma av med din klock ändå så länge du använder denna metod.
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Lyfter tråden igen då jag stött på en sak jag undrar över.
Det är e n lysdiod som blinkar, har tagit tiden hur länge man hållt inne en knapp, det lagras i millisekunder i variablen tid.
För att blinkandet ska avbrytas direkt (även om den blinkar med 0,5hz) har jag gjort följande:
Detta tycker jag känns lite omständigt när jag vill att allt ska avbrytas vad som än utförs ifall man trycker in knappen. Finns det nån bra och smidigare lösning på mitt problem?
Det är e n lysdiod som blinkar, har tagit tiden hur länge man hållt inne en knapp, det lagras i millisekunder i variablen tid.
För att blinkandet ska avbrytas direkt (även om den blinkar med 0,5hz) har jag gjort följande:
Kod: Markera allt
PORTB.0 = 1
tmp = 0
While PORTB.4 = 0 AND tid > tmp
Pause 10
tmp = tmp + 1
Wend
tmp = 0
PORTB.0 = 0
While PORTB.4 = 0 AND tid > tmp
Pause 10
tmp = tmp + 1
Wend
Vad var det nu du körde med? '84A?
Du kan använda PortB-interrupt eller PortB.0 Interrupt för att sköta avläsningen av knappen. Den kollar hela tiden om det har skett en förändring på aktuell I/O och genererar ett interrupt isåfall.
I interrupt-rutinen kan du sedan sköta räknandet av tiden som knappen är nedtryckt och lagra i en variabel.
Huvudprogrammet kan då ägna sig åt att bara blinka med lysdioden, eller vad du nu än vill.
Du kan använda PortB-interrupt eller PortB.0 Interrupt för att sköta avläsningen av knappen. Den kollar hela tiden om det har skett en förändring på aktuell I/O och genererar ett interrupt isåfall.
I interrupt-rutinen kan du sedan sköta räknandet av tiden som knappen är nedtryckt och lagra i en variabel.
Huvudprogrammet kan då ägna sig åt att bara blinka med lysdioden, eller vad du nu än vill.
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Jag använder inte PB och kommer aldrig att göra det heller men interrupt är det rätta sätt om man inte vill montera en RTC (Real Time Clock) krets och kanske mata den från en DS32KHZ, då kommer du att ha en noggranhet på 1 min/år vid rumstemperatur.
Nåväl.
Vid att sätta upp t.ex. timern till att ge en interrupt varje sekund kan den fångas och utföra den önskade funktion.
Interrupten kan t.ex. göra:
Acceptera den (nolla interruptflaggan så den kan komma igen)
Räkna upp tiden med 1 sek.
Som "vanligt" program finns då scanningen av display samt konverteringen, knapp-grejor osv.
En interrupt avbryter det vanliga programflöde och utför interruptrutinen varefter det vanliga programflöde förtsätter som om inget hade hänt.
Du kan se det som att ha 2 "olika" program körande samtidig.
Nåväl.
Vid att sätta upp t.ex. timern till att ge en interrupt varje sekund kan den fångas och utföra den önskade funktion.
Interrupten kan t.ex. göra:
Acceptera den (nolla interruptflaggan så den kan komma igen)
Räkna upp tiden med 1 sek.
Som "vanligt" program finns då scanningen av display samt konverteringen, knapp-grejor osv.
En interrupt avbryter det vanliga programflöde och utför interruptrutinen varefter det vanliga programflöde förtsätter som om inget hade hänt.
Du kan se det som att ha 2 "olika" program körande samtidig.
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Jag löste aldrig interrupt-problemet i PICBasic, jag gav upp PIC och började med AVR istället. Mycket trevligare att programmera i assemmbler.
Du kan ju fortfarande använda dig av interrupt-flaggorna för att dra lite nytta av interrupt-funktionerna i PICen, men då handlar det fortfarande om att polla.
Du kan ju fortfarande använda dig av interrupt-flaggorna för att dra lite nytta av interrupt-funktionerna i PICen, men då handlar det fortfarande om att polla.
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Hmm...
Testade pot-funktionen med halv framgång
Först körde jag denna kod för att kolla scale:
Portb.3 är en lysdiod jag hade för lite indikering, portb.4 är kopplad till potens bas och ett ben går sedan till en konding som sen går till jord.
Fick fram att scale ska va 13. So far so good, efter detta försökte jag med följande kod:
När jag sedan kopplade upp det och skulle testa så händer ingenting alls... Nån som kan hjälpa mig med vad som är fel?... Borde väll va nått med potfunktionen tycker man...
Testade pot-funktionen med halv framgång

Först körde jag denna kod för att kolla scale:
Kod: Markera allt
DEFINE OSC 4
B0 VAR BYTE
scale VAR BYTE
tmp VAR BYTE
TRISB.3 = 0
TRISB.4 = 1
For scale = 1 TO 255
Pot PORTB.4, scale, B0
IF (B0 > 253) Then calibrated
Next scale
For tmp = 0 TO 255
PORTB.3 = 1
Pause 500
PORTB.3 = 0
Pause 500
Next tmp
Stop
calibrated:
Write 0,scale
For tmp = 0 TO 4
PORTB.3 = 1
Pause 50
PORTB.3 = 0
Pause 200
Next tmp
End
Fick fram att scale ska va 13. So far so good, efter detta försökte jag med följande kod:
Kod: Markera allt
DEFINE OSC 4
poten VAR BYTE
loop:
Pot PORTB.4,13,poten
PORTB.3 = 1
Pause poten
PORTB.3 = 0
Pause (255 - poten)
GoTo loop
End