Operácie

Hracia kocka s LED: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
Riadok 65: Riadok 65:
</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>


void adc_init(void);                                   // A/D converter initialization
void setup() {
    DDRB |= (1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0);
    DDRD |= (1 << PD7) | (1 << PD6) | (1 << PD5);


unsigned int adc_read(char a_pin);
    DDRD &= ~(1 << PD4);     // PD0 ??? ????
</syntaxhighlight ></tab>
    PORTD |= (1 << PD4);     // ???????? ????????
</tabs>
 
    srand(ADC);  // ????????????? ?????????? ????????? ?????
}
 
void clear_leds() {
    PORTB &= ~((1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0));
    PORTD &= ~((1 << PD7) | (1 << PD6) | (1 << PD5));
}
 
void set_leds(uint8_t number) {
    clear_leds();
 
    switch (number) {
        case 1:
            PORTD |= (1 << PD6);
            break;
        case 2:
            PORTB |= (1 << PB5);
            PORTD |= (1 << PD5);
            break;
        case 3:
            PORTB |= (1 << PB0) | (1 << PB3);
            PORTD |= (1 << PD6);
            break;
        case 4:
            PORTB |= (1 << PB5) | (1 << PB3) | (1 << PB0);
            PORTD |= (1 << PD5);
            break;
        case 5:
            PORTB |= (1 << PB5) | (1 << PB3) | (1 << PB0);
            PORTD |= (1 << PD5) | (1 << PD6);
            break;
        case 6:
            PORTB |= (1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0);
            PORTD |= (1 << PD5) | (1 << PD7);
            break;
        default:
            break;
    }
}
 
int main(void) {
    setup();
 
    uint8_t last_button = 1;
 
    while (1) {
        uint8_t button_state = (PIND & (1 << PD4)) == 0;
 
        if (button_state && last_button) {
            uint8_t rand_num = (rand() % 6) + 1;  // ?? 1 ?? 6
            set_leds(rand_num);
            _delay_ms(200);  // ???????????
        }
 
        last_button = button_state;
    }
}>


Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':  

Verzia z 23:23, 23. jún 2025

Záverečný projekt predmetu MIPS / LS2025 - Ilona Baihildina


Zadanie

V tomto projekte používam mikrokontrolér ATmega328P, ku ktorému je pripojených 7 LED diód a jedno tlačidlo. LED diódy sú pripojené k portom B a D. Po stlačení tlačidla sa vygeneruje náhodné číslo od 1 do 6 a podľa toho sa rozsvietia presne definované kombinácie LED diód. Po zapnutí zariadenia a stlačení tlačidla sa zobrazí nové náhodné číslo prostredníctvom svietenia konkrétnych LED diód. Každé číslo má vlastnú unikátnu kombináciu svietiacich diód. Projekt demonštruje prácu s náhodnými číslami, digitálnymi výstupmi a čítaním stavu tlačidla v jazyku C v prostredí AVR Studio.

Vývojová doska ACROB.

Literatúra:


Analýza a opis riešenia

• LED diódy sú nakonfigurované ako výstupné piny pomocou DDRx registrov.
• Tlačidlo je pripojené na vstupný pin PD0, so zapnutým vnútorným pull-up rezistorom.
• Kód využíva funkciu srand() na inicializáciu generovania náhodných hodnôt a rand() na výber čísla.
• Každé číslo je ošetrené cez switch-case, kde sa podľa hodnoty nastavujú výstupné stavy na jednotlivé piny.
• Pridaný je aj jednoduchý anti-drebezgový delay (200 ms) po každom stlačení tlačidla.


Použité komponenty

• 1× mikrokontrolér ATmega328P 
• 7× LED dióda (ľubovoľnej farby)
• 7× rezistor 220–330 Ω (zapojené v sérii s LED diódami)
• 1× tlačidlo (spínač, push-button)
• 1× doska s prepojeniami (breadboard) – nepájivé pole
• Prepojovacie vodiče (jumper wires) – muž–muž
• Zdroj napájania (napr. cez USB alebo externý 5V adaptér)
• (voliteľne) Kondenzátor a externý oscilátor 16 MHz – ak nepoužívaš Arduino Uno a máš čistý čip
Celkový pohľad na zariadenie.

Každá LED dióda je zapojená cez rezistor do výstupného pinu mikrokontroléra a druhou stranou do GND. Tlačidlo je zapojené medzi pin PD0 a GND, pričom v kóde je aktivovaný interný pull-up rezistor.

Schéma zapojenia.


Algoritmus a program

Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... Výpis kódu je nižšie...


<tabs>

#include <avr/io.h>

int main(void)
{
  unsigned int measuredValue;

  while (1)
  {
    /*  relax  */  
  }

  return(0);
}

<tab name="filename.h"><syntaxhighlight lang="c++" style="background: LightYellow;">

  1. define F_CPU 16000000UL
  2. include <avr/io.h>
  3. include <util/delay.h>
  4. include <stdlib.h>

void setup() {     DDRB |= (1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0);     DDRD |= (1 << PD7) | (1 << PD6) | (1 << PD5);

    DDRD &= ~(1 << PD4);     // PD0 ??? ????     PORTD |= (1 << PD4);     // ???????? ????????

    srand(ADC);  // ????????????? ?????????? ????????? ????? }

void clear_leds() {     PORTB &= ~((1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0));     PORTD &= ~((1 << PD7) | (1 << PD6) | (1 << PD5)); }

void set_leds(uint8_t number) {     clear_leds();

    switch (number) {         case 1:             PORTD |= (1 << PD6);             break;         case 2:             PORTB |= (1 << PB5);             PORTD |= (1 << PD5);             break;         case 3:             PORTB |= (1 << PB0) | (1 << PB3);             PORTD |= (1 << PD6);             break;         case 4:             PORTB |= (1 << PB5) | (1 << PB3) | (1 << PB0);             PORTD |= (1 << PD5);             break;         case 5:             PORTB |= (1 << PB5) | (1 << PB3) | (1 << PB0);             PORTD |= (1 << PD5) | (1 << PD6);             break;         case 6:             PORTB |= (1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0);             PORTD |= (1 << PD5) | (1 << PD7);             break;         default:             break;     } }

int main(void) {     setup();

    uint8_t last_button = 1;

    while (1) {         uint8_t button_state = (PIND & (1 << PD4)) == 0;

        if (button_state && last_button) {             uint8_t rand_num = (rand() % 6) + 1;  // ?? 1 ?? 6             set_leds(rand_num);             _delay_ms(200);  // ???????????         }

        last_button = button_state;     } }>

Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:

Zdrojový kód: zdrojaky.zip

Overenie

Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku hotového zariadenia.

Aplikácia.

Video:



Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.