Operácie

Tester Arduina: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
Riadok 362: Riadok 362:
=== Overenie ===
=== 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.  
<strong>Program otestujeme prostredníctvom terminálu v AtmlSTudio nasledovne:</strong>
Na konci uvádzame fotku hotového zariadenia.
 
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:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]

Verzia z 22:26, 21. apríl 2025

Záverečný projekt predmetu MIPS / LS2025 - Meno Priezvisko


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

Vývojová doska ARDUINO UNO.

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


Schéma zapojenia.


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


Aplikácia.

Video:



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