Generováni frekvence – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Generováni frekvence – Assembler – Fórum – Programujte.comGenerováni frekvence – Assembler – Fórum – Programujte.com

 

Tomáš
~ Anonymní uživatel
560 příspěvků
21. 1. 2014   #1
-
0
-

Zdravím, jsem úplný začátečník a mám za úkol na ATMega32 vytvořit program, který bude generovat signál 10Hz na jednom výstupu mikroprocesoru. Má to být pomocí přerušení od čítače/časovače. Prosím o pomoc, vytvořil jsem zatím toto:

.def Temp = R16
.def pom = R17
LDI pom,0b00000001
out PortA, pom
.Def LED = pom

RJMP Main

reti;
reti;
reti;
reti;
reti;
RJMP tc1i
reti;
reti;
reti;
reti;
reti;
reti;

Main:
LDI Temp,00000001
OUT DDRA,Temp
LDI Temp,00011000
OUT TCCR1B,Temp
LDI Temp,0x00
OUT TCCR1A,Temp
LDI Temp,0x30
OUT ICR1H,Temp
LDI Temp,0xD3
OUT ICR1L,Temp
LDI Temp,Bx00000111
OUT TCCR1B,Temp
LDI Temp,Bx00100000
OUT TIMSK,Temp
sei

loop: NOP
      NOP
      RJMP loop

tc1i:    CPL LED
reti

Nahlásit jako SPAM
IP: 88.102.50.–
21. 1. 2014   #2
-
0
-

Signál 10Hz, dejme tomu, že se střídou 1:1, tzn. 5 ms bude výstup v H a 5 ms v L. Časovač nastavíš tak aby pracoval v autoreload a generoval přerušení každých 5ms (TCR1B bych spíš volil 0x11). Dále musíš povolit obsluhu přerušení od časovače. Důležité je mít příslušný port nastavený jako výstup.

ICR1 = 5000
TCR1A = 0x00
TCR1B = 0x11   - autoreload s hodnotou v ICR1, bez předděliče
TIMSK = 0x20  - to máš asi dobře

přístup k 16-bitovým registrům viz http://www.atmel.com/Images/doc2503.pdf str 89

Doporučuji si to odkrokovat v Atmel Studiu

"čekací" smyčka by stačila

cosi:  rjmp cosi

S ohledem na spotřebu by bylo vhodnější přejít do Idle Mode. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Tomáš
~ Anonymní uživatel
560 příspěvků
21. 1. 2014   #3
-
0
-

#2 hlucheucho
A nemohl bych tě poprosit, jestli bys mi ten program neupravil tak, aby fungoval podle zadání? Mám to mít na čtvrtek a k tomu dalších kupu věcí a vůbec nestíhám :( klidně se odměním... AVR mi hází chybu hned u řádku .Def LED = pom (očekává registr) Jinak proč v ICR1 = 5000? Však na 16Mhz krystalu je cyklus za 62,5 nS (vyčetl jsem na netu) tzv 50ms/62,5nS = 800 000 cyklu a já si právě nastavil předděličku na /64 mi to vychází na hodnotu nějakých 12500 do ICR1...

Nahlásit jako SPAM
IP: 88.102.50.–
KIIV
~ Moderátor
+43
God of flame
21. 1. 2014   #4
-
0
-

pokud mas generovat jen ten signal, tak je preruseni naprosta zbytecnost pridavajici akorat mirne odchylky v case prechodu - protoze neni zaruceno, ze zacne vzdy presne stejne...

pritom ma citac i mod, kdy muze primo prepinat vystupy pri preteceni (dosazeni owerflow) a procesor muze jen spat, ani se nemusi probouzet kvuli preruseni.. nebo nastavis PWM rezim kdy prepnuti das na 12500-1 a overflow na 25000

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Tomáš
~ Anonymní uživatel
560 příspěvků
21. 1. 2014   #5
-
0
-

#4 KIIV
No má to být jen program na blikání LED frekvencí 10Hz. Dělal jsem to přes čekací smyčku, ale chce to po nás přes přerušení od čítače/časovače :/ A s tím už si moc právě rady nevím

Nahlásit jako SPAM
IP: 88.102.50.–
21. 1. 2014   #6
-
0
-

Jsem předpokládal použití vnitřního RC 1 MHz. Pro 16MHz krystal je třeba zvolit jiné nastavení předděliče a autoreload hodnoty. Jen tuším - procesor na externí krystal musíš přepnout. To je zápis do nějakého registru... ale to je třeba nastudovat příslušnou kapitolu z datasheetu.

Zadání jsem pochopil tak, že je to školní úloha. Takže využítí HW - přepínání výstupu při shodě apod. asi nepřichází v úvahu (ikdyž mne to taky napadlo). V reálné aplikaci bych se k využití možností HW přikláněl mnohem více než k SW obsluze přerušení.

Logiku školních úloh často nechápu - mají tendenci dělat jednoduché věci složitě a současně "mistrovsky" skrývají skutečný cíl - zde asi pochopit práci s časovačem a obsluhou jeho přerušení.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Tomáš
~ Anonymní uživatel
560 příspěvků
21. 1. 2014   #7
-
0
-

#6 hlucheucho
No já to zkoušel dělat podle tohoto postupu http://www.solarskit.wz.cz/avrprogramming.html 

OFF: nebyl by někdo ochotný mi ten program udělat? :/ Co a jak funguje si pak vše zjistím, ale sám ho asi nenapíšu tak, aby byl fukční.. Kdyby měl někdo chvilku...Věřím, že pro někoho, kdo tomu rozumí to bude práce na 10 minut.. Moc by jste mi pomohli

Nahlásit jako SPAM
IP: 88.102.50.–
KIIV
~ Moderátor
+43
God of flame
21. 1. 2014   #8
-
0
-

#6 hlucheucho
je pravda, ze skolni ulohy jsou casto priserne nelogicke a kazi lidi v tom, ze nepripousteji lepsi (jine) reseni. V realu se takove "skvele zadani" idealne diskutuje, zmeni se pozadavky a udela se to poradne.

Ne to delat jako indove "sef to rekl, tak to naplacame presne jak to chce, at uz he to blbost nebo ne"

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Tomáš
~ Anonymní uživatel
560 příspěvků
21. 1. 2014   #9
-
0
-

#8 KIIV
To je ale právě bohužel případ našeho učitele... 

Nahlásit jako SPAM
IP: 88.102.50.–
21. 1. 2014   #10
-
0
-

Každá instrukce má předepsáno s jakými operandy pracuje (registr, místo v paměti adresované přímo, místo v paměti adresované nepřímo..... ). To musíš dodržet, jinak překladač napíše chybu.

10 minut....  studování instr. sady zabere víc času, jsem AVR v Assembleru nikdy nedělal. Když ti sem plácnu výstup z překladače, tak se nebudeš stačit divit, kolik tam toho je. A při tom je to úloha na několik málo instrukcí.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
21. 1. 2014   #11
-
0
-

#8 KIIV
Indové? A já si myslel, že je to typicky český přístup - slýchám to velice často.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
21. 1. 2014   #12
-
0
-

#11 hlucheucho
co sem slysel o indech, tak tem skoro musis rict cely program presne jak ma byt.. jsou schopni z jednoducheho zadani s 10 unittesty udelat neco ve smyslu  "provedu prvni unit test, ohnu aplikaci aby prosla" "provedu dalsi unittest, pokud neprosel, zmenim aplikaci aby proslo (ale prvni unittest samozrejme nezopaknu)" a rekurze :D

true story :)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
21. 1. 2014   #13
-
0
-

