Hej jag håller på att bygga en sak som jag tyvärr inte kan säga vad än så länge. Det jag skall göra iallafall är att tända en LED när ett föremål ligger framför en ultraljuds modul. Den modulen jag tänkt att använda heter PING))) och här är databladet: http://www.parallax.com/dl/docs/prod/acc/PingDocs.pdf På sidan 2 visar de hur pulsen ser ut. Altså vill jag mäta tiden på den andra pulsen som beror på hur nära ett föremål ligger. Då undrar jag heltenkelt hur gör man detta i Mikrobasic?
Här är min kod som jag skrivt hitils. Jag vill ha lite kommentarer på den. Jag har nämligen inte kodat speciellt mycket tidigare för PIC bara lite blinkande lysdioder etc. Förövrigt så vill jag bara säga det att jag har inte själva modulen än så ingenting är testat.
Program dsi
dim count as byte
main:
TRISA = $ff 'PORTA är ingångar
TRISB = $00 'PORTB är utgångar
if PORTA = %00000001 then
delay_us(750) 'väntar för signalen som bestämmer avståndet skall komma.
while PORTA = $00 then
'här skall det räknas hur länge PORTA.0 är 1'a
if count > x AND count < y then ' kollar ifall count passar in, byt ut x och y emot funktions dugliga tal.
PORTB = %00000001 'tänd LED_1
goto main
else
PORTB = %00000000 ' Om inte count är inom rätt värden så tänds inte LED_1
goto main
end if
wend
else
PORTB = %00000100 'tänd varningslampa_1
end if
end.
Våga lita på ett delaykommando i Basic..... Ett så här enkelt projekt bör du köra i assambler, vill du inte det så använd iaf timer. Nolla timern på sändpulsen - läs på databladet om det är på stigande eller fallande flank du skall börja räkna. Sen har du två alternativ:
-Nolla om timern efter den fasta delayen för att utnytja upplösningen max, och efter timerinteruptet (eller delayloop om du nu hellre vill göra så) slå på "interupt on change" på vald ingångspinne - plocka ner timervärdet i interupten och bearbeta det. Ta hänsyn till antalet klockcykler det tar att plocka timervärdet eller om du vill strunta i det - med rätt vald prescaler/klockfrekvens(LP osc ä inte så lämpligt...) så bör det fusket drunkna i det faktiska jitter/brus du ändå har ifrån modulen. Se till att rutinen hanterar även timeout så att programmet inte buggar om du inte får något eko
-Fullösningen. Loop-polla vald pinne, vid eko - läs av timer, räkna av modelens fasta delay och presentera avståndet. Inte så ellegant, men kommer att fungera - i asm iaf... Troligen är looptiden för lång i basic för rimlig noggranhet, men det finns kanske något användbart pulsin kommando som har en riktig och snabb rutin som mäter pulser skapligt
EDIT:
ja, du skriver inte vad du använder för uC. Föreslagen lösning fungerar även på de enklare som 12F6XX vilka saknar CCP, men visst ja - SODJAN förslag fungerar även för dem, skall ju gå köra timertrigg även på dessa, men har för mig att det bara är ett ben som går använda till trigg-gate.
ok, då ändrar jag till timers då. Och för att svara på din fråga Bengt -re så använder jag mig utav en PIC16F628A och i databladet står det att den har CCP
//Kalf
EDIT: Jag har inte tid att sätt mig in i assembler. Så därför vill jag fortsätta koda i basic, ifall det går? Annars så måste jag väll lära mig det.
Nog går det få till i Basic också, det tvivlar jag inte egentligen på, men det blir bättre med assambler. 16F628 är ett bra val då den är billiga, lagom liten och har många bra godsaker. Som sagt, gör som du vill, det går lösa i basic om du vill och troligen går det fortare än lyckas med samma sak i assambler - första gången iaf. Skall du fortsätta med att gör avancerade och optimerade program så kommer du ändå behöva att lära dig assambler senare och isf så är det lika bra att börja nu.
Skall du bara göra detta, så tja - kanske är det inte lönt tiden att lära sig.
Bengt-re > Skall du bara göra detta, så tja - kanske är det inte lönt tiden att lära sig.
Bara och bara. Jag kommer säkerligen att göra mer, men eftersom att jag kommer att läsa kursen "mikroprocessorer" nästa år i skolan så kommer jag då att lära mig assambler så i framtiden kommer jag ändå säkerligen använda det eller C. Men saken är den att i skolan nu så håller vi på med vad som heter ungföretagsamhet och det betyder att jag och ett par kompisar har ett företag tillsammans, med allt vad det innebär. Eftersom min skola är tekniskt inriktad och ägs delvis utav Volvo så skall produkten som vi skall göra/sälja vara fordonsinriktad. Men mer exakt vad det är för produkt kan jag tyvärr inte säga. Men i december så skall vi presentera en prototyp utav vår produkt. Pga den tidspress som finns så tycker jag inte att det skulle vara nödvändigt att lära mig ett nytt språk om jag inte måste. Speciellt inte ett språk som Assambler som jag inte hittat någon bra bok eller websida där man lär sig det.
Sen får man läsa så mycket kod som man kan komma över...
Alltså, Basicen är bara till för prototypen, eller hur ?
Det är inte säkert att MikroBasic går igenom Volvos kvalitetskontrol.
Men för en prototyp ("proof of concept"), är det kanske OK.
Inte behöver man någon dyr bok för att lära sig assambler. Jag har lärt mig det jag kan genom datablad/fråga folk som har erfarenhet/titta på freewarekod för att se hur andra har tänkt. Kanske går det lättare med något dedicerat utbildningspaket, men faktum är att MPASM, kodsnuttar ifrån nätet och datablad är tillräckligt bra lärare.
Den skall inte testas utav volvo. Det är så att min skola ägs utav volvo men inte mitt företag. Men visst har vi bra kontakter innom volvo. Eftersom vi skall avveckla företaget i maj så tvivlar jag på att vi kommer att komma så mycket längre än till prototyp stadiet. Men det vet man aldrig.
Jag tror att jag kommer att göra, åtminstånde prototypen, i basic så får vi se hur det går sedan.