Sida 1 av 2
Hjälp med beräkningar i microcode studio
Postat: 2 september 2008, 22:27:03
av Patrick
Jag undrar om någon vet hur man kan räkna saker i microcode.
Om jag tex får in 100 pulser på 2 sekunder,så tar picen det gånger 30 och visar värdet på en display.
Det handlar om varvtal i en bil som skall visas på en LCD display.
Kommandot för lcd,n är lcdout.
Jag behöver absolut inte ha någon exakt precision och en viss delay på saken skulle vara pluspoäng.
Så den inte tokflaksar med värdet upp o ner pga ojämnt varvtal etc.
Delay menar jag med att den tar 5 sekunder på sig att räkna så tex,inte mer än 5 sekunder dock,så de går för segt.
Sen får den en viss paus i det hela automatiskt!
TACK på förhand!
Sensorn är en vanlig fotocell samt reflex på en sak som roterar på motorn
Postat: 2 september 2008, 22:39:16
av sodjan
Hur menar du med att "räkna i Microcode Studio" ?
Det är ju en utvecklings/simulerings miljö, om jag förstår rätt.
Är det PicBasic (Pro) som du använder ?
Vad mer specifikt är det som är problemet ?
Hur ser din kod ut som du har provat med ?
> 100 pulser på 2 sekunder,så tar picen det gånger 30
Bättre med 100 pulser på 1,875 sekunder gånger 32.
Eftersom det är enklare att multiplicera med jämna potenser av 2...
Postat: 2 september 2008, 22:45:02
av Patrick
Pulserna kommer ju vara grymt höga pga varvtalet.
Varje varv är en puls.
Det som jag måste gångra med är för att få fram alla pulser för 60 sekunder.
Varv per minut ska visas på skärmen.
Picbasic pro är det givetvis.
Idagslägget har jag ingen kod för jag har absolut noll koll hur detta ska ske.
Hur koden skall bli dvs.
Problemet är väl att jag inte vet som ovan.
Postat: 2 september 2008, 22:52:43
av sodjan
Så tätt kommer de väl inte.
Vid 10.000 rpm så får du ca 166 pulser/sekund, vilket
inte är speciellt mycket. Vi lägre varv får man bättre
upplösning om man istället mäter periodtiden mellan
två pulser.
Hur som helst, jag har också noll koll hur detta
görs bäst i just PicBasic. Du får väl börja labba lite...
Postat: 2 september 2008, 23:02:21
av Patrick
Absolut!
Ska få hem lite saker till allt,såsom kretskort,display osv så:)
Postat: 2 september 2008, 23:03:12
av Patrick
Att notera är att jag inte har någon RPM / varvtalsräknare i bilen.
Så har inget att gå efter såsom kalibrering osv.
Vilket jag kan tänka mig är ett stort minus!
Postat: 2 september 2008, 23:40:58
av sodjan
Vad är det som ska kalibreras ?
Du behöver en känd signal (behöver inte komma
från en bil eller en motor) så att du kan kolla
att ditt rpm värde blir korrekt. Det kan vara 50/100 Hz
från en trafo eller en signal från en annan PIC eller
liknande.
Postat: 3 september 2008, 07:18:22
av H.O
Använd
Count för att räkna antal pulser under en viss tid eller
PulseIn för att mäta pulsbredd.
Kod: Markera allt
RPM VAR Word
Start:
COUNT PORTB.1, 1875, RPM 'Räkna pulser på PortB.1 i 1.875s
W1 = W1 << 5 'Multiplicera med 32
LCDOUT $FE, 1, "Vartvtal = ", #RPM, "RPM"
Goto Start
Ej testat men "borde" funka (har man sagt det några gånger, eller?) inte så snyggt att uppdatera hela displayen men det kan du fila på sen.
Ett annat alternativ är att du sätter upp t.ex TMR0 till att räkna pulser och TMR1 som en tidbas. Finns många sätt.
Glöm inte att definera klockhastighet och vart du har LCD'n ansluten etc etc.
Postat: 3 september 2008, 09:53:19
av Icecap
Jag gjorde en gång en mätdator till min bil.
Bland mycket annat mätte den varvtal, jag gjorde det vid att använda en "capture-unit" som fanns i µC'n (precis som på PIC). Jag fick då tiden mellan varje puls men jag begärde 4 pulser (alltså 2 varv, ställbart för att medge olika antal cylinder) och tog den totala tiden som jag kallade X.
Sedan var det bara att räkna lite:
RPM = Konstant / X;
Konstanten beror på kristallfrekvens, prescaling osv.
På detta vis blev RPM räknat ut mellan 5,8 och 50 gg/sek, fungerade jättebra och stabilt.
Postat: 4 september 2008, 20:57:47
av Patrick
sodjan skrev:Vad är det som ska kalibreras ?
Du behöver en känd signal (behöver inte komma
från en bil eller en motor) så att du kan kolla
att ditt rpm värde blir korrekt. Det kan vara 50/100 Hz
från en trafo eller en signal från en annan PIC eller
liknande.
Ja jo iof
Klantingt av mig