#12 KIIV
potěš koště (smajlík, kterýmu by šli oči v sloup jsem nenašel....)

hu

Nahlásit jako SPAM
IP: 195.178.67.–
21. 1. 2014   #14
-
0
-

Zkus to psát po částech a pro zjednodušení některé kroky vynech. První zjednodušení je vynechat externí krystal a použít 1MHz vnitřní RC - ten naskočí po resetu sám, je to "default clock source"

První krok je nastavit port jako výstup a zkusit dostat konstantu na port, na to by měly stačit dvě instrukce zápisu do registrů. Pak se pokusit nastavit časovač aspoň do správného módu ikdyž se netrefí frekvence. Pro simulaci v Atmel Studiu by bylo dobré tu frekvenci citelně zvýšit, nebudeš tak dlouho čekat na vyvolání přerušení.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
21. 1. 2014   #15
-
0
-

Jinak pro 16MHz by bylo možné použít předdělič nastavený na 8 a autoreload pak 10 000.

Jak to funguje: na vstupu časovače je 2MHz po vydělení kmitočtu oscilátoru osmi. Takže časovač změní svůj stav jednou za 0,5 mikrosekundy ("časová jednotka" časovače). Potřebuji přerušení po 5 000 mikrosekundách.  Časovač musí napočítat 10 000 časových jednotek.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Tomáš
~ Anonymní uživatel
560 příspěvků
21. 1. 2014   #16
-
0
-

#15 hlucheucho
Udělám to jak říkáš s vnitřní RC, to bude jednodušší. A jen u nastavení portu (když dám výstupní portA a chci výstupní frekvenci na pin třeba PA0... Tak jak potom provedu při přerušení negaci pinu?

Nahlásit jako SPAM
IP: 88.102.50.–
21. 1. 2014   #17
-
0
-

Jak funguje XOR?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Tomáš
~ Anonymní uživatel
560 příspěvků
21. 1. 2014   #18
-
0
-

#17 hlucheucho
A nemohl bych použít NOT?

Nahlásit jako SPAM
IP: 88.102.50.–
21. 1. 2014   #19
-
0
-

Ten jsem v inst. sadě nenašel. Našel jsem instrukce set/clear bit. XOR bude asi použitelný lépe, jednou instrukcí zneguješ stav portu bez ovlivnění ostatních.  PORTA = PINA xor 0x01 neguje LSB.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Tomáš
~ Anonymní uživatel
560 příspěvků
21. 1. 2014   #20
-
0
-

#19 hlucheucho
To vypadá dobře, díky

Nahlásit jako SPAM
IP: 88.102.50.–
21. 1. 2014   #21
-
0
-

akorát to musíš zapsat "assemblerovsky"

hu

Nahlásit jako SPAM
IP: 195.178.67.–
21. 1. 2014   #22
-
0
-

Negaci LSB u portu A uděláš takto:

   LDI R16, 1;	XOR je jen registr - registr

   IN  R17, PINA
   EOR R17, R16
   OUT PORTA, R17

Pro blikání LEDkou by asi stačilo:

   LDI R16, 1
   LDI R17, 0

   EOR R17, R16
   OUT PORTA, R17

Instrukce LDI provedeš jen jednou, stačí si registry nechat přednastavené

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 65 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý