Enklare kodexempel på pic basic??

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
mullemeck
Inlägg: 1306
Blev medlem: 27 maj 2003, 23:52:06
Ort: Lund
Kontakt:

Inlägg av mullemeck »

att den sackar efter skulle jag tippa på beror på att det ju faktiskt tar någon mikrosekund att utföra
PORTB = siffra(ental)
PORTA = display(0)

och när man utför det så många gånger så kommer det spela in på tiden mellan siffrorna
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

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...?
Användarvisningsbild
dar303
Inlägg: 5979
Blev medlem: 17 december 2003, 19:54:56
Ort: Sthlm

Inlägg av dar303 »

Angånde "Sound"-kommandot :"white tones" är olika pitchat brus, det går att göra många roliga SNES/C64 explosioner och trumljud med detta.

/d
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

>> 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.
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

Glömt bort att kika in på forumet, men tack så mycket för hjälpen!

Får se när det blir av, är riktigt trött nu efter att först jobbat 10-18 o riktigt mkt o göra ,sen springa i julstressen o leta julklappar...
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

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:

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
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?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

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.
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

Hmm, tack för hjälpen till att börja med....

Har läst lite på PB manulalen men inte fattat allt för mycket om interuppts...

Har du lust att ge ett litet expempel på hur jag kan ancända interupts..?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

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.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Tyvärr är PICBasic riktigt otrevligt när det gäller att använda interrupts, åtminstone vad jag erfarit. Ska du ta del av denna funktion är det nog dax att byta språk (kanske är mikroBasic bättre?), eller om du lyckas implementera fungerande aseembler-kod som kan komplettera PICBasics brister.
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

Jobbigt värre, $tiff, hur löste du det, ivlket språk använde du dig av..?



En sak till jag kom på, om jag vill ancända en potentiometer med PICen, hur göra? 84 har väll inte A/D omvandlare... Men gick inte det att lösa på nått sätt med en kondensator och en pot?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

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.
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

Lyfter tråden igen.

Undrar pm jag kan avläsa en potentiometer på nått smidigt sätt? För att sedan tex styra ljusstrykan på en lysdiod...
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Om µC inte har ADC så kan du använda kommandot "POT" för att avläsa tidskonstanten för ett RC-nät där potentiometern är R.

Om det finns en ADC så är det helt klart bäst på alla sätt. Finns väl kommando för att använda den också i PBP.
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

Hmm...

Testade pot-funktionen med halv framgång :roll:

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
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:

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
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...
Skriv svar