Stránka 1 z 2

2 operace najednou / blikaji diody a funguje seriova kom.

Napsal: 12 srp 2009, 14:40
od michalino
Přátelé, dobrý den,

prosím Vás o radu.
Mám k ATMEGA8 připojené diody, které dělají efekt KNIGHT RIDER.... a když zmačknu klávesu (4 na numerické klávesnici) přepne se tento program do režimu seriove komunikace vkladani dvou cisel, secteni a vypsani vysledku......

Prosím Vás o radu v tom, co mám udělat proto, aby program takto zůstal....= dvě různé úlohy, ovšem...
aby po stisku klávesy "4" dále běžely diody jako knight rider, ale abych přitom mohl zadávat data do seriove komunikace pro soucet tech dvou cisel

Je to přerušení...ovšem Timer0, Timer1 nebo jiné....nasměrujte mě prosím, případně znáte pro toto vhodnou ukázku?





$regfile = "m8def.dat"
$crystal = 1000000
$baud = 2400
$sim

Config Pinb.1 = Output

Enable Interrupts
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0


Dim Firstnumber As Integer
Dim Secondnumber As Integer
Dim Sum As Integer
Dim A As Byte

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


Do
A = Inkey()

Portb.5 = 0
Portb.1 = 1
Waitms 10
Portb.1 = 0
Portb.2 = 1
Waitms 10
Portb.2 = 0
Portb.3 = 1
Waitms 10
Portb.3 = 0
Portb.4 = 1
Waitms 10
Portb.4 = 0
Portb.5 = 1
Waitms 10
Portb.5 = 1


If A = 52 Then Goto Zadejcisla

A = Waitkey()

Loop

Waitms 10
End


Zadejcisla:
Firstnumber = 0
Secondnumber = 0
Input "Enter first number : " , Firstnumber
Input "Enter second number: " , Secondnumber
Sum = Firstnumber + Secondnumber
Cls
Print "Součet: " ; Sum
Portb.1 = 0

Locate 2 , 1
Lcd Sum

Return

Napsal: 12 srp 2009, 14:57
od bohous1
jako hlavni rutinu udelas to blikani.

pod preusenim das osetreni klavesnice. kdyz prijde stisk pocitas pocet stisknutych cisel. kdyz budou prave dve sectes zobrazis a znova.

Napsal: 12 srp 2009, 20:06
od michalino
A funguje to například principielne stejne i u dvou serv, ktere se kazde 2 tlacitkama spousti pro chod vpred a vzad tak, aby nezavisle na sobe jezdily plynule na obe strany dle potreby a soucasne?

Máte k tomuto prosím nějaké rady ... dekuji


jako hlavni rutinu udelas to blikani. *** to chapu

pod preusenim das osetreni klavesnice
** a ktere preruseni prosim pouzit TIME0, TIMER1, watchdog:
kdyz prijde stisk pocitas pocet stisknutych cisel
***kdyz prijde stisk žádané klávesy pak se zasle pomoci preruseni signal do terminalu s zadosti o vlozeni cisla, v terminalu se vypise : Vloz cislo A|: a diky preruseni se program vraci zpet na diody....diody stale blikaji....kdyz ale zacnu vkladat cislo , tak diody budou porad blikat do doby, nez zmacknu ENTER na potvrzeni cisla a i po teto dobe?
Po zadani prvniho cisla bude ocekavano druhe cislo a situace se opakuje...

je to tak prosím?


kdyz budou prave dve sectes zobrazis a znova.

Napsal: 13 srp 2009, 13:05
od ZdenekHQ
Já bych to udělal naopak - blikání přes přerušení, ta operace přerušení+přepnutí na další led zabere pár us , rychlost blikání bude definovaná periodou přerušení + nějakej čítač uvnitř přerušení, aby ses dostal na dlouhý časy (třeba každý desátý přerušení se posune led apod.). Nastavíš nejvyšší prioritu přerušení + Timer 0. Nezapomeň na zálohu registrů.

V hlavní smyčce si pak můžeš hrát s tlačítkama, RS232 atd. Nevím jak tady, ale 232 u 2051 řídí Timer 1. Ledky tě téměř vůbec nebudou omezovat....

Napsal: 13 srp 2009, 13:21
od bohous1
preruseni klavesnice musis dat externi preruseni nejcasteji to byva do 0.

