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 

krmiljenje releja
Pojdi na stran Prejšnja  1, 2, 3, 4  Naslednja
 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Samogradnje
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vilko
Profesionalec


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

PrispevekObjavljeno: Tor Nov 02, 2004 7:30 pm    Naslov sporočila: Na brzino sem naštrikal tole: Odgovori s citatom

Na brzino sem naštrikal tole:


Koda:

$regfile = "89c2051.dat"
$crystal = 12000000
'  inicializacija - nastavimo parametre za timer interrupt
' Če je frekvenca krislata 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
'

Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Titi122
Load Timer0 , 122

'   tukaj določiš pin, ki naj spremeni vrednost vsakih 122 usec:
Pin122 Alias P3.7
Dim Bitpin122 As Bit
' vse krmiljenje bita pin122 se dogaja v timer0 prekinitveni rutini titi122
'
' Za časovno konstanto 4 sekunde bomo uporabili timer1:
' 4 sek = 4 000 000 usec / 256 = 15625
'              15625 / 125 = 125

Config Timer1 = Timer , Gate = Internal , Mode = 1
On Timer1 Titi4sec
Load Timer1 , 125

'   tukaj določiš, kateri pin naj ima vsake 4 sekunde impult

Pin4sec Alias P3.5

' v glavnem programu štejemo, ali je timer1 rutina že klicana 125 krat:
Dim Stevec1 As Byte
Dim Stevec2 As Byte
Do
  If Stevec1 > 124 Then
     Stevec1 = Stevec1 - 125
     Incr Stevec2
     If Stevec2 > 124 Then
        Stevec2 = Stevec2 - 125
        ' tukaj smo vsake 4 sekunde
        ' torej postavimo bit
        Set Pin4sec
     End If
  End If
' ce smo postavili bit pin4sec, potem zakasnitev za 50 usec in reset pina
  If Pin4sec = 1 Then
     ' tukaj si pomagamo z assemblerjem:
     ' napolnimo akumulator s 25
     mov a,#25
     ' zmanjšaj akumuator za ena in ponavlja, dokler ne bo 0
     zanka:
     Djnz A , Zanka
     Reset Pin4sec
  End If
Loop

Titi4sec:
'Vsakih 125 * 256 usec smo v tej rutini
' povečamo stanje števca in ponovno napolnimo timer
Load Timer1 , 125
Incr Stevec1
Return

Titi122:
'Vsakih 122 usec se aktivira  rutina titi122 in njena naloga je, da
'preklopi bit pin122:
Bitpin122 = Not Bitpin122
Pin122 = Bitpin122
Return


Zadeve nisem testiral, ker imam trenutno problem s PG302 in ne morem pretočiti programa iz PC-a v 2051.

Program uporabi oba timerja, torej tudi timer1, ki je sicer rezerviran za serijsko komunikacijo preko Rx/tx pinov. Predpostavljam, da le te ne boš rabil, torej da lahko uporabim oba timerja.

Pozdrav
Vilko
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


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

PrispevekObjavljeno: Sre Nov 03, 2004 10:55 am    Naslov sporočila: Pozabil Odgovori s citatom

Ha, sedaj vidim, da sem pozabil nekaj ukazov izpred

do
loop

mora biti seveda

enable timer0
enable timer1
enable interrupts

_________________
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
marcelo
Novinec


Pridružen/-a: Tor Okt 2004 12:07
Prispevkov: 9

PrispevekObjavljeno: Sre Nov 03, 2004 1:05 pm    Naslov sporočila: hvala Odgovori s citatom

Vilko
Bom testiral tvoj program te dni.Prvo moram doma programirati atmel pa v službi priklopiti osciloskop. Zaenkrat se zahvaljujem.
Bom sporočil če je vse OK
Pozdrav
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Profesionalec


Pridružen/-a: Pon Jan 2004 17:52
Prispevkov: 181
Kraj: Kobarid

PrispevekObjavljeno: Sre Nov 03, 2004 6:57 pm    Naslov sporočila: Odgovori s citatom

Bom se jaz malo koristen.
Vilko daj poslji mi tvoj program imam emulator, programator (pa niti enaga 89c2051) ociloskop ter ferkvencmeter tako da ti lahko tocno povem kaj stvar dela.

