Programovanie AVR v jazyku C: Rozdiel medzi revíziami
Zo stránky SensorWiki
Riadok 194: | Riadok 194: | ||
A možno aj toto video https://makeabilitylab.github.io/physcomp/arduino/assets/movies/Arduino_RGBLED_CommonAnode_Animation.mp4 | A možno aj toto video https://makeabilitylab.github.io/physcomp/arduino/assets/movies/Arduino_RGBLED_CommonAnode_Animation.mp4 | ||
Pri zapojení by vám teoreticky mohol pomôcť aj datasheet k dióde XX REF ale sami sa presvedčte, že zapojenie vývodov by ste v ňom hľadali márne. Pre porovnanie si pozrite datasheet k podobnej dióde XXX od seriózneho výrobcu, aby ste vvideli rozdiel v množstve poskytnutých informácií. | |||
* Datasheet http://cdn.sparkfun.com/datasheets/Components/LED/YSL-R596AR3G4B5C-C10.pdf (je to dobry priklad, ze cinsky datasheet je nanic, lebo tam nie je napisane ktory pin je ktora farba) | * Datasheet http://cdn.sparkfun.com/datasheets/Components/LED/YSL-R596AR3G4B5C-C10.pdf (je to dobry priklad, ze cinsky datasheet je nanic, lebo tam nie je napisane ktory pin je ktora farba) | ||
* Datasheet https://cdn-shop.adafruit.com/datasheets/FD-5WSRGB-A.PDF | * Datasheet https://cdn-shop.adafruit.com/datasheets/FD-5WSRGB-A.PDF | ||
OK | |||
https://www.mouser.sk/datasheet/2/216/WP154A4SEJ3VBDZGW-CA-1145236.pdf | |||
Verzia z 08:32, 8. február 2021
Na tomto cvičení prakticky len zopakujeme to čo sme robili pred týždňom, ale spravíme to v jazyku C pomocou kompilátora avr-gcc[REF 1].
Vzhľadom na obmedzený čas sa dostaneme naozaj len k základom, pre väčšie porozumenie odporúčame hlbšie preštudovať Application Notes od firmy Atmel, v ktorýcy sa opisuje ako efektívne programovať v jazyku C[REF 2] a preskúmať aj odporúčané tipy a triky[REF 3] pre programovanie 8-bitových mikropočítačov.
Navyše však pripojíme k mikropočítaču prvú externú súčiastku - tlačítko.
Úloha:
Na cvičení predvedieme pripojenie tlačítka, ktoré bude ovládať jednu LED diódu. Vašou úlohou bude pripojiť dve externé diódy a dve tlačítka a spraviť z nich preklápací R-S obvod.
1. Bezkontaktné prepojovacie pole
Bezkontaktné prepojovacie pole (breadboard) slúži na rýchle zapojenie jednoduchších obvodov bez potreby spájkovania. Vnútri v doštičke sa nachádzajú kontaktné pružinky, ktoré zabezpečia prepojenie medzi jednotlivými vývodmi. Prepojená je vždy jedna pätica kontaktov, okrem toho sú navzájom prepojené dlhé kontakty na okrajoch dosky určené na rozvod napájania (modré a červené). Napätie na tieto kontakty však musíte najprv priviesť!
![](/sensorwiki/images/thumb/3/3f/BreadboardIntro.png/800px-BreadboardIntro.png)
2. Ovládanie LED tlačítkom
Musíte si na doštičku zapojiť jedno tlačítko a dvoma drôtikmi pripojiť k Arduino doske. Časť schémy s LED diódou už zapojená je (preto je schéma bledšia). Potrebujeme teda zapojiť len tlačítko. Odpor R1 je ochranný, v prípade, že omylom nastavíte PB4 ako výstup a stlačíte tlačidlo, nedôjde ku skratu. Ak ste už skúsení a nebojíte sa, môžete ho vynechať.
Programy, s ktorými budeme ďalej pracovať.
#include <avr/io.h>
/* Pripojenie periferii k vyvojovej doske Arduino: */
#define LED1 PB5 // zabudovana dioda
#define SW1 PB4
int main(void)
{
/* SETUP */
/* Konfiguracia I/O: portB.5 je vystupny (LED1) a portB.4 je vstup (SW1) *
* naviac je PortB.4 so zapnutym pull-up rezistorom cez reg. PORTB */
DDRB = 0b00100000; // PORTB: LED1 na PB5 je output, SW1 (PB4) input
PORTB = 0b00010000; // LED Active low, LED off, pull-up ON
/* Ak nechceme menit cely register, ale len jeden bit, potom pouzijeme *
* niektoru z nasledovnych konstrukcii, vsetky su ekvivalentne */
DDRB = DDRB | 0b00100000;
DDRB = DDRB | 0x20;
DDRB = DDRB | (1<<5);
DDRB |= (1 << PB5);
DDRB |= (1 << LED1);
/* LOOP */
while(1)
{
// 0b00010000
if ( !(PINB & (1<<SW1)) ) // Ak je stlacene tlacitko (t.j. na vstupe log.0)...
{
PORTB |= (1<<LED1); // ... tak rozsviet LED, t.j. set PB5 na log. 1
} // predosly riadok prekladac vezme ako bitovu operaciu
else // ... v opacnom pripade
{
PORTB &= ~(1<<LED1); // zhasni LED, t.j. clear PB5 na log. 0
}
} /* end of while */
}
/* Pripojenie periferii k vyvojovej doske Arduino:
* LED Diody LED1 - D13 - PB5 (zabudovana)
* Tlacitka TLAC1 - D12 - PB4
*/
#define LED1 13
#define TLAC1 12
void setup()
{
pinMode(LED1, OUTPUT);
pinMode(TLAC1, INPUT_PULLUP);
}
void loop()
{
if (digitalRead(TLAC1))
digitalWrite(LED1, LOW);
else
digitalWrite(LED1,HIGH);
}
Ak ste si nie celkom istí, čo to v tom C-čku robíme s jednotlivými bitmi, prečítajte si podrobnejší článoček AVR Bit Magic.
Ako sa definujú konštanty, aby sme nemíňali vzácne miesto v RAM pamäti, sa dočítate tu AVR - Definície konštánt.
Ak si chceme programovanie ešte viac zjednodušiť a sprehľadniť, môžeme využiť zadefinované makrá a pridať k nim ešte definíciu svojich dvoch
vlastných
/* na testovanie su uz zadefinovane */
bit_is_set(PINB, SW1)
bit_is_clear(PINB, SW1)
/* na cakanie su preddefinovane slucky */
loop_until_bit_is_set(PINB, SW1); // cakanie na uvolnenie tlacitka
loop_until_bit_is_clear(PINB, SW1); // cakanie na stlacenie tlacitka
/* a oplati sa zadefinovat aj tieto dve makra */
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
Potom celý program môže vyzerať takto jednoducho
#include <avr/io.h>
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
/* Pripojenie periferii k vyvojovej doske Arduino: */
#define LED1 PB5 // zabudovana dioda
#define SW1 PB4 // pripojene tlacitko
int main(void)
{
/* SETUP */
/* Konfiguracia I/O: portB.5 je vystupny (LED1) a portB.4 je vstup (SW1) *
* naviac je PortB.4 so zapnutym pull-up rezistorom cez reg. PORTB */
set_bit(DDRB,LED1);
set_bit(PORTB,SW1);
/* LOOP */
while(1)
{
if ( bit_is_clear(PINB, SW1) ) // ak je stlacene tlacitko SW1
set_bit(PORTB,LED1); // LED1 = log.1
else // inak
clear_bit(PORTB,LED1); // LED1 = log.0
} /* end of while */
}
3. Ovládanie dvoch LED tlačítkami
Vašou úlohou teraz bude samostatne pripojiť k mikroprocesoru dve externé LED diódy a dve tlačítka. Schéma zapojenia aj prepojovací diagram je nižšie. Pozor, všimnite si, na ktoré porty sú privedené tlačítka a diódy. Túto informáciu budete potrebovať pri programovaní.
Vašou úlohou je naprogramovať R-S preklápací obvod. Funkcia obvodu je nasledovná: Po stlačení tlačidla SW2 sa rozsvieti dióda LED2 a ostane svietiť aj keď tlačidlo pustíte. Dióda LED3 zhasne.
Podobne pri stlačení tlačidla SW3 sa rozsvieti diída LED3 a dióda LED2 zhasne.
4. Bonus: RGB LED
RGB LED je dióda, ktorá má v jednom puzdre tri polovodičové čipy, ktoré generujú červené, zelené a modré svetlo. Ak zapojíte RGB diódu a k nej tri tlačítka, môžete si ich kombináciou vyskúšať generovať všetky odtiene. Odpory by ste mali asi použiť 1k, lebo je to nízkopríkonová (aspo+n sa tak javila).
Pomôže vám tento obrázok
A možno aj toto video https://makeabilitylab.github.io/physcomp/arduino/assets/movies/Arduino_RGBLED_CommonAnode_Animation.mp4
Pri zapojení by vám teoreticky mohol pomôcť aj datasheet k dióde XX REF ale sami sa presvedčte, že zapojenie vývodov by ste v ňom hľadali márne. Pre porovnanie si pozrite datasheet k podobnej dióde XXX od seriózneho výrobcu, aby ste vvideli rozdiel v množstve poskytnutých informácií.
- Datasheet http://cdn.sparkfun.com/datasheets/Components/LED/YSL-R596AR3G4B5C-C10.pdf (je to dobry priklad, ze cinsky datasheet je nanic, lebo tam nie je napisane ktory pin je ktora farba)
- Datasheet https://cdn-shop.adafruit.com/datasheets/FD-5WSRGB-A.PDF
OK https://www.mouser.sk/datasheet/2/216/WP154A4SEJ3VBDZGW-CA-1145236.pdf
TODO: odfotiť a nakresliť vlastnú schému, vyskúšať aj prúdy a rezistor. DOplniť nejaký správny datasheet, ktorý aspoň trocha korešponduje.
Literatúra
- ↑ AVR Libc Home Page.
- ↑ AVR035: Efficient C Coding for AVR. Application note.
- ↑ AVR4027: Tips and Tricks to Optimize Your C Code for 8-bit AVR Microcontrollers . Application note.