Pozdrav!
Pisem neki program u BASCOM-AVR-u pa me interesuje kako izvesti funkciju vremenske zadrske ali tako da se vreme zadrske menja u toku programa? To vreme je u stvari sirina bita u serijskoj komunikaciji koja se menja pod uticajem temperature i potrebno ga je stalno korigovati.
BASCOM: Promenljiva vremenska zadrska
Moderators: pedja089, stojke369, trax, InTheStillOfTheNight
Re: BASCOM: Promenljiva vremenska zadrska
Ne razumijem tu "serijsku komunikaciju", Je li to PWM ili neka standardna serijska komunikacija. Ni linije koda nisi stavio u post, teško možemo pomoći ovako ad-hoc. Napiši što ti točno treba, ako je širina impulsa u pitanju (PWM), onda napiši granice u kojima se kreće, minimalna širina - max. širina, pauza fiksna ili se i ona mijenja. Ili je u pitanju nešto kao RS232?
Malo više detalja!
Malo više detalja!
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
Re: BASCOM: Promenljiva vremenska zadrska
Evo ovako,
Problem sam resio. Radi se o anemometru TX23. Posto uredjaj stoji napolju sirina bita se menja znacajno sa promenom temperature. Komunikacija sa njim je takva da postoji samo data linija pa je treba precizno semplovati kako se ne bi prslo na sledeci bit. Prilozio sam sliku ali se lose vidi. U prvom je kanalu DATA a u drugom sam ja generisao impulse da bih video kako "gadja" bitove.
Problem je sto senzor zna ponekad da se zaglupi i ako se koristi BITWAIT komanda program upada u beskonacnu petlju. Resenje je ovakvo:
For Z = 0 To 1000
Waitus 2
If Tx23_data = 1 Then 'bitwait tx23_data, set
Exit For
End If
If Z = 500 Then
Marker = 1
End If
Next Z
to je kod kada se ceka da se bit setuje. Slican je kada se ceka reset. Fleg MARKER sluzi kao pokazatelj neregularnog izlaska iz petlje.
A evo kako sam odredio sirinu jednog bita: Na pocetku svakog niza podataka nalazi se header "11011". Sirina bita je polovina prvog impulsa.
Vreme_impulsa1 = 0
Vreme_impulsa2 = 0
Timer1 = 0 'pokrece tajmer za merenje vremena
Start Timer1
For Z = 0 To 1000
Waitus 2
If Tx23_data = 1 Then 'bitwait tx23_data, set
Exit For
End If
If Z = 500 Then
End If
Next Z
Vreme_impulsa1 = Timer1
Waitus 240
For Z = 0 To 2000
Waitus 2
If Tx23_data = 0 Then 'bitwait tx23_data, reset
Exit For
End If
If Z = 1000 Then
End If
Next Z
Vreme_impulsa2 = Timer1
Stop Timer1
W = Vreme_impulsa2 - Vreme_impulsa1
W = W / 80
W = W - 2 'Dodatna korekcija da bi vrednost bila sto tacnija
Sub Cekam: 'Ovaj podprogram daje zadrsku od 2,5us
For G = 1 To W
Next G
End Sub
Problem sam resio. Radi se o anemometru TX23. Posto uredjaj stoji napolju sirina bita se menja znacajno sa promenom temperature. Komunikacija sa njim je takva da postoji samo data linija pa je treba precizno semplovati kako se ne bi prslo na sledeci bit. Prilozio sam sliku ali se lose vidi. U prvom je kanalu DATA a u drugom sam ja generisao impulse da bih video kako "gadja" bitove.
Problem je sto senzor zna ponekad da se zaglupi i ako se koristi BITWAIT komanda program upada u beskonacnu petlju. Resenje je ovakvo:
For Z = 0 To 1000
Waitus 2
If Tx23_data = 1 Then 'bitwait tx23_data, set
Exit For
End If
If Z = 500 Then
Marker = 1
End If
Next Z
to je kod kada se ceka da se bit setuje. Slican je kada se ceka reset. Fleg MARKER sluzi kao pokazatelj neregularnog izlaska iz petlje.
A evo kako sam odredio sirinu jednog bita: Na pocetku svakog niza podataka nalazi se header "11011". Sirina bita je polovina prvog impulsa.
Vreme_impulsa1 = 0
Vreme_impulsa2 = 0
Timer1 = 0 'pokrece tajmer za merenje vremena
Start Timer1
For Z = 0 To 1000
Waitus 2
If Tx23_data = 1 Then 'bitwait tx23_data, set
Exit For
End If
If Z = 500 Then
End If
Next Z
Vreme_impulsa1 = Timer1
Waitus 240
For Z = 0 To 2000
Waitus 2
If Tx23_data = 0 Then 'bitwait tx23_data, reset
Exit For
End If
If Z = 1000 Then
End If
Next Z
Vreme_impulsa2 = Timer1
Stop Timer1
W = Vreme_impulsa2 - Vreme_impulsa1
W = W / 80
W = W - 2 'Dodatna korekcija da bi vrednost bila sto tacnija
Sub Cekam: 'Ovaj podprogram daje zadrsku od 2,5us
For G = 1 To W
Next G
End Sub
- Attachments
-
- screenshot2_resize.jpg (7.34 KiB) Viewed 5282 times
Re: BASCOM: Promenljiva vremenska zadrska
Nisam zagledao tvoj program puno, ali na googlu caskom nasao ovo
https://www.john.geek.nz/2012/08/la-cro ... #more-2271
Ako je to tacno, polje D je uvek 11011. Jednostavno izmeri koliko dugo traju ove 2 jedinice, podeli to vreme na 2, i dobio si tacno vreme koliko traje jedan bit. Sacekaj da pin opet bude 1, i posle 2,5 xvreme bita imas prvi validan bit, i to je to...
Ako mislis da ne mozes napisati program da je dovoljno brz da to uradi sve u hodu, pozovi uredjaj jednom, izmeri koliko su trajala ta 2 bita u polju D, zatim izracunaj sve potrebne pauze itd, i pokreni merenje drugi put. I to je to, bez puno komplikacije...
https://www.john.geek.nz/2012/08/la-cro ... #more-2271
Ako je to tacno, polje D je uvek 11011. Jednostavno izmeri koliko dugo traju ove 2 jedinice, podeli to vreme na 2, i dobio si tacno vreme koliko traje jedan bit. Sacekaj da pin opet bude 1, i posle 2,5 xvreme bita imas prvi validan bit, i to je to...
Ako mislis da ne mozes napisati program da je dovoljno brz da to uradi sve u hodu, pozovi uredjaj jednom, izmeri koliko su trajala ta 2 bita u polju D, zatim izracunaj sve potrebne pauze itd, i pokreni merenje drugi put. I to je to, bez puno komplikacije...
Re: BASCOM: Promenljiva vremenska zadrska
Da, sve sam to opisao u prethodnom postu.