_________________
Skupaj smo mocnejsi
LP Simon
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
marcelo
Novinec


Pridružen/-a: Tor Okt 2004 12:07
Prispevkov: 9

PrispevekObjavljeno: Sre Nov 03, 2004 7:27 pm    Naslov sporočila: error Odgovori s citatom

Vilko
Javlja mi naslednjo napako
Error 120: label not found zanka
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Sre Nov 03, 2004 8:35 pm    Naslov sporočila: krmiljenje releja Odgovori s citatom

LP!

"zanka:" napisi na zacetku vrstice brez presledka pa bo brez napake.
Vlado
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Sre Nov 03, 2004 8:48 pm    Naslov sporočila: krmiljenje releja Odgovori s citatom

LP!
Malce sem prehiteval,pravilno je:


If Pin4sec = 1 Then
' tukaj si pomagamo z assemblerjem:
' napolnimo akumulator s 25
$asm '***********************************
mov a,#25
' zmanjšaj akumuator za ena in ponavlja, dokler ne bo 0
zanka:
Djnz A , Zanka
$end asm '********************************************
Reset Pin4sec
End If
Loop


Vlado
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


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

PrispevekObjavljeno: Čet Nov 04, 2004 7:57 am    Naslov sporočila: Aha, assembler le ni tako preprosto vščipniti zraven Odgovori s citatom

Hja,

potem ko sem dodal Enable Interrupt tri instrukcije, sem tudi jaz dobil to isto napako. Ker takrat še nisem prebral Vladovega nasveta z $asm (s tem še nisem delal) ine prav gotovo pravilno, sem enostavno zaobšel problem tako, da sem namesto zanke vrinil zadostno število nop instrukcij.

In potem je program izgledal tako:


Simon, verjetno si imel v mislih preveden program, kaj ne?
Izvirni je tako in tako zraven.

No sedaj dajem oboje.


Koda:

$regfile = "89c2051.dat"
$crystal = 12000000
'  inicializacija - nastavimo parametre za timer interrupt
' Če je frekvenca krislata 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
'

Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Titi122
Load Timer0 , 122

'   tukaj določiš pin, ki naj spremeni vrednost vsakih 122 usec:
Pin122 Alias P3.7
Dim Bitpin122 As Bit
' vse krmiljenje bita pin122 se dogaja v timer0 prekinitveni rutini titi122
'
' Za časovno konstanto 4 sekunde bomo uporabili timer1:
' 4 sek = 4 000 000 usec / 256 = 15625
'              15625 / 125 = 125

Config Timer1 = Timer , Gate = Internal , Mode = 1
On Timer1 Titi4sec
Load Timer1 , 125

'   tukaj določiš, kateri pin naj ima vsake 4 sekunde impult

Pin4sec Alias P3.5

' v glavnem programu štejemo, ali je timer1 rutina že klicana 125 krat:
Dim Stevec1 As Byte
Dim Stevec2 As Byte

Enable Timer0
Enable Timer1
Enable Interrupts

Do
  If Stevec1 > 124 Then
     Stevec1 = Stevec1 - 125
     Incr Stevec2
     If Stevec2 > 124 Then
        Stevec2 = Stevec2 - 125
        ' tukaj smo vsake 4 sekunde
        ' torej postavimo bit
        Set Pin4sec
     End If
  End If
' ce smo postavili bit pin4sec, potem zakasnitev za 50 usec in reset pina
  If Pin4sec = 1 Then
 
     ' S številom nop instrukcij določiš
     ' dolžino impulza, ki naj bi bil vsake 4 sekunde

     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop

     Reset Pin4sec
  End If

Loop



Titi4sec:
'Vsakih 125 * 256 usec smo v tej rutini
' povečamo stanje števca in ponovno napolnimo timer
Load Timer1 , 125
Incr Stevec1
Return




Titi122:
'Vsakih 122 usec se aktivira  rutina titi122 in njena naloga je, da
'preklopi bit pin122:
Bitpin122 = Not Bitpin122
Pin122 = Bitpin122
Return[code]

[/code]

_________________
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
red_mamba
Profesionalec


Pridružen/-a: Tor Jan 2004 16:44
Prispevkov: 181
Kraj: Mozirje

