www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

štoparica z at89c2051 bascom
Pojdi na stran Prejšnja  1, 2
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 25.15

PrispevekObjavljeno: Pon Nov 12, 2007 4:55 pm    Naslov sporočila:  Re: No Odgovori s citatom

vilko je napisal/a:
Zamudo, res majhno zamudo povzroči poraba mikrosekund za prekinitev glavnega programa in nalaganje nove vrednosti v timer, po moji oceni bi moralo biti to manj kot 10 usec na interrupt, interupt pa pride na 10 000 usec = 10 msec


Stoparico z MCUjem se da narediti tudi brez softverskih napak, torej tako, da je napaka samo zaradi odklona frekvence oscilatorja od specificirane.

Nekateri MCUji (med njimi so x51, torej tudi 89C2051) imajo "autoreload" nacin delovanja timerja, kjer vrednosti ni potrebno ponovno naloziti, ker to naredi MCU sam. Ce je en impulz timerja ena mikrosekunda in nastavis autoreload na 250, potem moras v prekinitvi vsakic, ko do nje pride, povecati en stevec, ko je ta stevec na 4, pa ga spravis nazaj na 0 in povecas stevilo pretecenih milisekund ... in tako v neskoncnod tecejo z vidika softvera povsem natancno izmerejne milisekunde Smile

Drugi MCUji, ki autoreload nacina ne poznajo, kljub temu lahko delujejo kot stoparica na podoben nacin, le da je potrebna manipulacija timerja v rutini od interrupta. Npr. ce bi zelel doseci isto na PICu s timerjem 0, bi moral timerju ob vsakem interruptu pristeti neko vrednost, ki je odvisna od tega na koliko ciklov naj se dejansko interrupt sprozi, tako da se vedno pretece recimo 250 mikrosekund oz. ciklov med dvema sprozitvama interrupta. Upostevati je potrebno tudi morebiten zamik pri delovanju (timer 0 pri PICih ima 2 cikla zamika).

Ce bi pri PICih to naredil na napacen nacin - torej da bi vpisal vrednost v register timerja, namesto da jo pristejes - bi stoparica imela nekaj napake, ker bi obcasno pretekel en cikel vec, da pride do interrupta (odvisno od ukaza, ki se izvaja v trenutku interrupta, torej ali gre za ukaz dolzine 1 ali 2 ciklov). Ce naredis pravilno, je to enako kot pri x51.

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
drax
Neznanec
Neznanec



Pridružen-a: Čet 27 Sep 2007 10:49
Prispevkov: 5
Aktiv.: 0.02

PrispevekObjavljeno: Pon Nov 12, 2007 10:35 pm    Naslov sporočila:   Odgovori s citatom

$crystal = 11059200
Config Lcd = 16*2
Config Timer0 = Timer , Gate = Internal , Mode = 1

Load Timer0 , 36
Start Timer0
Enable Timer0
Enable Interrupts

Goto Preskok1:

Dim Stotinke As Byte
Load Timer0 , 36
Incr Stotinke
Return

Preskok1:

Do
dim sekunde as byte
dim minute as byte
dim ure as byte

If Stotinke > 99 Then
Stotinke = Stotinke - 100
Incr Sekunde
If Sekunde > 59 Then
Sekunde = Sekunde - 60
Incr Minute
If Minute > 59 Then
Minute = Minute - 60
Incr Ure
End If
End If
End If

upperline
Lcd Ure ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Stotinke ; ":"



Tstart Alias P3.3 'tipka TP1 start
Tstop Alias P3.2 'tipka TP2 stop
Treset Alias P3.0 'tipka TP3 reset

Debounce Tstart , 0 , Zacni , Sub
Debounce Tstop , 0 , Prenehaj , Sub
Debounce Treset , 0 , Resetiraj , Sub

Loop

Zacni:
Start Timer0
Return
Prenehaj:
Stop Timer0
Return
Resetiraj:
Ure = 0 : Minute = 0 : Sekunde = 0 : Stotinke = 0
Lowerline
Lcd Ure ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Stotinke ; ":"
Return


Vilko hvala za tako obsežen odgovor!

Imam pa še eno vprašanje oz. dva: mora tipka za start biti vedno pritisnjena med štetjem ali je dovolj impulzno (rec 1s)? in drugo, če se čas med merjenjem prikazuje na lcd ali se samo na koncu meritve?

hvala za tako podrobno razlago delovanja meritve.....
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lado
Član
Član



Pridružen-a: Pon 09 Feb 2004 13:22
Prispevkov: 987
Aktiv.: 4.44
Kraj: Trbovlje

PrispevekObjavljeno: Pon Nov 12, 2007 11:11 pm    Naslov sporočila:   Odgovori s citatom

Vilko bravo takšne rabimo!

Medtem ko so nekateri razpravljali kaj in kako a konkretnega z bascomom in 2051 nič, si ti napisal in opisal točno to kar je rabil...

Ker tudi jaz ne poznam vrhunsko bascoma in se včasih mučim s kako malenkostjo in si kar ne upam povprašati ker nekateri porabijo ogromno postov zato da ti govorijo "kako da to ne razumeš,nabavi si to in to knjigo..."namesto par vrstic kode z komentarjem .

Tudi sam sem privlekel testno ploščo na plan in prepisal codo, malo še dodal in dela,obenem pa sem se še kaj naučil...
Pa iziv za ostale:
Kaj dodati da bi izpisal v spodnjo vrstico recimo vmesni čas, poslal po rs232.....

Mogoče bomo pa ta projekt z dodajanjem naredilo celo uporaben...

lp

lado
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Tor Nov 13, 2007 9:05 am    Naslov sporočila:  Treba je znat brati tudi angleško. Odgovori s citatom

Treba je znat brati tudi angleško.
Bascom ima obsežen help. V njem bi si lahko ogledal, kaj počne ukaz Debounce. Če je napisan tako
Koda:
debounce tipka, 0, rutina, sub

pomeni, da takrat, ko signal na portu, ki je prirejen imenu tipka, pade signal iz 1 na 0, program preskoči b podprogram z imenom rutina, toda pri tem ignorira odksakovanje kotve na tipki, kar je važno pri kakšnem štetju, kolikokrat si pritisnil na tipku, tukaj ne.
In če potem samo pogledaš, kaj je v podprogramu, tam samo zaustavimo ali poženemo timer, se pravi, da ti ni potrebno tiščati tipke start, da bi štoparica merila čas.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Tor Nov 13, 2007 9:14 am    Naslov sporočila:  Pošiljanje vmesnega časa Odgovori s citatom

Za pošiljanje vmesnega časa bi bila verjetno potrebna še ena tipka, še en senzor, kdaj je tekač pretekel prvi km.

V principu niče posebnega, v začetek program je potrebno dodati bodno hitrost komunikacije:

Koda:
$crystal = 11059200
$baud = 9600


Podprogrami za start, stop, reset in novi, še ne napisani podprogam za vmesni čas bi morali imeti še en ukaz, neke vrste pošlji stanje recimo tako:

Koda:
Zacni:
Start Timer0
print  Ure ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Stotinke
Return
Prenehaj:
Stop Timer0
print  Ure ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Stotinke 
Return
Resetiraj:
Ure = 0 : Minute = 0 : Sekunde = 0 : Stotinke = 0
Lowerline
Lcd Ure ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Stotinke
print  Ure ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Stotinke
Return


Print ukaz daje na txd pinu (P3.1) v zahtevani hitrosti podakte ki jih potem z čipom max232 spravimo na RS232 nivo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
probiker
Neznanec
Neznanec



Pridružen-a: Tor 27 Jan 2009 15:11
Prispevkov: 1
Aktiv.: 0.01

PrispevekObjavljeno: Tor Jan 27, 2009 3:13 pm    Naslov sporočila:  gf Odgovori s citatom

too ja vidiš to sem rabo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
edo11
Član
Član



Pridružen-a: Pet 07 Maj 2010 9:19
Prispevkov: 65
Aktiv.: 0.38
Kraj: Komen

PrispevekObjavljeno: Tor Dec 03, 2013 3:48 pm    Naslov sporočila:   Odgovori s citatom

Malo sem se igral z to štoparico, pa mi ne kaže točnega časa. Prehitevi mi cca 1s na minuto. Zakaj?
'$sim
$regfile = "89c2051.dat"
$crystal = 11059200
Config Lcd = 16 * 2
Config Timer0 = Timer , Gate = Internal , Mode = 1

Load Timer0 , 36
Start Timer0
Enable Timer0
Enable Interrupts
On Timer0 Timer_0_int


Dim Stotinke As Byte
Dim Sekunde As Byte
Dim Minute As Byte
Dim Ure As Byte

Cls
Lcd "stoparica"
'Wait 3





