Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

Counter
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
rajko
Mojster


Pridružen/-a: Sob Nov 2005 22:23
Prispevkov: 48

PrispevekObjavljeno: Sre Feb 22, 2006 10:24 pm    Naslov sporočila: Counter Odgovori s citatom

V Bascom-u sem izdelal op.p. sprogramiral uro (ure, minute, sekunde).
Sedaj pa mi "ura" prehiteva. Zanima me kako bi "program" nastavil , da bi štel točne sekunde. Delam z Attiny2313, Crystal 8Mhz. Čas prikazujem na LCD-ju.

Waitms 30
Sekunde = Sekunde + 1
If Sekunde > 59 Then
Sekunde = 0
Minute = Minute + 1
End If
If Minute > 59 Then
Minute = 0
Ure = Ure + 1
End If
If Ure > 23 Then Ure = 0

Če kdo ve odgovor?
Hvala!!!
Embarassed
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Gustav
Profesionalec


Pridružen/-a: Pon Jun 2005 17:19
Prispevkov: 768

PrispevekObjavljeno: Čet Feb 23, 2006 10:12 am    Naslov sporočila: Odgovori s citatom

Bascoma ne poznam, zato splosna resitev (itak tukaj ni kaj posebnega za "izumiti"):

Najprej nastavi timer interrupt na neko doloceno vrednost; najbolje tako, da bo njen veckratnik najmanjsa enota, ki jo tvoja ura meri (recimo stotinka sekunde ali kaj podobnega). Vrednost izracunas po formulah iz datasheeta, najbrz bi to frekvenca oscilatorja deljeno z neko vrednostjoDotcnemu timerju omogoci interrupt, v interrupt rutino pa dodaj kodo, ki bo naredila naslednje:
- poskrbela za ponovno nastavitev timerja (vkolikor ne bos uporabil autoreloada)
- pristela 1 stevcu najmanjsih casovnih enot (recimo stotink)
- primerjala vrednost stevca z mejno vrednostjo (100) in povecala sekunde, ko pride do mejne vrednosti, ter spet nastavila ta stevec na 0
- primerjala sekunde z mejno vrednostjo in ustrezno povecala minute
- isto za ure

Tako lahko program pocne v glavni zanki karkoli pac hoce in mu ostane za delo vecina ciklov, ura pa ne more prehitevati ali zaostajati (v merah natancnosti oscilatorja, ki je ponavadi pod 50 ppm), ce pravilno nastavis.

Cakalne zanke (kot je waitms) so prvic grozljivo neucinkovite (pokurijo vse vmesne cikle) in drugic bodo tezko enako natancne kot zgoraj opisana metoda, saj najprej cakas dolocen cas (recimo 999 milisekund), potem opa moras izvesti se nekaj matematike, skupni cas pa bo se vedno nekoliko manj kot 1000 milisekund (= 1 sekunda) in ura bo tako nenatancna.

Ce naj bi waitms 30 pocakal 30 milisekund, potem je precej jasno zakaj tvoja ura deluje *zelo* nenatancno (zgoraj opisani problem s cakanjem je bistveno bolj natancen, a se vedno ne toliko, kot bi lahko bil, neucinkovito programiranje z zavestno vkljucenimi napakami pa je slaba razvada, ki jo mocno odsvetujem).
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Čet Feb 23, 2006 10:39 am    Naslov sporočila: V Bascomu8051 bi to šlo tako: Odgovori s citatom

V Bascomu8051 bi to šlo tako:

Koda:
'    //////////////////TIMER0 ////////////////

' Če je frekvenca kristala f je timerenota 12/f
' Do prekinitve pride po
'      1 timerenot   krat vrednost load pri mode je  2
'     32 timerenot   krat vrednost load pri mode je  0
'    256 timerenot   krat vrednost load pri mode je  1
'
' Če imaš recimo kristal frekvence 11059200 potem boš z
'  11059200 / 12 / 256 = 3600  (Mode = 1)
'  3600 = 36 * 100
'  in z Load Timer0 36
'  dobil točno 100 prekinitev na sekundo. Pri vsaki prekinitvi se bo aktiviral
'  podprogram Timer0isr ki ne počne drugega, kot porine nek Tištevec za ena naprej
'  V glavnem programu pa samo nadziraš, kdaj števec preide preko 100:

Config Timer0 = Timer , Gate = Internal , Mode = 1
On Timer0 Timer0isr Nosave
Load Timer0 36
Start Timer0
Enable Timer0
Enable Interrupts

Dim Tistevec As Byte
Dim Seconds As Byte
Dim Minutes As Byte
Dim Hours As Byte
Dim Days As Byte


'    ////////////////ZANKA GLAVNEGA PROGRAMA ////////////////////////
Do
If tistevec => 100
   tistevec = tistevec - 100
   Incr Seconds
   If Seconds >= 60 Then
     Seconds = Seconds - 60
     Incr Minutes
     If Minutes >= 60 Then
        Minutes = Minutes - 60
        Incr Hours     
     End If
  End If
End If
'..Tukaj programiramo vse, kar se mora kar naprej odvijati v zanki
.............................
Loop


'---------timer0 interrupt subroutine takes control every 10 msec
Timer0isr:
Load Timer0 , 36
Incr Tistevec
Return

_________________
Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih.


Nazadnje urejal/a vilko Čet Feb 23, 2006 2:25 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2061
Kraj: Ljubljana

PrispevekObjavljeno: Čet Feb 23, 2006 12:21 pm    Naslov sporočila: Odgovori s citatom

Rajko,

kako si pa nastavil prekinitev v timerju?

Nastavitve timerjev pri AVRju so drugačne kot pri 8051 družini

Lp
Jure
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Čet Feb 23, 2006 2:15 pm    Naslov sporočila: Haj, Jure! Odgovori s citatom

Haj, Jure!

Prevedi moj program v AVR, se bom še jaz kaj naučil! Večkrat sem slišal, da je prehod iz Bascom-a 8051 v Bascom AVR mačji kašelj, jaz pa vem, da hudič tiči v detajlih!

Vilko

_________________
Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
rajko
Mojster


Pridružen/-a: Sob Nov 2005 22:23
Prispevkov: 48

PrispevekObjavljeno: Pet Feb 24, 2006 8:36 pm    Naslov sporočila: Odgovori s citatom

Vsem trem hvala za odgovore. Sicer ure nisem izdelal z timerjem in interruptom, niti nisem definiral counterja. Ravno zato pa me zanima točnost merjenja časa. Kajti z timer ali counter lahko čas nastavim zelo natančno, zanima me kako pa je brez teh rutin. Seveda se popolnoma strinjam z gospodom Gustavom, da je najbolje uro nastaviti v timerju, ker je najbolj natančna, toda kako mikrokontroler ve da merim čas, če mu pa tega niti nisem "povedal". Zanimivo pa tudi postane ko mu waitms povečam na 50 takrat namreč po določenem času enostavno odpove (na displej izpiše nekaj "po svoje") in se enostavno resetira. Zakaj?
V Dim Sekunde As Byte, sem mu razložil kaj so Sekunde v zanki pa sem ga hotel prepričati naj po 30 ms poveća te Sekunde za 1.
Sekunde=Sekunde + 1
itd...
Zakaj se "gospod" mikrokontroler po 50 ms resetira?
Hvala za odgovore ... če jih kdo ve?
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Pet Feb 24, 2006 9:00 pm    Naslov sporočila: Je že tako, Odgovori s citatom

Je že tako, da mikroprocesor običajno naredi natančno tisto, kar mu naročimo in nič več in nič manj. Je pa res, da nas pogosto 'ne razume' pravilno :)
Kaj je s tvojim programom narobe, bi morda lahko ugotovil, če bi videl celoten program. To kar si dal na forum, je le del programa, razlog, da se 'resetira', pa je lahko kjerkoli.

Čas, potreben, da se odvije neka zanka v programu, je odvisen od frekvence kristala in instrukcij, ki so v zanki. Za vsako (assemblersko) istrukcijo se točno ve, koliko nihajev kristala je potrebno, da mikroprocesor izvrši instrukcijo. Pri Bascomu se tega ne ve natančno, če programa ne, potem ko je preveden, analiziramo in predelamo v assemblersko obliko.
Če torej ne poznamo assemblerja, a se nam zanka odvija prehitro, jo lahko dodatno 'obtežimo' z nepotrebnimi instrukcijami, ki mikroprocesorju za izvajanje vzamejo čas. Točno to naredi bascomov wait ali waitms ukaz, a le približno. Če napišeš waitms 30, bo bascom generiral zanko odvečnih instrukcij, kar bo porabilo cca 30 ms časa.

Za natančno merjenje časa je veliko bolj prikladno uporabiti timer0 interrupt, ker potem to štetje počne mikroprocesor sam natančno toliko, kot programiramo in to mimogrede, ko glavni program opravlja kako drugo bolj važno delo, kot je recimo nadzor senzorjev, ali kaj drugega.

Na žalost ne poznam AVR interne konstrukcije in ti ne znam povedati, kako nastaviti timer v AVR mikroprocesorjih. Vendar pricip bo gotovo isti: na nek način določiš faktor, v katerih večjih enotah naj šteje čas (to naredi pri 8051 MODE parameter) in potem še poveč, koliko takšnih enot naj našteje, predno izvede prekinitev dela glavne programske zanke. To se v 8051 Bascomu naredil z ukazom Load TImer

Upam, da ti bo kak AVR mojster priskočil na pomoč.

_________________
Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
rajko
Mojster


Pridružen/-a: Sob Nov 2005 22:23
Prispevkov: 48

PrispevekObjavljeno: Pet Feb 24, 2006 9:25 pm    Naslov sporočila: Odgovori s citatom

Hvala Vilko
Tule je cela koda.

$regfile = "attiny2313.dat"
$crystal = 8000000

Config Portd = Input
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.1
Cls
Cursor Off

Dim Ure As Byte , Minute As Byte , Sekunde As Byte
Cls


Ura:

Locate 1 , 1
Lcd "Tocen cas je :"

Locate 2 , 1
If Ure < 10 Then
Lcd "0" ; Ure
Else
Lcd Ure
End If

Lcd ":"
If Minute < 10 Then
Lcd "0" ; Minute
Else
Lcd Minute
End If

Lcd ":"
If Sekunde < 10 Then
Lcd "0" ; Sekunde
Else
Lcd Sekunde
End If

Waitms 35
Sekunde = Sekunde + 1
If Sekunde > 59 Then
Sekunde = 0
Minute = Minute + 1
End If
If Minute > 59 Then
Minute = 0
Ure = Ure + 1
End If
If Ure > 23 Then Ure = 0
If Pind.6 = 1 Then Incr Ure
If Pind.5 = 1 Then Incr Minute
Goto Ura

End

Zakaj se po 50 ms mikrokontroler resetira?
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Sob Feb 25, 2006 11:39 am    Naslov sporočila: V bascomu 8051 bi to bilo narobe. Odgovori s citatom

ne vem, kako gre v bascomu AVR, a v Bascomu 8051 bi

to
Koda:
If Ure > 23 Then Ure = 0
If Pind.6 = 1 Then Incr Ure
If Pind.5 = 1 Then Incr Minute

bilo narobe in bi moralo biti napisano tako:
Koda:
If Ure > 23 Then : Ure = 0 : endif
If Pind.6 = 1 Then : Incr Ure : endif
If Pind.5 = 1 Then : Incr Minute : endif

Vendar bi me bascom8051 opozoril, da gre za napako. Ali lahko ugibam, da tebi BASCOM AVR ni protestiral?


Kaj pa so Pind.5 in pind.6? Ugibam, da so to portpini, na katerih visita tipki. Ali ni potrebno te portpine definirati input ali output?
Kot rečeno, ni pametno od mene, da sem se dal speljati na tanek led, se pravi na BASCOM AVR, ki o njem nimam pojma, pa sedaj drugim solim pamet.

Pozdrav

_________________
Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
rajko
Mojster


Pridružen/-a: Sob Nov 2005 22:23
Prispevkov: 48

PrispevekObjavljeno: Sob Feb 25, 2006 3:33 pm    Naslov sporočila: Odgovori s citatom

Vilko poskusil sem s tvojim predlogom spremembe kode in sedaj deluje. Program se ne resetira več tudi po daljših waitms. Vidim pa tudi da lahko 8051 in AVR med samo menjam seveda pod določenimi pogoji.
Hvala za pomoč!
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Gustav
Profesionalec


Pridružen/-a: Pon Jun 2005 17:19
Prispevkov: 768

PrispevekObjavljeno: Sob Feb 25, 2006 5:04 pm    Naslov sporočila: Odgovori s citatom

Rajko: boljse bi bilo reci da lahko sintakso Bascom za 8051 in Bascom za AVR med seboj menjas - mikrokontrolerja namrec na najnizjem nivoju delujeta in izgledata s stalisca programerja precej drugace, kar pa visjenivojski jezik (kar basic je) dobro zakrije. Podobnost je torej zgolj v sintaksi jezika, ki je od arhitekture neodvisen (z znanjem Bascoma bi lahko pisal povsem funkcionalne programcke v npr. basicu za PC).

Toliko v izogib morebitnim nesporazumom, da ne bos ves navdusen nabavil kaksnih (sploh Atmelovih ali originalnih Intelovih) predstavnikov druzine x51, od njih pricakoval podobne lastnosti kot od AVRjev (interni oscilator, enako delovanje izhodov, itd.) in bil potem neprijetno presenecen Wink
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2061
Kraj: Ljubljana

PrispevekObjavljeno: Sob Feb 25, 2006 5:38 pm    Naslov sporočila: Odgovori s citatom

Hojla,

čudi me, da program dela, če nisi definiral timerjev. Jaz sem naredil takole:

najprej definiram preskaler:

On Ovf0 Tim0_isr
Config Timer0 = Timer , Prescale = 1
Enable Timer0 ' enable the timer
Enable Interrupts

nato prekinitvena rutina:

Tim0_isr:
Incr Clock12
If Clock12 > 46874 Then
Clock12 = 0
P16 = Not P16 'sekundni impulz
P17 = Not P17 'pomozna indikacija sekund
End If

Return

Vilko, pri prevodu 8051 v AVR je treba upoštevati drugačne nastavitve timerja, kot vidiš je za genecijo 1 sekunde neka "čudna" številka, ki pa se jo dobi iz data sheet-a AVR-ja, ko pogledaš notranjo strukturo AVR-ja. Potem, ko poznaš ta podatek so vsi ostali izračuni samo še enostavno računstvo.

Lp
Jure
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
rajko
Mojster


Pridružen/-a: Sob Nov 2005 22:23
Prispevkov: 48

PrispevekObjavljeno: Sob Feb 25, 2006 6:27 pm    Naslov sporočila: Odgovori s citatom

LP!

Jure program dela brez definiranja timerjev in z popravkom programa, ki ga je predlagal Vilko. Tako, da je potrebno samo še najti pravi waitms in ura bo točna. Zakaj program dela brez timerjev tudi meni ni jasno, toda dela. Res pa je, da bi takšen program težko uporabil tudi ob krmiljenju več portov saj wait rutina to precej otežkoča. Je pa program zanimiv glede na to da nima nikjer definiranega counterja ali timerja, pa vseeno deluje. Žal pa se moje "znanje" zakaj je temu tako tukaj konča. Bilo pa bi zanimivo če bi znal kdo to pojasniti.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Sob Feb 25, 2006 6:56 pm    Naslov sporočila: Program dela, a ura ne teče točno. Odgovori s citatom

Program dela, a ura ne teče točno, kaj ne?

To je zato, ker se program pač odvija v zanki in zanka periodično poriva sekunde, minute, ure naprej, le da to dela prehitro. Jure pač zakasnitev naredi z waitms, ki jo bo sedaj uglaševal toliko časa, da bo ura tekla približno točno. Za pravo uro to ne bo dovolj dobro. To uro ne boš mogel umeriti niti toliko natančno, kot so stari urarji nastavili ure na nihala. Vsaj mislim, da bo tako, lahko da se motim.
Veliko veselja in uspeha!

_________________
Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2061
Kraj: Ljubljana

PrispevekObjavljeno: Sob Feb 25, 2006 9:35 pm    Naslov sporočila: Odgovori s citatom

Rajko,

Vilko ima prav - slučajno so tisti waitms ravno tako razporejeni v zanki, da izgleda, da vse lepo teče. Če pa zdaj tej "uri" dodaš recimo ukaza za tipke (z Debounce ukazom, s katerim boš nastavljal čas), boš hitro ugotovil, da ura teče drugače, če pritiskaš tipke. Če pa ji dodaš neki daljši proces - recimo pisane/branje v EEPROM, računanje logaritma itd, bo ura tekla katastrofalno.

Pravilen način je uporaba timerja, ki generira zelo natančen signal. Ker predvidevam, da si začetnik ti svetujem, da se rajši držiš ustaljenih metod programiranja, saj lahko takšna napaka v timingu - zelo pretiravano - nekomu odreže prste... In verjetno bo v tem primeru nesrečni lastnik brezprste roke s pomočjo sodišč iskal programerja...

Lp
Jure
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group