PrispevekObjavljeno: Čet Nov 04, 2004 8:34 am    Naslov sporočila: Odgovori s citatom

naredi raje tako:

Koda:

Do
  ' ce smo postavili bit pin4sec, potem zakasnitev za 50 usec in reset pina
  'If Pin4sec = 1 Then
  If bSetPin = 1 then
 
     ' S številom nop instrukcij določiš
     ' dolžino impulza, ki naj bi bil vsake 4 sekunde
     Set Pin4sec

     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop

     Reset Pin4sec
     bSetPin = 0
  End If

Loop



Titi4sec:
'Vsakih 125 * 256 usec smo v tej rutini
' povečamo stanje števca in ponovno napolnimo timer
Load Timer1 , 125
Incr Stevec1
If Stevec1 > 124 Then
     'Stevec1 = Stevec1 - 125
     Stevec1 = 0
     Incr Stevec2
     If Stevec2 > 124 Then
        'Stevec2 = Stevec2 - 125
        Stevec2 = 0
        ' tukaj smo vsake 4 sekunde
        ' torej postavimo bit
        'Set Pin4sec
        bSetPin = 1
     End If
  End If
Return




Titi122:
'Vsakih 122 usec se aktivira  rutina titi122 in njena naloga je, da
'preklopi bit pin122:
Bitpin122 = Not Bitpin122
Pin122 = Bitpin122
Return

_________________
Bad things happen to good people all the time for no reason!
Štrom: http://www.red-mamba.com & http://www.red-mamba.biz
Prosti čas: http://www.maddogs-clan.org


Nazadnje urejal/a red_mamba Čet Nov 04, 2004 8:38 am; skupaj popravljeno 1 krat
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
red_mamba
Profesionalec


Pridružen/-a: Tor Jan 2004 16:44
Prispevkov: 181
Kraj: Mozirje

PrispevekObjavljeno: Čet Nov 04, 2004 8:37 am    Naslov sporočila: Odgovori s citatom

v progiju definiraš še
dim bSetPin as bit Wink

_________________
Bad things happen to good people all the time for no reason!
Štrom: http://www.red-mamba.com & http://www.red-mamba.biz
Prosti čas: http://www.maddogs-clan.org
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
SimonS
Profesionalec


Pridružen/-a: Pon Jan 2004 17:52
Prispevkov: 181
Kraj: Kobarid

PrispevekObjavljeno: Čet Nov 04, 2004 7:17 pm    Naslov sporočila: Odgovori s citatom

Vilko
Sem program preizkusil ne dela Shocked
Tudi na simulatorju je opaziti samo da resetira pin P3.5 in potem caka.... Sploh ne gre v prekinitve. Teh timerjev nisem nikoli razumel....

_________________
Skupaj smo mocnejsi
LP Simon
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


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

PrispevekObjavljeno: Pet Nov 05, 2004 7:44 am    Naslov sporočila: Prekinitve in simulator - poseben problem Odgovori s citatom

Pozdravljen, Simon,

Tudi jaz imam slabe izkušnje s simulatorjem, kadar je programirana prekinitev. Bo le potrebno program pretočiti v 2051 in potem na osciloskopu pogledati, ali je kaj gor.

Še vedno nimam poštimanega programatorja, res pa je, da se nisem ukvarjal z njim, in sam se noče poštimati.

S timerji je pa tako:
to so števci, ki štejejo periode dolge 12/f kjer je f frekvenca kristala.
Pri 12 Mhz kristalu je timerenota torej točno 1 usec

Do koliko naj šteje, predno pride do prekinitve, določimo z vrednostjo, s katero napolnimo števec z Load timer ukazom.

Primer:
Load Timer1 , 125

Največja vrednost, ki jo lahko damo v Load timer ukaz je 255 (1 bajt)

Ker je 255 usec zelo malo, imamo več timerjevih načinov:

Mode = 1 (Določimo v config timer ukazu)
šteje do 256 * vrednost pri load torej pri frekvecni 12 Mhz do
256 * 255 = 65280 usec je cca 65 milisekund
če smo seveda napolnili timer z maksimalno vrednostjo.

