Hjälp att skapa en flödesmätare
-
- Inlägg: 67
- Blev medlem: 10 juli 2008, 15:47:06
- Ort: stockholm
- Kontakt:
Hjälp att skapa en flödesmätare
Jag har plockat upp min gamla lärobok i mikrodatorteknik och försöker lära mig assembler igen. Anledningen är att jag vill skapa en flödesmätare till min båt som mäter bränsleflödet. Min tanke är följande:
1. En flödesmätare av hall-typ ger en fyrkantsvåg som med en frekvens som är linjär mot flödet. En timer räknar antalet pulser och lagrar i ett register vid interrupt.
2. En annan timer räknar antalet klockpulser och lagrar dessa i ett register vid interrupt.
3. Antalet givarpulser lagrade i registret översätts till annan enhet (typ 1000 pulser = 0.1l)
4. Antalet klockpulser översätts i tidsenhet (typ 1000pulser =1 sek)
5. Givarpulserna divideras med klockpulserna och man får flödet i l/s
Hur skriver man en sådan rutin? Någon som gjort något liknande som vill dela med sig. Hade varitsuperschysst om jag fick något att kika på så jag kan lära mig snabbare.
Tack
Christofer
1. En flödesmätare av hall-typ ger en fyrkantsvåg som med en frekvens som är linjär mot flödet. En timer räknar antalet pulser och lagrar i ett register vid interrupt.
2. En annan timer räknar antalet klockpulser och lagrar dessa i ett register vid interrupt.
3. Antalet givarpulser lagrade i registret översätts till annan enhet (typ 1000 pulser = 0.1l)
4. Antalet klockpulser översätts i tidsenhet (typ 1000pulser =1 sek)
5. Givarpulserna divideras med klockpulserna och man får flödet i l/s
Hur skriver man en sådan rutin? Någon som gjort något liknande som vill dela med sig. Hade varitsuperschysst om jag fick något att kika på så jag kan lära mig snabbare.
Tack
Christofer
-
- Inlägg: 67
- Blev medlem: 10 juli 2008, 15:47:06
- Ort: stockholm
- Kontakt:
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
PIC matterutiner (av varierande kvalitet)
http://www.piclist.com/tecHREF/microchip/math/index.htm
http://www.piclist.com/tecHREF/microchip/math/index.htm
Och AVR datablad finns här http://atmel.com/dyn/products/devices.asp?family_id=607
Har du en Renesas, NXP, whatever så vore det bra om du sa det så man vet.... Eller förresten, skit samma, för det gör jag i denna tråden nu. Gissningslekar har jag inte tid med.
EDIT för att förtydliga:
Vad jag funderar över är framför allt
Räknar timer0,1,2 alltid interna klockpulser default?
Om det är AVR, JA dock med inställbar prescaler
Hur dividerar jag ett register med ett annat?
Använd division om prossesorn har det, har den det?
Vilken display är den absolut enkalst att programmer? en 7-segments?
Har det redan kommit förslag på så det svarar inte jag på
/Christofer
Hade du angett vilken uc du funderar op att använf/använder hade kanske någon haft förslag....
Har du en Renesas, NXP, whatever så vore det bra om du sa det så man vet.... Eller förresten, skit samma, för det gör jag i denna tråden nu. Gissningslekar har jag inte tid med.
EDIT för att förtydliga:
Vad jag funderar över är framför allt
Räknar timer0,1,2 alltid interna klockpulser default?
Om det är AVR, JA dock med inställbar prescaler
Hur dividerar jag ett register med ett annat?
Använd division om prossesorn har det, har den det?
Vilken display är den absolut enkalst att programmer? en 7-segments?
Har det redan kommit förslag på så det svarar inte jag på
/Christofer
Hade du angett vilken uc du funderar op att använf/använder hade kanske någon haft förslag....
-
- Inlägg: 67
- Blev medlem: 10 juli 2008, 15:47:06
- Ort: stockholm
- Kontakt:
Ingen är förpliktigad att svara på ett inlägg så om det skall vara trist attityd så låt bli. Jag är en glad nybörjare som trodde jag hittat ett schysst forum.
Jag vet inget om era förkortningar. Allt jag vet är följande.
Jag är upplärd på Microships produkter och använder MPlab. Processor som jag tänkt använda är 18F452. Språk assembler.
Jag vill veta hur jag räknar givarpulser på en TIMER samtidigt som jag räknar klockpulser. Dessutom måste jag skriva ett interrupt som avbryter räkningen efter en viss tidsenhet låt säga 1sekund.
Jag vet inget om era förkortningar. Allt jag vet är följande.
Jag är upplärd på Microships produkter och använder MPlab. Processor som jag tänkt använda är 18F452. Språk assembler.
Jag vill veta hur jag räknar givarpulser på en TIMER samtidigt som jag räknar klockpulser. Dessutom måste jag skriva ett interrupt som avbryter räkningen efter en viss tidsenhet låt säga 1sekund.
> Räknar timer0,1,2 alltid interna klockpulser default?
Helt ointressant vad den räknar per default!
Ställ in den som du vill ha det enligt databladet.
Lita *aldrig* på defaults, ställ in allt som kan vara
rellevant för din applikation. Om du t.ex ska använda
Timer1, ställ in *allt* som har med Timer1 att göra så
som *du* vill ha det.
Detta är speciellt viktigt om du vill att andra ska titta på din
kod (vilket verkar rimligt här), annars får du en massa frågor
om du har tänkt på det-och-det...
> Hur dividerar jag ett register med ett annat?
Som sagt, www.piclist.com har många exempel.
*MEN*, i många fall när man ställer den frågan så
handlar det mer om att man inte har analyserat sitt
problem tillräckligt. Generellt gäller att undvika divisioner
så mycket det går (undantaget divisioner med 2, 4, 8 o.s.v
vilket är väldigt enkelt att fixa).
Samma sak gäller om man börjar fråga om "floating point", det
är väldigt sällan som det faktiskt behövs. I 99 fall av 100 kan det
hela mycket enklare realiseras via fixed point rutiner.
> Vilken display är den absolut enkalst att programmer? en 7-segments?
Det beror lite på din definition av "enkel".
HD44780 LCD har mycket färdiga exempel och rutiner. T.ex :
http://www.jescab.se/HD44780.html
DLR3416 som nämndes är en liten 4-teckens display. Programexempel finns här:
http://www.jescab.se/DLR3416.html
Och ja, jag har en hel del kvar av dom.
> Jag är upplärd på Microships produkter och använder MPlab.
> Processor som jag tänkt använda är 18F452.
Eftersom du totalt missade att nämnda det i ditt *första* inlägg (personligen
fick jag uppfattningen att du inte visste alls vad du skulle använda),
så får du faktiskt tåla det som du kallar "trist attityd".
> Dessutom måste jag skriva ett interrupt som......
Bara ett litet förtydligande. Man skriver inte interruptet.
Man skriver den kod som ska köras när ett interrupt inträffar.
Denna kod kallas också ISR (Interrupt Service Routine).
Slutligen, eftersom du är "upplärd" med MPLAB och PIC processorer, så
verkar dina frågor lite underliga. Du borde ju redan ha mer "kött på benen"
än vad det låter som.
Men, det är ingen ko på isen, det är bara att tuta på med fler detaljfrågor!
Men dölj inte viktig information, som Björn sa, att gissa har vi inte tid med...
Helt ointressant vad den räknar per default!
Ställ in den som du vill ha det enligt databladet.
Lita *aldrig* på defaults, ställ in allt som kan vara
rellevant för din applikation. Om du t.ex ska använda
Timer1, ställ in *allt* som har med Timer1 att göra så
som *du* vill ha det.
Detta är speciellt viktigt om du vill att andra ska titta på din
kod (vilket verkar rimligt här), annars får du en massa frågor
om du har tänkt på det-och-det...
> Hur dividerar jag ett register med ett annat?
Som sagt, www.piclist.com har många exempel.
*MEN*, i många fall när man ställer den frågan så
handlar det mer om att man inte har analyserat sitt
problem tillräckligt. Generellt gäller att undvika divisioner
så mycket det går (undantaget divisioner med 2, 4, 8 o.s.v
vilket är väldigt enkelt att fixa).
Samma sak gäller om man börjar fråga om "floating point", det
är väldigt sällan som det faktiskt behövs. I 99 fall av 100 kan det
hela mycket enklare realiseras via fixed point rutiner.
> Vilken display är den absolut enkalst att programmer? en 7-segments?
Det beror lite på din definition av "enkel".
HD44780 LCD har mycket färdiga exempel och rutiner. T.ex :
http://www.jescab.se/HD44780.html
DLR3416 som nämndes är en liten 4-teckens display. Programexempel finns här:
http://www.jescab.se/DLR3416.html
Och ja, jag har en hel del kvar av dom.
> Jag är upplärd på Microships produkter och använder MPlab.
> Processor som jag tänkt använda är 18F452.
Eftersom du totalt missade att nämnda det i ditt *första* inlägg (personligen
fick jag uppfattningen att du inte visste alls vad du skulle använda),
så får du faktiskt tåla det som du kallar "trist attityd".
> Dessutom måste jag skriva ett interrupt som......
Bara ett litet förtydligande. Man skriver inte interruptet.
Man skriver den kod som ska köras när ett interrupt inträffar.

