Tester Arduina: Rozdiel medzi revíziami
Zo stránky SensorWiki
(7 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
Záverečný projekt predmetu MIPS / LS2025 - ''' | Záverečný projekt predmetu MIPS / LS2025 - '''Miloslav Kráľ''' | ||
Riadok 46: | Riadok 46: | ||
• UART prevodník integrovaný cez USB. | • UART prevodník integrovaný cez USB. | ||
<strong>Datasheet ATmega328P:</strong> | <strong>Datasheet ATmega328P:</strong> https://www.mouser.sk/datasheet/2/268/Atmel_7810_Automotive_Microcontrollers_ATmega328P_-3499768.pdf | ||
<strong>2.2 Hardvérové zapojenie</strong> | <strong>2.2 Hardvérové zapojenie</strong> | ||
Riadok 64: | Riadok 64: | ||
<strong>Popis algoritmu</strong> | <strong>Popis algoritmu</strong> | ||
<strong>1.</strong> Štart: | <strong>1.</strong> Štart: trojité bliknutie LED na PB5. | ||
<strong>2.</strong> Inicializácia UART na 9600 bps. | <strong>2.</strong> Inicializácia UART na 9600 bps. | ||
<strong>3.</strong> V | <strong>3.</strong> V slučke: | ||
• Čakanie na | • Čakanie na vstupný znak (jednoznakový prefix I, L, H, T, ?). | ||
• Ak je prefix I | • Ak je prefix I | ||
<strong>a)</strong> Ďalší znak *: prečítaj všetky piny 0–13. | <strong>a)</strong> Ďalší znak *: prečítaj všetky piny 0–13. | ||
<strong>b)</strong> | <strong>b)</strong> Ak je číslo: vyberie konkrétny pin, nastaví ho ako vstup a následne načíta logický stav. | ||
• Ak je prefix L alebo H | • Ak je prefix L alebo H | ||
<strong>c)</strong> Načíta číslo pinu, | <strong>c)</strong> Načíta číslo pinu, nastaví ho ako výstup a zapíše 0/1. | ||
• Ak je prefix T | • Ak je prefix T | ||
<strong>d)</strong>Načíta číslo pinu, | <strong>d)</strong>Načíta číslo pinu, nastaví ho ako výstup a zabliká trikrát. | ||
• Ak je prefix ? | • Ak je prefix ? | ||
<strong>e)</strong>Vypíše | <strong>e)</strong>Vypíše help. | ||
<strong>4.</strong> V prípade neznámeho príkazu vypíše | <strong>4.</strong> V prípade neznámeho príkazu vypíše "Neznámy príkaz". | ||
Riadok 314: | Riadok 314: | ||
char uart_getc( void ); | char uart_getc( void ); | ||
</syntaxhighlight ></tab> | </syntaxhighlight ></tab> | ||
Riadok 358: | Riadok 356: | ||
} | } | ||
</syntaxhighlight ></tab> | </syntaxhighlight ></tab> | ||
</tabs> | </tabs> | ||
<strong>Zdrojový kód:</strong> [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]] | |||
=== Overenie === | |||
<strong>Program otestujeme prostredníctvom terminálu v AtmlSTudio nasledovne:</strong> | |||
1. Pripojeným Arduina cez USB | |||
2. Otvoreným Serial Terminalu ((9600 bps, 8N1, zaškrtnutím Add \r\n).) | |||
3. Napíšeme napríklad jeden z nižšie uvedených príkladoch: | |||
• ? → vypíše zoznam príkazov z funkcie help | |||
• L13 → LED na D13 zhasne | |||
• H13 → LED na D13 svieti | |||
• T13 → LED blikne trikrát | |||
• I* → vypíše stav všetkých pinov | |||
<strong>Príklad výstupu overovaného programu:</strong> | |||
Tester AVR pripraveny. Zadaj '?' pre pomoc. | |||
? | |||
--- Arduino Tester pre AVR --- | |||
In - nacita pin n (napr. I5) | |||
Ln - nastav pin n na LOW | |||
... | |||
[[Súbor: | [[Súbor:hotove_zariadenie.png|400px|thumb|center|Uno ATmega328P-PU]] | ||
'''Video:''' | '''Video:''' |
Aktuálna revízia z 22:36, 21. apríl 2025
Záverečný projekt predmetu MIPS / LS2025 - Miloslav Kráľ
Ovládanie cez terminál, rozpoznať by mal nasledovné príkazy:
- In - stav na pine n,
- I* stav na vsetkych,
- Ln - Low na pin n,
- Hn - high na pin n
- ? - help
Napriklad L3 nastavi vystup D3 na Low, I7 precita stav na vstupe D7 a ? vypise zoznam prikazov.
Zadanie
Cieľom je vytvoriť program v prostredí Atmel Studio / AVR Studio pri komunikácií s ATmega328P. Program by mal obsahovať nasledujúce body:
1. Inicializácia knižníc UART na komunikáciu medzi Arduino-m a počítačom cez terminál (terminál v prostredí AtmelStudio)
2. Rozpoznávanie a spracovávanie príkazov v termináli:
• In – načíta stav na pine n (napr. I5) • I* – načíta stav na všetkých pinoch • Ln – nastaví pin n na LOW (napr. L3) • Hn – nastaví pin n na HIGH (napr. H10) • Tn – trojnásobne zabliká LED na pine n (napr. T13) • ? – zobrazí nápovedu
3. Na základe zadaných príkazov zmení stav pinov (INPUT/OUTPUT) a zároveň ich číta / zapisuje ich stavy.
4. Pri štarte Arduina UNO nám na pine PB5 LED-ka trikrát zabliká.

Literatúra:
Analýza a opis riešenia
2.1 Použité komponenty
• Vývojová doska Arduino UNO (ATmega328P-PU, 16 MHz).
• UART prevodník integrovaný cez USB.
Datasheet ATmega328P: https://www.mouser.sk/datasheet/2/268/Atmel_7810_Automotive_Microcontrollers_ATmega328P_-3499768.pdf
2.2 Hardvérové zapojenie
Arduino UNO už má všetky porty pripojené na pull-up rezistory a následne vyvedené na konektory:
• D0–D7 → port D
• D8–D13 → port B

Algoritmus a program
Popis algoritmu
1. Štart: trojité bliknutie LED na PB5.
2. Inicializácia UART na 9600 bps.
3. V slučke:
• Čakanie na vstupný znak (jednoznakový prefix I, L, H, T, ?). • Ak je prefix I
a) Ďalší znak *: prečítaj všetky piny 0–13. b) Ak je číslo: vyberie konkrétny pin, nastaví ho ako vstup a následne načíta logický stav.
• Ak je prefix L alebo H
c) Načíta číslo pinu, nastaví ho ako výstup a zapíše 0/1.
• Ak je prefix T
d)Načíta číslo pinu, nastaví ho ako výstup a zabliká trikrát.
• Ak je prefix ?
e)Vypíše help.
4. V prípade neznámeho príkazu vypíše "Neznámy príkaz".
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include "uart.h"
FILE output = FDEV_SETUP_STREAM(uart_putc,NULL,_FDEV_SETUP_WRITE);
//Aby sme komunikovali a Arduinom pomocou Terminalu v AtmelStudio musíme zaškrnúť -> Add \r\n
void print_help() {
uart_puts("\r\n--- Arduino Tester pre AVR ---\r");
uart_puts("In - nacita pin n (napr. I5)\r");
uart_puts("Ln - nastav pin n na LOW\r");
uart_puts("Hn - nastav pin n na HIGH\r");
uart_puts("Tn - 3x blikne LED na pine n\r");
uart_puts("? - zobraz napovedu\r\n");
}
void pinModeOutput(uint8_t pin) {
if (pin < 8)
DDRD |= (1 << pin); // PD0-PD7
else if (pin < 14)
DDRB |= (1 << (pin - 8)); // PB0-PB5
}
void pinModeInput(uint8_t pin) {
if (pin < 8)
DDRD &= ~(1 << pin);
else if (pin < 14)
DDRB &= ~(1 << (pin - 8));
}
void digitalWritePin(uint8_t pin, uint8_t val) {
if (pin < 8) {
if (val)
PORTD |= (1 << pin);
else
PORTD &= ~(1 << pin);
} else if (pin < 14) {
if (val)
PORTB |= (1 << (pin - 8));
else
PORTB &= ~(1 << (pin - 8));
}
}
uint8_t digitalReadPin(uint8_t pin) {
if (pin < 8)
return (PIND & (1 << pin)) != 0;
else if (pin < 14)
return (PINB & (1 << (pin - 8))) != 0;
return 0;
}
void blinkPin(uint8_t pin) {
pinModeOutput(pin);
for (int i = 0; i < 3; i++) {
digitalWritePin(pin, 1);
_delay_ms(200);
digitalWritePin(pin, 0);
_delay_ms(200);
}
}
int main(void) {
//zabliká nám LED-ka 3-krat keď ho spustime
DDRB |= (1<<5);
for (int i=0; i<3; i++) {
PORTB ^= (1<<5);
_delay_ms(200);
}
uart_init();
stdout = &output;
uart_puts("Tester AVR pripraveny. Zadaj '?' pre pomoc.\r\n");
while (1) {
char c = uart_getc();
if(c=='?'){
print_help();
}
else if(c=='I'){
c = uart_getc();
if(c>='0' && c<='9'){
int cislo1 = c-'0';
int cislo2 = -1;
c = uart_getc();
if(c>='0' || c<='9'){
cislo2 = c-'0';
}
int cislo;
if(cislo2>-1){
cislo = cislo1*10 + cislo2;
}
else{
cislo = cislo1;
}
if (cislo >= 14){
uart_puts("Zadany pin je mimo rozsah (0-13)\r");
}
else{
pinModeInput(cislo);
int hodnota = digitalReadPin(cislo);
printf("Pin %d = %s\r\n",cislo, hodnota ? "HIGH" : "LOW");
}
}
else if(c=='*'){
uart_puts("Stav vsetkych pinov:\n");
for(int i=0; i<14; i++){
pinModeInput(i);
int hodnota = digitalReadPin(i);
printf("Pin %d = %s\n",i, hodnota ? "HIGH" : "LOW");
}
uart_putc('\r');
}
}
else if(c=='L'){
c = uart_getc();
if(c>='0' && c<='9'){
int cislo1 = c-'0';
int cislo2 = -1;
c = uart_getc();
if(c>='0' || c<='9'){
cislo2 = c-'0';
}
int cislo;
if(cislo2>-1){
cislo = cislo1*10 + cislo2;
}
else{
cislo = cislo1;
}
if (cislo >= 14){
uart_puts("Zadany pin je mimo rozsah (0-13)\r");
}
else{
pinModeOutput(cislo);
digitalWritePin(cislo,0);
printf("Pin %d nastaveny na LOW\r\n",cislo);
}
}
}
else if(c=='H'){
c = uart_getc();
if(c>='0' && c<='9'){
int cislo1 = c-'0';
int cislo2 = -1;
c = uart_getc();
if(c>='0' || c<='9'){
cislo2 = c-'0';
}
int cislo;
if(cislo2>-1){
cislo = cislo1*10 + cislo2;
}
else{
cislo = cislo1;
}
if (cislo >= 14){
uart_puts("Zadany pin je mimo rozsah (0-13)\r");
}
else{
pinModeOutput(cislo);
digitalWritePin(cislo,1);
printf("Pin %d nastaveny na HIGH\r\n",cislo);
}
}
}
else if(c=='T'){
c = uart_getc();
if(c>='0' && c<='9'){
int cislo1 = c-'0';
int cislo2 = -1;
c = uart_getc();
if(c>='0' || c<='9'){
cislo2 = c-'0';
}
int cislo;
if(cislo2>-1){
cislo = cislo1*10 + cislo2;
}
else{
cislo = cislo1;
}
if (cislo >= 14){
uart_puts("Zadany pin je mimo rozsah (0-13)\r");
}
else{
blinkPin(cislo);
printf("Blikanie na pine %d\r\n",cislo);
}
}
}
else{
uart_puts("Neznamy prikaz. Zadaj '?' pre pomoc.\r\n");
}
}
}
void uart_init( void );
void uart_putc( char c );
void uart_puts( const char *s );
char uart_getc( void );
#define BAUD 9600
#define F_CPU 16000000UL
#define BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (BAUDRATE * 16UL))) - 1)
#include <avr/io.h>
#include <util/setbaud.h>
void uart_init(void) {
UBRR0H = 0;
UBRR0L = BAUD_PRESCALE; // pre 9600 baud pri 16 MHz
UCSR0B = (1 << RXEN0) | (1 << TXEN0); // povoliť RX a TX
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // 8-bit data, 1 stop bit
}
void uart_putc(char c)
{
if (c == '\n')
{
uart_putc('\r');
}
loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
UDR0 = c;
}
void uart_puts(const char *s)
{
while(*s!='\0')
{
uart_putc(*s++);
}
}
char uart_getc(void) {
loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
return UDR0;
}
Zdrojový kód: zdrojaky.zip
Overenie
Program otestujeme prostredníctvom terminálu v AtmlSTudio nasledovne:
1. Pripojeným Arduina cez USB
2. Otvoreným Serial Terminalu ((9600 bps, 8N1, zaškrtnutím Add \r\n).)
3. Napíšeme napríklad jeden z nižšie uvedených príkladoch:
• ? → vypíše zoznam príkazov z funkcie help • L13 → LED na D13 zhasne • H13 → LED na D13 svieti • T13 → LED blikne trikrát • I* → vypíše stav všetkých pinov
Príklad výstupu overovaného programu:
Tester AVR pripraveny. Zadaj '?' pre pomoc.
?
--- Arduino Tester pre AVR ---
In - nacita pin n (napr. I5)
Ln - nastav pin n na LOW
...

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