hehe
Postat: 4 september 2008, 20:59:35
av Patrick
H.O skrev:Använd
Count för att räkna antal pulser under en viss tid eller
PulseIn för att mäta pulsbredd.
Kod: Markera allt
RPM VAR Word
Start:
COUNT PORTB.1, 1875, RPM 'Räkna pulser på PortB.1 i 1.875s
W1 = W1 << 5 'Multiplicera med 32
LCDOUT $FE, 1, "Vartvtal = ", #RPM, "RPM"
Goto Start
Ej testat men "borde" funka (har man sagt det några gånger, eller?) inte så snyggt att uppdatera hela displayen men det kan du fila på sen.
Ett annat alternativ är att du sätter upp t.ex TMR0 till att räkna pulser och TMR1 som en tidbas. Finns många sätt.
Glöm inte att definera klockhastighet och vart du har LCD'n ansluten etc etc.
Använder du microcode eller picbasic pro vid programmering?
Ser rimligt ut,får ta en prog o se vad som sker:)
Tackar!
Postat: 4 september 2008, 21:17:47
av H.O
Använder du microcode eller picbasic pro vid programmering?
Öhh, både och... (Missförstod jag frågan?)
MicroCodeStudio är "bara" en editor, precis som Notepad fast med lite lull-lull (rätt mycket bra-att-ha lull-lull iofs). PicBasicPro är kompilatorn som kompilerar det du skriver i MCS till en ASM-fil som sedan assembleras till hex-kod av anting PM eller MPASM. Den .hex-filen programeras sedan in i PICen med valfri programerare.
Jag använder vanligtvis en PIC med MCS's bootloader laddad. Om inte så "flashar" jag med min PicStartPlus.
Postat: 4 september 2008, 23:20:54
av Patrick
Det där med bootloader,vad är det?
Jag vet att picbasic pro är kompen o resten är som notepad.
Hur kan : W1 = W1 << 5 bli gånger 32?

Postat: 4 september 2008, 23:38:27
av eqlazer
Tänk binärt. Gångra med två görs enkelt med att skifta alla bitar ett steg åt vänster. Sedan är det bara att fortsätta så.
Postat: 4 september 2008, 23:41:22
av bearing
För att fullt kunna förstå det behöver du lära dig det binära talsystemet. Det enkla svaret är att det betyder W1 = W1 * 2^5.
Kod: Markera allt
Operatorn << kallas "leftshift" och används för att flytta variabelns bitar åt vänster det
antal steg som angivits. Leftshift ett antal steg motsvarar att multiplicera med 2 upphöjt
med antalet steg.
W1 = W1 << 5 betyder alltså:
W1 = W1 * 2^5 vilket förenklat är:
W1 = W1 * 32
Nytt exempel:
a = 5
a = a << 3
Resultatet blir a = 40.
Förklaring:
a = a << 3 flyttar bitarna tre steg åt vänster vilket är som att multiplicera
med 2^3 = 8. 5 * 8 = 40.
Binärt uttryckt är fem 00000101.
Steg för steg sker följande:
Binärt Decimalt Antal steg
00000101 5
00001010 10 1
00010100 20 2
00101000 40 3
En "Bootloader" är ett litet program som körs på microcontrollern i syfte att kunna kopiera in huvudprogrammet på ett praktiskt enklare sätt än via programmeringsenhet.