|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Tor Nov 02, 2004 7:30 pm Naslov sporočila: Na brzino sem naštrikal tole: |
|
|
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 |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Sre Nov 03, 2004 10:55 am Naslov sporočila: Pozabil |
|
|
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 |
|
|
marcelo Novinec
Pridružen/-a: Tor Okt 2004 12:07 Prispevkov: 9
|
Objavljeno: Sre Nov 03, 2004 1:05 pm Naslov sporočila: hvala |
|
|
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 |
|
|
SimonS Profesionalec
Pridružen/-a: Pon Jan 2004 17:52 Prispevkov: 181 Kraj: Kobarid
|
Objavljeno: Sre Nov 03, 2004 6:57 pm Naslov sporočila: |
|
|
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 |
|
|
marcelo Novinec
Pridružen/-a: Tor Okt 2004 12:07 Prispevkov: 9
|
Objavljeno: Sre Nov 03, 2004 7:27 pm Naslov sporočila: error |
|
|
Vilko
Javlja mi naslednjo napako
Error 120: label not found zanka |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Sre Nov 03, 2004 8:35 pm Naslov sporočila: krmiljenje releja |
|
|
LP!
"zanka:" napisi na zacetku vrstice brez presledka pa bo brez napake.
Vlado |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Sre Nov 03, 2004 8:48 pm Naslov sporočila: krmiljenje releja |
|
|
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 |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Čet Nov 04, 2004 7:57 am Naslov sporočila: Aha, assembler le ni tako preprosto vščipniti zraven |
|
|
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 |
|
|
red_mamba Profesionalec
Pridružen/-a: Tor Jan 2004 16:44 Prispevkov: 181 Kraj: Mozirje
|
Objavljeno: Čet Nov 04, 2004 8:34 am Naslov sporočila: |
|
|
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 |
|
|
red_mamba Profesionalec
Pridružen/-a: Tor Jan 2004 16:44 Prispevkov: 181 Kraj: Mozirje
|
|
Nazaj na vrh |
|
|
SimonS Profesionalec
Pridružen/-a: Pon Jan 2004 17:52 Prispevkov: 181 Kraj: Kobarid
|
Objavljeno: Čet Nov 04, 2004 7:17 pm Naslov sporočila: |
|
|
Vilko
Sem program preizkusil ne dela
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 |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Pet Nov 05, 2004 7:44 am Naslov sporočila: Prekinitve in simulator - poseben problem |
|
|
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 |
|
|
SimonS Profesionalec
Pridružen/-a: Pon Jan 2004 17:52 Prispevkov: 181 Kraj: Kobarid
|
Objavljeno: Pet Nov 05, 2004 6:23 pm Naslov sporočila: |
|
|
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 _________________ Skupaj smo mocnejsi
LP Simon |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Sob Nov 06, 2004 11:29 am Naslov sporočila: Ja, zlomek je, če ne more, stvari stestirati |
|
|
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 |
|
|
SimonS Profesionalec
Pridružen/-a: Pon Jan 2004 17:52 Prispevkov: 181 Kraj: Kobarid
|
Objavljeno: Sob Nov 06, 2004 12:40 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|