dalsi preruseni bych videl po prijmu kodu ze seriove linky, teda pokud budes mit HW seriovou linku v procesoru
mno a posledni preruseni na to blikani tam si vyber casovac ktery chces.

nepises ktery procesor pouzivas. predne mrkni na to ktery casovac pouziva seriova linka a ten druhy pouzij na blikani

a program by ve strukture mohl vypadat takto:

nastav vsechna preruseni a povol je
hlavni smycka:
jsou prijaty dve korektni cisla, kdyz ano spocitej a zobraz a pak se vrat na zacatek, ne cekej.

obsuha preruseni:
obsluha stisku tlacitka-externi preruseni
obsluha seriove linky
obsluha blikatka

mno a az budes toto mit, tak se budes muset pohrat s osetrenim zakmitu tlacitka, co kdyz znak neprijde nebo neni koser, co se udeje po zapnuti.

Napsal: 13 srp 2009, 14:10
od michalino
Bohouši a Zdeňku, děkuji Vám za rady.

Vím, že to není úplně dle Vašich rad, nicméně bojuju s tím postupně a pomalu se do toho dostávám, takto vypadá zatím poslední kód, lze to takto řešit, jde to alespoň správnou cestou, prosím? Teď vemte prosím v potas hlavně strukturu příkazu přerušení, programu a konfiguraci přerušení.... upravuju kod pro rychlejší čtení kódu alespo%n do jakesi stabni kultury



$regfile = "m8def.dat"
$crystal = 1000000
$baud = 2400
$sim
Dim B As Byte
Dim A As Integer
Dim Firstnumber As Integer
Dim Secondnumber As Integer
Dim Sum As Integer

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


Config Timer0 = Counter , Edge = Rising

Tcnt0 = 0
A = 0
Firstnumber = 0
Secondnumber = 0

'***********************hlavni smycka programu blikaji diody
Do
If A = 3 Then Tcnt0 = 10 'jakmile a=3 aktivuje se preruseni

Print "Hodnota přerušení Tcnt0:" ; Tcnt0
Locate 2 , 1
Lcd "Krok hl.prog:" ; A

A = A + 1

B = Inkey()

Portb.5 = 0
Portb.1 = 1
Waitms 10
Portb.1 = 0
Portb.2 = 1
Waitms 10
Portb.2 = 0
Portb.3 = 1
Waitms 10
Portb.3 = 0
Portb.4 = 1
Waitms 10
Portb.4 = 0
Portb.5 = 1
Waitms 10
Portb.5 = 1


If B = 52 Then Goto Tim0_isr

'A = Waitkey()

Loop Until Tcnt0 >= 10

'***********************konfigurace preruseni
Config Timer0 = Timer , Prescale = 1
Stop Timer0
Start Timer0

'Print Tcnt0
Set Tifr.1
Config Timer0 = Timer , Prescale = 1024
On Ovf0 Tim0_isr

'***********************Smycka, ktera se ma provest v preruseni
Do

Locate 1 , 1
Lcd "Preruseni"
Cls


Input "Enter first number : " , Firstnumber
Input "Enter second number: " , Secondnumber
Sum = Firstnumber + Secondnumber
Cls
Print "Součet: " ; Sum
Locate 2 , 1
Lcd Sum

Loop

'***********************Toto se stane pri preteceni // jenze zde program konci.... a mel by prece pokracovat....

Tim0_isr:
Cls
Locate 1 , 1
Lcd "Pretecen casovac"
Return

End




Případně, nemáte náhodou prosím nebo nevíte o programu s přerušením, který by se dal simulovat v bascomu v simulátoru v pc?Na čem by se dala funkce přerušení vidět a naučit z kódu? Není mi totiž jasné celkově to přerušení....děkuji Vám

Napsal: 13 srp 2009, 18:41
od michalino
Tak bádám dále, prosím, kde zjistit a jak zjistit konfiguraci timeru1 pro tento zápis pro atmega8 , přepočítává se to někde nebo nějak zjišťuje ? :

Tccr1a = &B10100000
Tccr1b = &B00010010

děkuji

Napsal: 13 srp 2009, 19:16
od Návštěvník
Z datasheetu, co si ho už přečíst?

Napsal: 13 srp 2009, 22:33
od michalino
Anonyme.. :) ty mi dáváš zabrat..ale nevadí, jak píšeš...to musí být...

díval jsem se do datasheetu a orientace v tom všem celkem vázne...našel jsem na internetu toto:

