MIPS Úvodné cvičenie: Rozdiel medzi revíziami
Zo stránky SensorWiki
(48 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
Cieľom tohoto cvičenia je zistiť, či máte pripravené všetky potrebné nástroje na prácu a otestovať ich. | Cieľom tohoto cvičenia je zistiť, či máte pripravené všetky potrebné nástroje na prácu a otestovať ich. Okrem toho spravíme prvé kroky v assembleri. | ||
'''HW:''' Budete potrebovať iba FEIkársku dosku [[Acrob technical description|Acrob]] | |||
<ref group="REF">[[Acrob technical description]]</ref> | |||
alebo bežnú Arduino dosku a dokumentáciu k nej | |||
<ref group="REF">[http://marcusjenkins.com/wp-content/uploads/2014/06/ARDUINO_V2.pdf Arduino UNO V3 pinout]</ref> | |||
<ref group="REF">[http://marcusjenkins.com/wp-content/uploads/2014/06/nano.pdf Arduino Nano pinout diagram]</ref> | |||
i k samotnému procesoru<ref group="REF">Datasheet obvodu <S>Atmel</S> Microchip [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf ATmega328P]</ref>. | |||
Žiadne ďalšie komponenty zatiaľ nebudeme potrebovať. | |||
'''SW:''' Arduino IDE, Atmel Studio (postup uvedený nižšie) | |||
== Arduino == | == Arduino == | ||
Riadok 6: | Riadok 17: | ||
Hoci Arduino nebudeme poižívať bežne, jeho veľkou výhodou je, že to je veľmi rozšírený a preto aj dobre otestovaný systém. To znamená, že po nainštalovaní je všetko pripravené a malo by fungovať na prvý raz. | Hoci Arduino nebudeme poižívať bežne, jeho veľkou výhodou je, že to je veľmi rozšírený a preto aj dobre otestovaný systém. To znamená, že po nainštalovaní je všetko pripravené a malo by fungovať na prvý raz. | ||
# Stiahnite a naintalujte si najnovšiu verziu prostredia Arduino ([https://www.arduino.cc/ arduino.cc) | # Stiahnite a naintalujte si najnovšiu verziu prostredia Arduino ([https://www.arduino.cc/ arduino.cc], pre náročnejších existuje aj vyvíjané [https://github.com/arduino/arduino-pro-ide Arduino Pro IDE]) | ||
# Priamo z prostredia si otvorte príklad Blink (File -> Examples -> 01. Basic -> Blink) | # Priamo z prostredia si otvorte príklad Blink (File -> Examples -> 01. Basic -> Blink) | ||
# Zmeňte parameter funkcie delay z hodnoty 1000 na 200 | # Zmeňte parameter funkcie delay z hodnoty 1000 na 200<ref>Hodnotu delay meníme preto, lebo tento základný testovací program býva na doske často nahratý už od výrobcu, takže priamo po pripojení k USB sa LED dióda rozbliká s periódou 2sekundy. Zmenou hodnoty sa ubezpečíme, že skutočne funguje celý vývojový cyklus od prekladu cez linkovanie až po nahrávanie do procesora.</ref> | ||
# Nastavte správny typ vašej vývojovej dosky (Tools -> Board -> Arduino AVR Boards -> Arduino Uno / alebo Arduino Nano) | # Nastavte správny typ vašej vývojovej dosky (Tools -> Board -> Arduino AVR Boards -> Arduino Pro (pre Acrob) alebo Arduino Uno / alebo Arduino Nano)<ref>Najmä čínske klony Arduino Nano majú v sebe nahratú staršiu verziu bootloaderu, preto treba vybrať z menu Tools -> Procesor -> ATmega328 Old Bootloader</ref> | ||
# Nastavte správne číslo portu ku ktorému je doska pripojená (Tools -> Port -> ComX) | # Nastavte správne číslo portu ku ktorému je doska pripojená (Tools -> Port -> ComX)<ref>Číslo portu zistíte z Device Managera. Ten spustíte buď skratkou '''Windows + R''' a potom napíšete do políčka Open: '''devmgmt.msc''' Iná možnosť je, že poviete ''Hey Cortana,'' a potom ju požiadate ''Open Device Manager''.</ref> | ||
# Skompilujte program a nahrajte ho do dosky (Sketch -> Upload) a vizuálne skontrolujte či je všetko tak ako má byť. | # Skompilujte program a nahrajte ho do dosky (Sketch -> Upload) a vizuálne skontrolujte či je všetko tak ako má byť. | ||
Riadok 16: | Riadok 27: | ||
* Na základe informácií z prednášky skúste porozmýšľať, na čo slúži príkaz '''pinMode(13, OUTPUT)'''? Vedeli by ste povedať, čo a kde nastavuje? A čo '''digitalWrite(13, HIGH)''' | * Na základe informácií z prednášky skúste porozmýšľať, na čo slúži príkaz '''pinMode(13, OUTPUT)'''? Vedeli by ste povedať, čo a kde nastavuje? A čo '''digitalWrite(13, HIGH)''' | ||
* Ako najrýchlejšie viete blikať LEDkou? (t.j. aký najkratší impulz viete vygenerovať na výstupe) | * Ako najrýchlejšie viete blikať LEDkou? (t.j. aký najkratší impulz viete vygenerovať na výstupe) | ||
* Sledujte na osciloskope [ | * Viete nastaviť dva výstupy súčasne? | ||
* Sledujte na osciloskope<ref group="REF">James Lewis: ''[https://www.baldengineer.com/digitalwrite-on-a-logic-analyzer.html Benchmarking Arduino’s digitalWrite() with a Logic Analyzer]''<BR></ref> priebeh signálov na výstupe (predvedie cvičiaci). | |||
'''Poznámky:''' | '''Poznámky:''' | ||
<references /> | |||
== AVR Studio == | == AVR Studio == | ||
Zo stránky https://www.microchip.com/ | Zo stránky https://www.microchip.com/en-us/tools-resources/archives/avr-sam-mcus si nainštalujte niektorú verziu vývojového prostredia | ||
* '''[http://ww1.microchip.com/downloads/archive/NEWas5installer-stable-5.1.208-full.exe AVR Studio 5.1]''' je vhodný kompromis medzi veľkosťou a aktuálnosťou | * '''[http://ww1.microchip.com/downloads/archive/NEWas5installer-stable-5.1.208-full.exe AVR Studio 5.1]''' je vhodný kompromis medzi veľkosťou a aktuálnosťou | ||
* Najnovšia verzia [http://studio.download.atmel.com/7.0.2389/as-installer-7.0.2389-web.exe Atmel Studio 7] je pre naše účely zbytočne nafúknutá a nebudeme potrebovať podporu pre všetky procesory, ktoré ponúka | * <FONt Color="grey">Najnovšia verzia [http://studio.download.atmel.com/7.0.2389/as-installer-7.0.2389-web.exe Atmel Studio 7] je pre naše účely zbytočne nafúknutá a nebudeme potrebovať podporu pre všetky procesory, ktoré ponúka | ||
* Staršia verzia [http://ww1.microchip.com/downloads/archive/AvrStudio4Setup.exe AVR Studio 4] je oproti v5 naozaj malá a jednoduchá, ale treba si k nej doinštalovať zvlášť kompilátor avr-gcc, bez neho vie prostredie prekladať len z assembleru. Preto si predtým nainštalujte samostatný kompilátor [http://winavr.sourceforge.net/ WinAVR] | * Staršia verzia [http://ww1.microchip.com/downloads/archive/AvrStudio4Setup.exe AVR Studio 4] je oproti v5 naozaj malá a jednoduchá, ale treba si k nej doinštalovať zvlášť kompilátor avr-gcc, bez neho vie prostredie prekladať len z assembleru. Preto si predtým nainštalujte samostatný kompilátor [http://winavr.sourceforge.net/ WinAVR] | ||
</FONT> | |||
== AVR Assembler == | == AVR Assembler z príkazového riadku == | ||
Pre prvé pokusy si skúsime prácu len s assemblerom. | Pre prvé pokusy si skúsime prácu len s assemblerom<ref group="REF">[http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf AVR Instruction Set Manual]. Atmel, 2016.</ref>. | ||
V ľubovoľnom programátorskom editore napíšte nasledovný program a uložte si ho do C: | <span class="mw-customtoggle-2016" style="background:#e0e8ff">Nepovinná časť (kliknutím rozbaliť / zbaliť)</span> | ||
<div id="mw-customcollapsible-2016" class="mw-collapsible mw-collapsed"> | |||
V ľubovoľnom programátorskom editore napíšte nasledovný program a uložte si ho do C:\User\Meno\Documents pod názvom <source lang="shell" inline>program01.asm</source> | |||
<tabs> | <tabs> | ||
Riadok 52: | Riadok 69: | ||
Pri inštalácii AVR Studio 5 sa vám v zozname programov objavila ikonka '''AVR Studio Command Prompt''' | Pri inštalácii AVR Studio 5 sa vám v zozname programov objavila ikonka '''AVR Studio Command Prompt''' | ||
ak tam nie je, spustite ručne tento program | ak tam nie je, spustite ručne tento program | ||
<source lang="bat" inline>C:\Program Files (x86)\Atmel\AVR Studio 5.1\extensions\application\StudioCommandPrompt.exe</source> | |||
v najnovšej verzii ho nájdete tu | v najnovšej verzii ho nájdete tu | ||
<source lang="bat" inline>C:\Program Files (x86)\Atmel\Studio\7.0\Extensions\Application\StudioCommandPrompt.exe</source> | |||
Z príkazového riadku program preložíme (prípadne aj s --no-warn) | Z príkazového riadku program preložíme (prípadne aj s --no-warn) | ||
<source lang="bat" inline> avr-as -mmcu=atmega328p -o program01.elf program01.asm</source> | |||
a skontrolujeme výsledok prekladu | a skontrolujeme výsledok prekladu | ||
avr-objdump -d program01.elf | avr-objdump -d program01.elf | ||
Riadok 73: | Riadok 95: | ||
avr-objdump -m avr -D program01.hex | avr-objdump -m avr -D program01.hex | ||
=== | </DIV> <!-- rozbalovacia / zbalovacia cast --> | ||
== AVR Assembler v IDE == | |||
Podľa pokynov cvičiaceho si založte v IDE nový ASM projekt a vložte nasledovný zdrojový kód. | |||
<tabs> | |||
<tab name="program01-1.asm"><source lang="ca65"> | |||
START: SBI 0x04,5 ; DDRB.5 = 1 (t.j. Output) ; 2 SC | |||
LOOP: SBI 0x05,5 ; PORTB.5 = 1 (t.j. High, rozsviet LED) ; 2 SC | |||
CBI 0x05,5 ; PORTB.5 = 0 (t.j. Low, zhasni LED) ; 2 SC | |||
RJMP LOOP ; Skok na zaciatok ; 2 SC | |||
</source></tab> | |||
<tab name="program01-2.asm"><source lang="ca65"> | |||
.INCLUDE "m328def.inc" | |||
.ORG 0 | |||
START: SBI DDRB,PB5 ; DDRB.5 = 1 (t.j. Output) ; 2 SC | |||
LOOP: SBI PORTB,PB5 ; PORTB.5 = 1 (t.j. High, rozsviet LED) ; 2 SC | |||
CBI PORTB,PB5 ; PORTB.5 = 0 (t.j. Low, zhasni LED) ; 2 SC | |||
RJMP LOOP ; Skok na zaciatok ; 2 SC | |||
</source></tab> | |||
</tabs> | |||
Druhá verzia programu využíva pre prehľadnosť aj symbolické názvy registrov a bitov, tak ako | |||
sú uvedené v datasheete, napr. PORTB, DDRB. Ako tieto definície vyzerajú viď [https://github.com/DarkSector/AVR/blob/master/asm/include/m328def.inc m328def.inc] | |||
Program uložte, preložte a v simulátore odkrokujte. Sledujte dobu trvania jednotlivých príkazov. | |||
'''Pomoc 1:''' Ak by vám niečo nefungovalo alebo si nie ste istí nastaveniami, môžete si stiahnuť [http://senzor.robotika.sk/mmp/AVRAssembler5.zip pripravený celý projekt pre AVR Studio]. | |||
'''Pomoc 2:''' Ak AVR Studio naďalej nevie niečo preložiť, môže byť problém v tom, že vaše uživateľské meno obsahuje diakritiku alebo azbuku. Je to problém Win10, musíte si spraviť | |||
nejaké jednoduché username, napríklad Student alebo niečo podobné bez diakritiky a špeciálnych znakov. | |||
'''Odbočka:''' ak ostaneme len pri blikaní LED diódy, aká najvyššia frekvencia má zmysel? -> [[Diódy LED#Maximálna frekvencia]] | |||
== Časovanie slučiek == | |||
V prostredí Atmel Studio odsimulujeme a vypočítame / odmeriame ako dlho trvá jednoduchý cyklus. | |||
Založte si nový ASM projekt a vložte nasledovný kód. | |||
<tabs> | |||
<tab name="program02-1.asm"><source lang="ca65" style="background: LightBlue;"> | |||
START: SBI 0x04,5 ; DDRB.5 = 1 (t.j. Output) | |||
LOOP: | |||
SBI 0x05,5 ; PORTB.5 = 1 (t.j. High, rozsviet LED) | |||
LDI r18, 3 | |||
L1: DEC r18 | |||
BRNE L1 | |||
CBI 0x05,5 ; PORTB.5 = 0 (t.j. Low, zhasni LED) | |||
LDI r18, 3 | |||
L2: DEC r18 | |||
BRNE L2 | |||
JMP LOOP ; Skok na začiatok | |||
</source></tab> | |||
<tab name="program02-2.asm"><source lang="ca65" style="background: LightBlue;"> | |||
/* Ta ista verzia bez konkretnych adries a so symbolickymi nazvami */ | |||
.equ Value = 3 ; Hodnota pocitadla | |||
.def Index = r18 ; register na pocitadlo | |||
START: SBI DDRB,PB5 ; DDRB.5 = 1 (t.j. Output) | |||
LOOP: SBI PORTB,PB5 ; PORTB.5 = 1 (t.j. High, rozsviet LED) | |||
; nasleduje casova slucka for (int Index=Value; Index>0; Index--) { /* wait */ } | |||
LDI Index, Value ; pocitadlo Index ma hodnotu Value (3) | |||
L1: DEC Index ; odpocitaj 1 | |||
BRNE L1 ; ak este Index nie je 0, tak skoc na L1 | |||
CBI PORTB,PB5 ; PORTB.5 = 0 (t.j. Low, zhasni LED) | |||
LDI Index, Value ; taka ista casova slucka | |||
L2: DEC Index ; | |||
BRNE L2 ; pozor, nemoze byt L1! | |||
JMP LOOP ; Skok na začiatok | |||
</source></tab> | |||
</tabs> | |||
Potom ho preložíme a odkrokujeme podľa pokynov cvičiaceho. | |||
== Blink v AVR Assembleri == | |||
Na záver si vyskúšame jednoduchý program s časovou slučkou na reálnom zaridení. Využijeme na to predošlý program s jednoduchou vnorenou slučkou na dosiahnutie dlhšieho času. | |||
Aby ste si blikanie LED diódy aj videli ľudským okom, potrebujeme dosiahnuť dlhší interval, minimálne 100 ms. Preto spravíme tri do seba vnorené čakacie slučky, | |||
kotrými už dosiahneme požadované oneskorenie, ak blikanie LED diódy bude aj viditeľné. Na presné časovanie použijeme výpočet, alebo automatický generátor<ref group="REF">B. Mulvey, T. Morland: [http://darcy.rsgc.on.ca/ACES/TEI4M/AVRdelay.html AVR Delay Loop Calculator]</ref> | |||
<tabs> | |||
<tab name="program03.asm"><source lang="ca65" style="background: LightBlue;"> | |||
/* | |||
* Program03.asm | |||
* | |||
* LED Blink s periodou 200 ms a oneskorenie | |||
* delay vygenerovane tu http://darcy.rsgc.on.ca/ACES/TEI4M/AVRdelay.html | |||
* Created: 11. 1. 2021 13:32:24 | |||
*/ | |||
START: SBI 0x04,5 ; DDRB.5 = 1 (t.j. Output) | |||
LOOP: | |||
SBI 0x05,5 ; PORTB.5 = 1 (t.j. High, rozsviet LED) | |||
CALL DELAY | |||
CBI 0x05,5 ; PORTB.5 = 0 (t.j. Low, zhasni LED) | |||
CALL DELAY | |||
JMP LOOP ; Skok na začiatok | |||
; Assembly code auto-generated | |||
; by utility from Bret Mulvey | |||
; Delay 3 199 992 cycles | |||
; 199ms 999us 500 ns at 16 MHz | |||
DELAY: LDI r16, 17 | |||
LDI r17, 60 | |||
LDI r18, 201 | |||
L1: DEC r18 | |||
BRNE L1 | |||
DEC r17 | |||
BRNE L1 | |||
DEC r16 | |||
BRNE L1 | |||
NOP | |||
RET | |||
</source></tab> | |||
</tabs> | |||
Aby sme mohli preložený program aj nahrať do Arduino dosky, pridáme si do menu jeden príkaz, ktorý to spraví za nás. | |||
Otvoríme položku Tools -> External Tools (obr. vľavo) a vyplníme položky podľa obr. vpravo | |||
[[Súbor:avrStudioExternalTools01.png]][[Súbor:avrStudioExternalTools02.png]] | |||
Do políčka '''Title''' vložte názov, ktorý sa potom objaví aj v menu '''Tools''', napríklad Arduino Upload. | |||
Do políčka '''Command''' vložte | |||
C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe | |||
A do políčka '''Arguments''' vložte | |||
-C"C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" -v -patmega328p -carduino <FONT Color="red><B>-PCOM5</B></foNt> -b115200 -D -Uflash:w:"$(ProjectDir)Debug\$(ItemFileName).hex":i | |||
Pozor, tu uvedený port COM5 musíte zmeniť podľa toho, aké číslo portu pridelil systém vášmu Arduinu. | |||
Začiarknite aj položku Use Output window. | |||
Odteraz je nahrávanie do Arduina možné cez menu Tools -> Arduino Upload. | |||
Ak ste všetko spravili správne, mala by vám LED dióda blikať na doske s periódou 200 ms. | |||
'''Poznámka:''' nezaoberali sme sa samotným programovaním, ale zhrňme možnosti tu | |||
* paralelný programátor | |||
* programovanie cez SPI rozhranie (MISO/MOSI) | |||
* programovanie cez JTAG alebo debugWire | |||
* programovanie bootloaderom | |||
Sem si odložíme aj link na výpočet FUSEs: https://www.engbedded.com/fusecalc/ | |||
== Úlohy == | |||
Ak ste úspešne prišli až sem, pozrite si zadanie v Classroome a vyplňte formulár s otázkami. K zadaniu potom nahrajte aj fotografiu alebo video fungujúceho programu na vašom procesore. | |||
== Literatúra == | |||
<references group="REF" /> | |||
<BR><BR>'''Navigácia:''' [[Mikropočítačové systémy (MIPS)#Cvičenia| 🡅 Zoznam cvičení]] | [[Programovanie AVR v jazyku C|Nasledujúce cvičenie 🡆]] | |||
[[Category: AVR]][[Category: MIPS]] |
Aktuálna revízia z 18:27, 13. február 2024
Cieľom tohoto cvičenia je zistiť, či máte pripravené všetky potrebné nástroje na prácu a otestovať ich. Okrem toho spravíme prvé kroky v assembleri.
HW: Budete potrebovať iba FEIkársku dosku Acrob [REF 1] alebo bežnú Arduino dosku a dokumentáciu k nej [REF 2] [REF 3] i k samotnému procesoru[REF 4]. Žiadne ďalšie komponenty zatiaľ nebudeme potrebovať.
SW: Arduino IDE, Atmel Studio (postup uvedený nižšie)
Arduino
Hoci Arduino nebudeme poižívať bežne, jeho veľkou výhodou je, že to je veľmi rozšírený a preto aj dobre otestovaný systém. To znamená, že po nainštalovaní je všetko pripravené a malo by fungovať na prvý raz.
- Stiahnite a naintalujte si najnovšiu verziu prostredia Arduino (arduino.cc, pre náročnejších existuje aj vyvíjané Arduino Pro IDE)
- Priamo z prostredia si otvorte príklad Blink (File -> Examples -> 01. Basic -> Blink)
- Zmeňte parameter funkcie delay z hodnoty 1000 na 200[1]
- Nastavte správny typ vašej vývojovej dosky (Tools -> Board -> Arduino AVR Boards -> Arduino Pro (pre Acrob) alebo Arduino Uno / alebo Arduino Nano)[2]
- Nastavte správne číslo portu ku ktorému je doska pripojená (Tools -> Port -> ComX)[3]
- Skompilujte program a nahrajte ho do dosky (Sketch -> Upload) a vizuálne skontrolujte či je všetko tak ako má byť.
Úlohy:
- Na základe informácií z prednášky skúste porozmýšľať, na čo slúži príkaz pinMode(13, OUTPUT)? Vedeli by ste povedať, čo a kde nastavuje? A čo digitalWrite(13, HIGH)
- Ako najrýchlejšie viete blikať LEDkou? (t.j. aký najkratší impulz viete vygenerovať na výstupe)
- Viete nastaviť dva výstupy súčasne?
- Sledujte na osciloskope[REF 5] priebeh signálov na výstupe (predvedie cvičiaci).
Poznámky:
- ↑ Hodnotu delay meníme preto, lebo tento základný testovací program býva na doske často nahratý už od výrobcu, takže priamo po pripojení k USB sa LED dióda rozbliká s periódou 2sekundy. Zmenou hodnoty sa ubezpečíme, že skutočne funguje celý vývojový cyklus od prekladu cez linkovanie až po nahrávanie do procesora.
- ↑ Najmä čínske klony Arduino Nano majú v sebe nahratú staršiu verziu bootloaderu, preto treba vybrať z menu Tools -> Procesor -> ATmega328 Old Bootloader
- ↑ Číslo portu zistíte z Device Managera. Ten spustíte buď skratkou Windows + R a potom napíšete do políčka Open: devmgmt.msc Iná možnosť je, že poviete Hey Cortana, a potom ju požiadate Open Device Manager.
AVR Studio
Zo stránky https://www.microchip.com/en-us/tools-resources/archives/avr-sam-mcus si nainštalujte niektorú verziu vývojového prostredia
- AVR Studio 5.1 je vhodný kompromis medzi veľkosťou a aktuálnosťou
- Najnovšia verzia Atmel Studio 7 je pre naše účely zbytočne nafúknutá a nebudeme potrebovať podporu pre všetky procesory, ktoré ponúka
- Staršia verzia AVR Studio 4 je oproti v5 naozaj malá a jednoduchá, ale treba si k nej doinštalovať zvlášť kompilátor avr-gcc, bez neho vie prostredie prekladať len z assembleru. Preto si predtým nainštalujte samostatný kompilátor WinAVR
AVR Assembler z príkazového riadku
Pre prvé pokusy si skúsime prácu len s assemblerom[REF 6].
Nepovinná časť (kliknutím rozbaliť / zbaliť)
V ľubovoľnom programátorskom editore napíšte nasledovný program a uložte si ho do C:\User\Meno\Documents pod názvom program01.asm
.text
START: SBI 0x04,5 ; DDRB.5 = 1 (t.j. Output) ; 1 SC
LOOP: SBI 0x05,5 ; PORTB.5 = 1 (t.j. High, rozsviet LED) ; 2 SC
CBI 0x05,5 ; PORTB.5 = 0 (t.j. Low, zhasni LED) ; 2 SC
RJMP LOOP ; Skok na zaciatok ; 2 SC
.end ; Koniec
Pri inštalácii AVR Studio 5 sa vám v zozname programov objavila ikonka AVR Studio Command Prompt
ak tam nie je, spustite ručne tento program
C:\Program Files (x86)\Atmel\AVR Studio 5.1\extensions\application\StudioCommandPrompt.exe
v najnovšej verzii ho nájdete tu
C:\Program Files (x86)\Atmel\Studio\7.0\Extensions\Application\StudioCommandPrompt.exe
Z príkazového riadku program preložíme (prípadne aj s --no-warn)
avr-as -mmcu=atmega328p -o program01.elf program01.asm
a skontrolujeme výsledok prekladu
avr-objdump -d program01.elf
vidno, že tu ešte kompilátor nevie presne kam tento kód príde, preto je .rjmp .+0 a tak musíme spustiť ešte linker
avr-ld program01.elf -o program01.out
a znova skontrolujeme výsledok prekladu
avr-objdump -d program01.out
vyrobíme ešte .hex verziu pre programátor
avr-objcopy -O ihex program01.out program01.hex
a pošleme program do mikroprocesora
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude.exe" -C"C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" -v -patmega328p -carduino -PCOM4 -b115200 -D -Uflash:w:C:\Users\YourName\Documents\program01.hex:i
Ak by sme niekedy potrebovali disassembler, tak pre uplnost
avr-objdump -m avr -D program01.hex
AVR Assembler v IDE
Podľa pokynov cvičiaceho si založte v IDE nový ASM projekt a vložte nasledovný zdrojový kód.
START: SBI 0x04,5 ; DDRB.5 = 1 (t.j. Output) ; 2 SC
LOOP: SBI 0x05,5 ; PORTB.5 = 1 (t.j. High, rozsviet LED) ; 2 SC
CBI 0x05,5 ; PORTB.5 = 0 (t.j. Low, zhasni LED) ; 2 SC
RJMP LOOP ; Skok na zaciatok ; 2 SC
.INCLUDE "m328def.inc"
.ORG 0
START: SBI DDRB,PB5 ; DDRB.5 = 1 (t.j. Output) ; 2 SC
LOOP: SBI PORTB,PB5 ; PORTB.5 = 1 (t.j. High, rozsviet LED) ; 2 SC
CBI PORTB,PB5 ; PORTB.5 = 0 (t.j. Low, zhasni LED) ; 2 SC
RJMP LOOP ; Skok na zaciatok ; 2 SC
Druhá verzia programu využíva pre prehľadnosť aj symbolické názvy registrov a bitov, tak ako sú uvedené v datasheete, napr. PORTB, DDRB. Ako tieto definície vyzerajú viď m328def.inc
Program uložte, preložte a v simulátore odkrokujte. Sledujte dobu trvania jednotlivých príkazov.
Pomoc 1: Ak by vám niečo nefungovalo alebo si nie ste istí nastaveniami, môžete si stiahnuť pripravený celý projekt pre AVR Studio.
Pomoc 2: Ak AVR Studio naďalej nevie niečo preložiť, môže byť problém v tom, že vaše uživateľské meno obsahuje diakritiku alebo azbuku. Je to problém Win10, musíte si spraviť nejaké jednoduché username, napríklad Student alebo niečo podobné bez diakritiky a špeciálnych znakov.
Odbočka: ak ostaneme len pri blikaní LED diódy, aká najvyššia frekvencia má zmysel? -> Diódy LED#Maximálna frekvencia
Časovanie slučiek
V prostredí Atmel Studio odsimulujeme a vypočítame / odmeriame ako dlho trvá jednoduchý cyklus.
Založte si nový ASM projekt a vložte nasledovný kód.
START: SBI 0x04,5 ; DDRB.5 = 1 (t.j. Output)
LOOP:
SBI 0x05,5 ; PORTB.5 = 1 (t.j. High, rozsviet LED)
LDI r18, 3
L1: DEC r18
BRNE L1
CBI 0x05,5 ; PORTB.5 = 0 (t.j. Low, zhasni LED)
LDI r18, 3
L2: DEC r18
BRNE L2
JMP LOOP ; Skok na začiatok
/* Ta ista verzia bez konkretnych adries a so symbolickymi nazvami */
.equ Value = 3 ; Hodnota pocitadla
.def Index = r18 ; register na pocitadlo
START: SBI DDRB,PB5 ; DDRB.5 = 1 (t.j. Output)
LOOP: SBI PORTB,PB5 ; PORTB.5 = 1 (t.j. High, rozsviet LED)
; nasleduje casova slucka for (int Index=Value; Index>0; Index--) { /* wait */ }
LDI Index, Value ; pocitadlo Index ma hodnotu Value (3)
L1: DEC Index ; odpocitaj 1
BRNE L1 ; ak este Index nie je 0, tak skoc na L1
CBI PORTB,PB5 ; PORTB.5 = 0 (t.j. Low, zhasni LED)
LDI Index, Value ; taka ista casova slucka
L2: DEC Index ;
BRNE L2 ; pozor, nemoze byt L1!
JMP LOOP ; Skok na začiatok
Potom ho preložíme a odkrokujeme podľa pokynov cvičiaceho.
Blink v AVR Assembleri
Na záver si vyskúšame jednoduchý program s časovou slučkou na reálnom zaridení. Využijeme na to predošlý program s jednoduchou vnorenou slučkou na dosiahnutie dlhšieho času. Aby ste si blikanie LED diódy aj videli ľudským okom, potrebujeme dosiahnuť dlhší interval, minimálne 100 ms. Preto spravíme tri do seba vnorené čakacie slučky, kotrými už dosiahneme požadované oneskorenie, ak blikanie LED diódy bude aj viditeľné. Na presné časovanie použijeme výpočet, alebo automatický generátor[REF 7]
/*
* Program03.asm
*
* LED Blink s periodou 200 ms a oneskorenie
* delay vygenerovane tu http://darcy.rsgc.on.ca/ACES/TEI4M/AVRdelay.html
* Created: 11. 1. 2021 13:32:24
*/
START: SBI 0x04,5 ; DDRB.5 = 1 (t.j. Output)
LOOP:
SBI 0x05,5 ; PORTB.5 = 1 (t.j. High, rozsviet LED)
CALL DELAY
CBI 0x05,5 ; PORTB.5 = 0 (t.j. Low, zhasni LED)
CALL DELAY
JMP LOOP ; Skok na začiatok
; Assembly code auto-generated
; by utility from Bret Mulvey
; Delay 3 199 992 cycles
; 199ms 999us 500 ns at 16 MHz
DELAY: LDI r16, 17
LDI r17, 60
LDI r18, 201
L1: DEC r18
BRNE L1
DEC r17
BRNE L1
DEC r16
BRNE L1
NOP
RET
Aby sme mohli preložený program aj nahrať do Arduino dosky, pridáme si do menu jeden príkaz, ktorý to spraví za nás. Otvoríme položku Tools -> External Tools (obr. vľavo) a vyplníme položky podľa obr. vpravo
Do políčka Title vložte názov, ktorý sa potom objaví aj v menu Tools, napríklad Arduino Upload.
Do políčka Command vložte
C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe
A do políčka Arguments vložte
-C"C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" -v -patmega328p -carduino -PCOM5 -b115200 -D -Uflash:w:"$(ProjectDir)Debug\$(ItemFileName).hex":i
Pozor, tu uvedený port COM5 musíte zmeniť podľa toho, aké číslo portu pridelil systém vášmu Arduinu.
Začiarknite aj položku Use Output window.
Odteraz je nahrávanie do Arduina možné cez menu Tools -> Arduino Upload.
Ak ste všetko spravili správne, mala by vám LED dióda blikať na doske s periódou 200 ms.
Poznámka: nezaoberali sme sa samotným programovaním, ale zhrňme možnosti tu
- paralelný programátor
- programovanie cez SPI rozhranie (MISO/MOSI)
- programovanie cez JTAG alebo debugWire
- programovanie bootloaderom
Sem si odložíme aj link na výpočet FUSEs: https://www.engbedded.com/fusecalc/
Úlohy
Ak ste úspešne prišli až sem, pozrite si zadanie v Classroome a vyplňte formulár s otázkami. K zadaniu potom nahrajte aj fotografiu alebo video fungujúceho programu na vašom procesore.
Literatúra
- ↑ Acrob technical description
- ↑ Arduino UNO V3 pinout
- ↑ Arduino Nano pinout diagram
- ↑ Datasheet obvodu
AtmelMicrochip ATmega328P - ↑ James Lewis: Benchmarking Arduino’s digitalWrite() with a Logic Analyzer
- ↑ AVR Instruction Set Manual. Atmel, 2016.
- ↑ B. Mulvey, T. Morland: AVR Delay Loop Calculator
Navigácia: 🡅 Zoznam cvičení | Nasledujúce cvičenie 🡆