Do


If Stotinke > 99 Then
Stotinke = Stotinke - 100
Incr Sekunde
If Sekunde > 59 Then
Sekunde = Sekunde - 60
Incr Minute
If Minute > 59 Then
Minute = Minute - 60
Incr Ure
End If
End If
End If

Locate 2 , 1
Lcd Ure ; ":" ; Minute ; ":" ; Sekunde ; '":" ; Stotinke



Tstart Alias P3.3 'tipka TP1 start
Tstop Alias P3.2 'tipka TP2 stop
Treset Alias P3.0 'tipka TP3 reset

Debounce Tstart , 0 , Zacni , Sub
Debounce Tstop , 0 , Prenehaj , Sub
Debounce Treset , 0 , Resetiraj , Sub

Loop

Zacni:
Start Timer0
Return
Prenehaj:
Stop Timer0
Return
Resetiraj:
Ure = 0 : Minute = 0 : Sekunde = 0 : Stotinke = 0
Locate 2 , 1
Lcd Ure ; ":" ; Minute ; ":" ; Sekunde
Return

Timer_0_int:
Load Timer0 , 36
Incr Stotinke
Return


Vse skupaj poganjam na minipin plošči z emulatorjem 2051 (at89s8252)

_________________
Lp Edo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Sre Dec 04, 2013 9:17 am    Naslov sporočila:   Odgovori s citatom

Dolgo je že tega, kar sem delal s temi mikrokrmilniki. Ko sem prešel na AVR mi je življenje lažje.
Zato tudi ne znam več preveriti, ali je timer pravilno startan. Ampak vzemimo, da je.

1 sekundo napake na minuto je vulgarno preveč. Nekaj mora biti hudo narobe.

Prvo zamenjaj kristal. Verjetno ne bo nič bolje, kajti toliko noben kristal ne odstopa.
Sicer je koda programa v redu, kot rečeno, le krmiljenje timer0 ne znam več preveriti. Bi moral spet vzeti v roke help in ostalo, ampak to lahko narediš tudi ti. Malo me bega tisti Gate= internal.

Nadalje,
Koda:
Locate 2 , 1
Lcd Ure ; ":" ; Minute ; ":" ; Sekunde ; '":" ; Stotinke

je v programu kar naprej, in to lahko (pa po mojem nebi smelo) generira kake zamude.
prestavi ta izpis na LCD v tisti del programa, ki se izvaja vsako sekundo, in pa seveda v tisti del programa, kjer imaš zaustavitev štetja.

Res čudno.



Mislim, da je ostalo malo pionirjev, ki še vedno delajo s temi mikroprocesorji. Morda bi veljalo, da postaviš vprašanje na forumu Sveta elektronike, tam ti bo verjetno odgovoril Jure.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 19.74

PrispevekObjavljeno: Sre Dec 04, 2013 12:28 pm    Naslov sporočila:   Odgovori s citatom

edo11 je napisal/a:

Timer_0_int:
Load Timer0 , 36
Incr Stotinke
Return

Bascoma sicer ne poznam (niti ga nočem), vendar je tole narobe. Pri točnem merjenju časa se Timer0 register nikoli ne postavlja na neko vrednost v prekinitvi ampak se mu kaj prišteje/odšteje. Za domačo nalogo pa razmisli, zakaj...

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
edo11
Član
Član



Pridružen-a: Pet 07 Maj 2010 9:19
Prispevkov: 65
Aktiv.: 0.38
Kraj: Komen

PrispevekObjavljeno: Sre Dec 04, 2013 2:31 pm    Naslov sporočila:   Odgovori s citatom

Hvala Vilko za odgovor. Vse sem že poskusil (zamenjava kristala je bila prva), tudi izpis na LCD sem prestavil na vsako sekundo. Zanimivo je to, da ura ne zaostaja ampak prehiteva za sekundo. Sicer z timerji nimam nobenih izkušenj in tudi sicer nisem programer, vendar se mi zdi da je problem ravno v nastavitvah timerja.
vilko je napisal/a:
Sledijo navodila, kako uporabiti Timer0. Malo je le treba vedeti o interni logiki timer naprave pri 8051 družini. le ta pozna tri načine, mode=1, mode = 0 in mode = 2
Pri mode = 1, že interno mikroprocesor deli frekvenco z 256 (pri mode = 2 z 1 in pri mode = 0 z 32). Ker želimo prekinitev 100 krat na sekundo moramo polniti timer z vsebino, ki odgovarja:

