Operácie

Programovanie AVR v jazyku C: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Bez shrnutí editace
Balogh (diskusia | príspevky)
Riadok 32: Riadok 32:
<tabs>
<tabs>
<tab  name="AVR C"><source lang="cpp">
<tab  name="AVR C"><source lang="cpp">
#include <avr/io.h>


#define nieco
/* Pripojenie periferii k vyvojovej doske Arduino: */


main()
#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)
   while(1)
  {
    {  
   /* main program here */
                // 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 */


return(0); /* never happen */
}
}
</source></tab>
</source></tab>

Verzia z 21:24, 7. 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[REF 1] pomocou kompilátora avr-gcc.

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ť!


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ť.



Schéma zapojenia a prepojenie na doštičke.


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.

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í.


Schéma zapojenia a prepojenie na doštičke.


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.

Literatúra

  1. AVR035: Efficient C Coding for AVR. Application note.