Tccr1a = &B10000001
Tccr1b = &B00001001

je to prosím správná konfigurace timeru1 u atmega8?

Nevím totiž, jak se ty nuly a jedničky tvoří....
Bit 7 6 5 4 3 2 1 0
– – – – ACME PUD PSR2 PSR10 SFIOR
Read/Write R R R R R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

Je na to někde ověřený návod, prosím?

Napsal: 14 srp 2009, 01:20
od AB
Váš program je,bohužel, jeden velký mišmaš.
Asi by to chtělo přečíst si nějakou knihu o programování.
Učit se úplně všechno dotazem v diskuzi by asi nebylo nejlepší.

Podívejte se aspoň na http://www.mp222.wz.cz/.
Jsou tam cvičné programy pro Bascom a český překlad instrukcí.

Tak bádám dále, prosím, kde zjistit a jak zjistit konfiguraci timeru1 pro tento zápis pro atmega8 , přepočítává se to někde nebo nějak zjišťuje ? :

Tccr1a = &B10100000
Tccr1b = &B00010010


Od toho je v Bascomu příkaz Config Timer:

Kód: Vybrat vše

'timer1 je časovač, předdělič = 1
Config Timer1 = Timer, prescale = 1

'timer1 je čítač, počítá impulsy na pinu T1, vzestupná hrana
Config Timer1 = Counter, Edge = Rising
atd.


Přerušení se musí v simulátoru ručně spustit tlačítkem v záložce Interrupts.

Tady je kód jak bych to asi dělal já

Kód: Vybrat vše

'Tlačítko na portb.1 proti zemi
'5 Led diod na portc.0 až portc.4

$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 50
$framesize = 50
$baud = 2400

Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portd.3 , Rs = Portd.4
Config Lcd = 16 * 2

Config Timer0 = Timer , Prescale = 256  '1 krok = 256 mikrosec
Enable Ovf0                             'povol přerušení od přetečení Timer0
On Ovf0 Isr_ovf0                        'při přerušení jdi na Isr_ovf0

Config Portc = Output                   'ledky
Config Portb.1 = Input                  'tlačítko
Portb.1 = 1                             'pull-up

Dim Firstnumber As Integer
Dim Secondnumber As Integer
Dim Sum As Integer

Cursor Off
Enable Interrupts

   Do
      If Pinb.1 = 0 Then                'tlačítko stisknuto
         Input "Enter first number : " , Firstnumber
         Input "Enter second number: " , Secondnumber
         Sum = Firstnumber + Secondnumber
         Print "Součet: " ; Sum

         Cls
         Locate 2 , 1
         Lcd Sum
      End If
   Loop
End

'Obsluha přerušení
Isr_ovf0:
   Tcnt0 = 156                          'interval přerušení
   Shift Portc , Left , 1               'zapni další ledku
   If Portc > 16 Or Portc = 0 Then Portc = 1
Return

Napsal: 14 srp 2009, 10:22
od michalino
AB děkuji MOC!

Přesně tato rada pomohla....

Teď už aspoň znám směr kam jít a co studovat, díky tomu, že jste mi osvětlil nastavení timeru...ano, to se člověk dočte v manualu bascomu, ale pokud to srovna s jinymi programy, kde je psano:
Tccr1a = &B10100000
Tccr1b = &B00010010
tak je člověk trošku z toho jelen. Kdežto teď když jste to osvětlil a přirovnal ke konfiguraci:

'timer1 je časovač, předdělič = 1
Config Timer1 = Timer, prescale = 1

'timer1 je čítač, počítá impulsy na pinu T1, vzestupná hrana
Config Timer1 = Counter, Edge = Rising
atd.

je mi jasnější, kterým směrem jít. Děkuji AB

a

za odkaz s těmi program děkuji opět, protože jsou SUPER, je to přesně udělané tak, aby pochopil člověk z programu a ne z textu, kde se používají výrazy typu REGISTR, BUFFER, TIMER, atd, jak přerušení funguje a na co vlastně je....to je úplně super, všem doporučuju a je tam nejen přerušení, ale i další úlohy popsané okomentováním u každého příkazu, co to znamená a co ten příkaz dělá, fakt paráda....

http://www.mp222.wz.cz/

díky AB, jdu to prostudovat a projít...