11059200 / 100 (hočemo stotinke! ) / 12 ( interno 8051 ) / 256 (mode = 1) in to je 36. To se pravi, da moramo timer napravi naložiti, da šteje do 36, predno sproži prekinitev. To naredimo tako:

Koda:
Config Timer0 = Timer , Gate = Internal , Mode = 1
On Timer0 Titi Nosave
Load Timer0 , 36
Start Timer0
Enable Timer0
Enable Interrupts
Goto Preskok1 'preskočimo timer0 podprogram
Titi:
Dim Stotinke As Byte
Load Timer0 , 36
' v podprogramu ne delamo drugega kot štejemo prekinitve
Incr Stotinke
Return
Preskok1:

_________________
Lp Edo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
edo11
Član
Član



Pridružen-a: Pet 07 Maj 2010 9:19
Prispevkov: 65
Aktiv.: 0.38
Kraj: Komen

PrispevekObjavljeno: Sre Dec 04, 2013 2:35 pm    Naslov sporočila:   Odgovori s citatom

gumby je napisal/a:
edo11 je napisal/a:

Timer_0_int:
Load Timer0 , 36
Incr Stotinke
Return

Bascoma sicer ne poznam (niti ga nočem), vendar je tole narobe. Pri točnem merjenju časa se Timer0 register nikoli ne postavlja na neko vrednost v prekinitvi ampak se mu kaj prišteje/odšteje. Za domačo nalogo pa razmisli, zakaj...


Zadeva me je zainteresirala in bom o tem vse prebral! Rad bi se naučil uporabljati vsaj Bascom. Pa brez zamere!

_________________
Lp Edo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
edo11
Član
Član



Pridružen-a: Pet 07 Maj 2010 9:19
Prispevkov: 65
Aktiv.: 0.38
Kraj: Komen

PrispevekObjavljeno: Sre Dec 04, 2013 3:34 pm    Naslov sporočila:   Odgovori s citatom

Zadevo sem poštimal in zdaj teče točno, čeprav ne vem kaj je bilo prej narobe. Sedaj sem uporabil delček kode, ki sem se jo učil pred cca kakimi 15 leti na bascom tečaju. Hvala Jure!

'$sim
$regfile = "89c2051.dat"
'$crystal = 11059200
$crystal = 12000000
Config Lcd = 16 * 2
Config Timer0 = Timer , Gate = Internal , Mode = 2

Load Timer0 , 250
Priority Set Timer0
Enable Timer0
Enable Interrupts
Start Timer0
On Timer0 Timer_0_int Nosave

Dim Clock As Byte , Clock1 As Byte
Dim Stotinke As Byte
Dim Sekunde As Byte
Dim Minute As Byte
Dim Ure As Byte

Cls
Lcd "stoparica"
'Wait 3





Do

If Clock > 19 Then 'if Clock is more than 19
Clock = Clock - 20 'reset clock1 to 0
Incr Clock1 'increase Clock1 for 1
If Clock1 > 199 Then 'if Clock1 is more than 199
Clock1 = Clock1 - 200 'reset to 0
Incr Sekunde
Locate 2 , 1
Lcd Ure ; ":" ; Minute ; ":" ; Sekunde
If Sekunde > 59 Then
Sekunde = Sekunde - 60
Incr Minute
If Minute > 59 Then
Minute = Minute - 60
Incr Ure
End If
End If
End If
End If


Tstart Alias P3.3 'tipka TP1 start
Tstop Alias P3.2 'tipka TP2 stop
Treset Alias P3.0 'tipka TP3 reset

Debounce Tstart , 0 , Zacni , Sub
Debounce Tstop , 0 , Prenehaj , Sub
Debounce Treset , 0 , Resetiraj , Sub

Loop

Zacni:
Start Timer0
Return
Prenehaj:
Stop Timer0
Return
Resetiraj:
Ure = 0 : Minute = 0 : Sekunde = 00 : Stotinke = 0
Locate 2 , 1
Lcd Ure ; ":" ; Minute ; ":" ; Sekunde ; " "
Return

Timer_0_int:
Incr Clock
Return



Štoparca-v2.zip
 Opis:

Download
 Ime datoteke:  Štoparca-v2.zip
 Velikost datoteke:  735 Bytov
 Downloadano:  3 krat


_________________
Lp Edo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2
Stran 2 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
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group