Pri Mode 2 pa šteje res samo čiste timer enote torej maksimalno do
255 usec če smo ga napolnili z vrednostjo 255
Prednost mode-2 pa je, da ima reload funkcijo, se pravi, da se po prekinitvi števec sam ponovno postavi na vrednost, ki smo jo napolnili in ni potrebna ponova Load Timer instrukcija.

Mode je 0 je nekje vmes, šteje do 32 * vrednost load ukaza.

' 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
'

Odštevanje tega števca teče v mikroprocesorju popolnoma neodvisno od dela glavnega programa. Ko priteče števec do 0, tedaj mikroprocesor sam prekine delo glavnega programa, (Če smo mu to z Enable seveda dovolili) in starta posebej za ta namen napisano rutino-podprogram, ki naj bo v principu čim manjši, krajši.
Pri meni ta podprogram samo poveča stanje števca in se vrne, potem pa sam na osnovi stanja števca v glavnem programu ugotavljam, ali so že pretekle 4 sekunde, ki jih zahtevamo ali ne.


Pozdrav

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
SimonS
Profesionalec


Pridružen/-a: Pon Jan 2004 17:52
Prispevkov: 181
Kraj: Kobarid

PrispevekObjavljeno: Pet Nov 05, 2004 6:23 pm    Naslov sporočila: Odgovori s citatom

Vilko
Evo pozabil si na ukaz START TIMER0,1
Sedaj timer 0 deluje. Timer 1. pa ne. Ne vem kako se napaja timer 1 v modu 1. Pri 2 (autoreload) je ukal LOAD TIMER. Basic help:

Koda:
Load specified TIMER with a value for auto reload mode.   

Syntax
LOAD TIMER , value   

Remarks

TIMER   TIMER0, TIMER1 or TIMER2.
Value   The variable or value to load.
When you use the ON TIMERx statement with the TIMER/COUNTER in mode 2,
you can specify on which interval the interrupt must occur.
The value can range from 1  to 255 for TIMER0 and TIMER1. 
For TIMER2 the range is 1-65535.


Uglavnem, ce spremenim v mode 2 deluje v modu 1 pa ne Confused

_________________
Skupaj smo mocnejsi
LP Simon
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


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

PrispevekObjavljeno: Sob Nov 06, 2004 11:29 am    Naslov sporočila: Ja, zlomek je, če ne more, stvari stestirati Odgovori s citatom

Seveda, nič kar je naredil človek, ni perfektno. Tudi moj programček je naštrikan 'na pamet', in če ne bi kaj pozabil, bi bilo zelo čudno.

Hm, zakaj en timer dela drugi ne?
Torej pri enem, ki dela v načinu 2, je avtoreload, in ta potem če enkrat teče, gotovo teče. To je menda tisti, ki generira impulze s periodo 288 usec.

Pri drugem se ne sme pozabiti v interrupt rutini ponovno napolniti števec z Load Timer ukazom. Problem pa je lahko problem tudi v glavnem programu, saj tukaj je trajanje 4 sekunde komibinrano s štetjem, koliko prekinitev je doživel timer.
Ampak, če si zapopadel princip, boš našel tudi napako.

moj pg302 še vedno ne dela. čip max232 se segreje tako, da se ga ne morem dotakniti. Moral ga bom zamenjati, pa verjetno vse kar je okrog njega...

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
SimonS
Profesionalec


Pridružen/-a: Pon Jan 2004 17:52
Prispevkov: 181
Kraj: Kobarid

PrispevekObjavljeno: Sob Nov 06, 2004 12:40 pm    Naslov sporočila: Odgovori s citatom

Ziv Vilko
Glej simulator na bascomu deluje perfektno in se lahko zanasas nanj v 99%.
Imam PG302 ter emulator. Nasel sem si celo en 89C2051 in ga sprogramiral. Ne dela. Tezava je da v modu 1 ukaz LOAD NE DELA! Tudi v helpu pise da ne. Ne vem kako se ga takrat nalozi. Bi moral malo bolje nastudirati bascom. Daj se tega v nacin 2.

_________________
Skupaj smo mocnejsi
LP Simon
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Samogradnje Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Pojdi na stran Prejšnja  1, 2, 3, 4  Naslednja
Stran 3 od 4

 
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