a do třetice díky za návrh programu na diody, hlavně za Váš čas při jeho tvorbě...
Dal jsem ho do bascomu, simuloval jsem ho a funguje to, opět se podle togho můžu přiučit styl programování a princip přerušení....jsem zvědav, jak to doma nahrahju do megy,jak to bude fungovat,

děkuju za pomoc AB a Váš čas

Napsal: 14 srp 2009, 19:15
od michalino
AB, tak jsem pak koumal, jak udělat v přerušení v Tvém výše uvedeném programu to, aby diody blikaly třeba co sekundu...waitms nepomohlo, tak jsem se dočetl, že je to tím Prescale.... že se to dle krystalu přepočítává na sekundy.... ted pokud člověk namísto přerušení ve výše uvedeném programu uvede toto:

Isr_ovf0:
A = A + 1

If A = 32 Then
Tcnt0 = 156
Shift Portc , Left , 1
If Portc > 16 Or Portc = 0 Then Portc = 1
A = 0
End If

Return


tak se diody při změně hodnoty a v podmínce IF A=32 ..... začnou střídat rychleji nebo pomaleji...to je super... :)
Uvádím alespon tuto malickost i pro ostatni, co s prerusenim zacinaji

Prosím o vysvětlení Tcnt0 = 156 ... co to znamena interval preruseni?

A ještě prosím o jednu odpoved, kdo budete mít čas:

řeším úkol, kdy chci mít 4 na sobě nezávislé tlačítka klávesnice, nyní začínám se dvěma. Přerušení zkouším stejného principu, jako jsou výše uvedené příklady, ovšem nefunguje to, děje se toto

STISKNU JEDNU KLÁVESU na klávesnici v PC a rozsvítí se dioda
STISKNU druhou klávesnici na PC a zhasne první dioda a rozsvítí se druhá

nebo při drobné změně změně programu uveden dole, sviti bud jedna nebo druha : VZDYCKY JEDNA KLAVESA ZRUSI DRUHOU

Cílem je, aby se pri zmacknutí jedné klávesy detekovaly stisknuti i dalsich klaves a aby tyto stisknute klavesy, třeba dvě klávesy najednou prováděly svou funkci = jely dve serva dopredu nebo svitily dve diody najednou





$regfile = "m8def.dat"
$crystal = 16000000
$baud = 38400
$hwstack = 100
$swstack = 50
$framesize = 50

Enable Interrupts
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Config Timer0 = Timer , Prescale = 1024
Enable Ovf0
On Ovf0 Isr_ovf0

Config Portb = Output

Dim B As Byte

Cursor Off
Enable Interrupts

Do
B = Inkey()

If B = 56 Then
Portb.2 = 1
End If

Loop

End


Isr_ovf0:
B= Inkey()
If B = 50 Then
Portb.1 = 1
End If
Return

Napsal: 14 srp 2009, 19:48
od Návštěvník
Ty jseš pořád samé přerušení přerušení a přitom pořád netušíš, co to žere a kde to spí. AB ti radil dobře, přečti si nějakou knihu o programování a já ještě dodám, přečti si i nějakou knihu o mikroprocesorech a mikropočítačích obecně, tou možná začni.

Napsal: 14 srp 2009, 20:00
od michalino
Anonyme...
rozumím a jsem pro...je topotřeba, může být třeba tato?
http://shop.ben.cz/cz/121158-mikroproce ... itace.aspx

nebo byste doporučili jinou?

a k tomu programu...
lze prostřednictvím RS232 komunikace realizovat výše popsanou situaci?

Vím, jak bych to vyřešil hned....
Dal bych 2 potenciometry na AD vstupy a těmi bych jednoduše ovládal 2 serva nezávisle na sobě a jak bych chtěl dopředu a dozadu...

toto řešení chápu a už jsem s úspěchem zkoušel...

chtěl bych popojít a nechápu ty klávesy...prosím, naveďte mě na problém těch kláves...učebnici si objednám, mám o to zájem..

Napsal: 14 srp 2009, 20:07
od Návštěvník
michalino píše:Anonyme...
rozumím a jsem pro...je topotřeba, může být třeba tato?
http://shop.ben.cz/cz/121158-mikroproce ... itace.aspx

Jo, třeba tuhle.

michalino píše:a k tomu programu...
lze prostřednictvím RS232 komunikace realizovat výše popsanou situaci?

Přes obyčejnej sériovej terminál nemáš šanci zjistit stisk více kláves najednou.