Denna kod kallas också ISR (Interrupt Service Routine).
Slutligen, eftersom du är "upplärd" med MPLAB och PIC processorer, så
verkar dina frågor lite underliga. Du borde ju redan ha mer "kött på benen"
än vad det låter som.
Men, det är ingen ko på isen, det är bara att tuta på med fler detaljfrågor!
Men dölj inte viktig information, som Björn sa, att gissa har vi inte tid med...

Tack för att du tog dig tid att svara på vad *du* hade tänkt använda. Givetvis kan ingen tvinga dig till det, men om man vill ha hjälp så är den ininformayionen ett minimum.
Själv hade jag därmed kunnat strunta i denna tråden från början då jag inte använder PIC, och för att hjäpa dig måste jag isåfall kolla databladet först. Och skall jag göra det och lära mig en ny processor så tar jag "tyvärr" mer betalt per timme än om det vore någon processor jag kunde svaren utan till på (läs : AVR)
Dock är jag övertygad om att du kommer få hjälp av en hel del PIC-kunnigt folk
Inte menigen att att vara tyken med "trist attityd" men nu förstår du nog varför jag skrev som jag gjorde.
Lycka till.
Själv hade jag därmed kunnat strunta i denna tråden från början då jag inte använder PIC, och för att hjäpa dig måste jag isåfall kolla databladet först. Och skall jag göra det och lära mig en ny processor så tar jag "tyvärr" mer betalt per timme än om det vore någon processor jag kunde svaren utan till på (läs : AVR)
Dock är jag övertygad om att du kommer få hjälp av en hel del PIC-kunnigt folk
Inte menigen att att vara tyken med "trist attityd" men nu förstår du nog varför jag skrev som jag gjorde.
Lycka till.
christoferivarsson skrev:Ingen är förpliktigad att svara på ett inlägg så om det skall vara trist attityd så låt bli. Jag är en glad nybörjare som trodde jag hittat ett schysst forum.
Jag vet inget om era förkortningar. Allt jag vet är följande.
Jag är upplärd på Microships produkter och använder MPlab. Processor som jag tänkt använda är 18F452. Språk assembler.
Jag vill veta hur jag räknar givarpulser på en TIMER samtidigt som jag räknar klockpulser. Dessutom måste jag skriva ett interrupt som avbryter räkningen efter en viss tidsenhet låt säga 1sekund.
Det finns en massa färdiga exmpel i Microchips application notes. Har du kollat dessa?christoferivarsson skrev:Ingen är förpliktigad att svara på ett inlägg så om det skall vara trist attityd så låt bli. Jag är en glad nybörjare som trodde jag hittat ett schysst forum.
Jag vet inget om era förkortningar. Allt jag vet är följande.
Jag är upplärd på Microships produkter och använder MPlab. Processor som jag tänkt använda är 18F452. Språk assembler.
Jag vill veta hur jag räknar givarpulser på en TIMER samtidigt som jag räknar klockpulser. Dessutom måste jag skriva ett interrupt som avbryter räkningen efter en viss tidsenhet låt säga 1sekund.
- Swech
- EF Sponsor
- Inlägg: 4750
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
Hej Christoffer
Välkommen till forumet.
Du har beskrivit programstrukturen som du vill ha riktigt bra.
Bör inte vara allt för svårt att skriva.
Men.. gör så här istället..
Sätt en timer/counter till att räkna externa pulser från din hallsensor.
Sätt en annan timer till att räkna till 1 sekund. Använd lämplig prescaler.
När denna timer har räknat upp till en sekund så genererar den ett interrupt. Använd Overflow eller Capture/Compare för att få fram 1 sekund.
I detta interrupt läser du av vad din counter har kommit upp till och så
nollställer du countern.
Nu har du ett värde som samlats in på 1 sekund. Ytterligare justering
för presentation kan du göra med lite multiplikation/division. Oftast
går detta att lösa ändå utan mult/div
Lycka till
Swech
Välkommen till forumet.
Du har beskrivit programstrukturen som du vill ha riktigt bra.
Bör inte vara allt för svårt att skriva.
Men.. gör så här istället..
Sätt en timer/counter till att räkna externa pulser från din hallsensor.
Sätt en annan timer till att räkna till 1 sekund. Använd lämplig prescaler.
När denna timer har räknat upp till en sekund så genererar den ett interrupt. Använd Overflow eller Capture/Compare för att få fram 1 sekund.
I detta interrupt läser du av vad din counter har kommit upp till och så
nollställer du countern.
Nu har du ett värde som samlats in på 1 sekund. Ytterligare justering
för presentation kan du göra med lite multiplikation/division. Oftast
går detta att lösa ändå utan mult/div
Lycka till
Swech
-
- Inlägg: 67
- Blev medlem: 10 juli 2008, 15:47:06
- Ort: stockholm
- Kontakt: