Hjälp med beräkningar i microcode studio

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Patrick
Inlägg: 376
Blev medlem: 9 december 2007, 19:13:01
Ort: Uppsala
Kontakt:

Hjälp med beräkningar i microcode studio

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
Patrick
Inlägg: 376
Blev medlem: 9 december 2007, 19:13:01
Ort: Uppsala
Kontakt:

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
Patrick
Inlägg: 376
Blev medlem: 9 december 2007, 19:13:01
Ort: Uppsala
Kontakt:

Inlägg av Patrick »

Absolut!
Ska få hem lite saker till allt,såsom kretskort,display osv så:)
Användarvisningsbild
Patrick
Inlägg: 376
Blev medlem: 9 december 2007, 19:13:01
Ort: Uppsala
Kontakt:

Inlägg 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!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
H.O
Inlägg: 5919
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
Användarvisningsbild
Patrick
Inlägg: 376
Blev medlem: 9 december 2007, 19:13:01
Ort: Uppsala
Kontakt:

Inlägg 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 :shock: hehe
Användarvisningsbild
Patrick
Inlägg: 376
Blev medlem: 9 december 2007, 19:13:01
Ort: Uppsala
Kontakt:

Inlägg 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!
H.O
Inlägg: 5919
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Inlägg 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.
Användarvisningsbild
Patrick
Inlägg: 376
Blev medlem: 9 december 2007, 19:13:01
Ort: Uppsala
Kontakt:

Inlägg 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? :shock:
eqlazer
Inlägg: 923
Blev medlem: 22 september 2007, 13:53:45
Ort: Göteborg

Inlägg 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å.
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg 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.
Skriv svar