Operácie

Jednoduchá terminálová kalkulačka: Rozdiel medzi revíziami

Z SensorWiki

 
(8 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených)
Riadok 1: Riadok 1:
 
Záverečný projekt predmetu MIPS / LS2023 - '''Jozef Záhora'''
 
Záverečný projekt predmetu MIPS / LS2023 - '''Jozef Záhora'''
 +
== Zadanie ==
  
 +
Kalkulačka v pevnej rádovej číarke. +-XXX.xx. Dekadické čísla budú zadávané cez terminál, teda program odchytí číslo, vypíše ho; odchytí znamienko: +,-,*,/; následne aj druhé číslo a vypíše výsledok.
  
== Zadanie ==
 
  
<li value="11"> Kalkulačka v pevnej rádovej číarke. +-XXX.xx. Dekadické čísla budú zadávané cez terminál, teda program odchytí číslo, vypíše ho; odchytí znamienko: +,-,*,/; následne aj druhé číslo a vypíše výsledok.
 
 
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
 
  
 
'''Literatúra:'''  
 
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
+
* [https://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
 
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentácia k ATmega328p]
 
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentácia k ATmega328p]
  
Riadok 17: Riadok 15:
 
== Analýza  a opis riešenia ==
 
== Analýza  a opis riešenia ==
  
Komunikáciu dosky Acrob sme zabezpečili priojením na zbernicu USB (Universal Serial Bus). Žiadne externé súčiastky sme k doske Acrob nemuseli pripájať. Na vypisovanie čísel a znakov zadávaných používateľom sme použili jednoduchý program Serial Terminal by Bray.Prenosovú rýchlosť sme nastavili na 9600 Bd. Po spustení programu a pripojení terminálu používateľ zadá prvé číslo, ktoré bude program čítať až po stlačenie medzerníku. Následne používateľ zadá znamienko operáci, ktorú chce vykonať. Po vypísaní znamienka znovu používateľ zadá číslo, ktoré program číta až po medzeru. Následne čísla konvertuje z reťazca do čísla typu float. Program potom porovná znamienka, vykoná operáciu a vypíše výsledok.
+
Komunikáciu dosky Acrob sme zabezpečili priojením na zbernicu USB (Universal Serial Bus). Žiadne externé súčiastky sme k doske Acrob nemuseli pripájať. Na vypisovanie čísel a znakov zadávaných používateľom sme použili jednoduchý program Serial Terminal by Bray. Prenosovú rýchlosť sme nastavili na 9600 Bd. Po spustení programu a pripojení terminálu používateľ zadá prvé číslo, ktoré bude program čítať až po stlačenie medzerníku. Následne používateľ zadá znamienko operácie, ktorú chce vykonať. Po vypísaní znamienka znovu používateľ zadá číslo, ktoré program číta až po medzeru. Následne čísla konvertuje z reťazca do čísla typu float. Program potom porovná znamienka, vykoná operáciu a vypíše výsledok.
 
 
[[Súbor:TerminalExample.png]]
 
  
 
Ukážka práce s Terminalom vrátane správneho nastavenia parametrov.
 
Ukážka práce s Terminalom vrátane správneho nastavenia parametrov.
Riadok 159: Riadok 155:
 
Na konci uvádzame fotku výpočtu v terminálovej kalkulačke.
 
Na konci uvádzame fotku výpočtu v terminálovej kalkulačke.
  
[[Súbor:Terminalova_kalkulacka.png|400px|thumb|center|Terminalova kalkulacka.]]
+
[[Súbor:Priklad1.png|1000px|thumb|center|Terminalova kalkulacka.]]
 
+
[[Súbor:Priklad2.png|1000px|thumb|center|Terminalova kalkulacka.]]
Terminálová kalkulačka
+
Terminálová kalkulačka príklady
  
 
[[Category:AVR]] [[Category:MIPS]]
 
[[Category:AVR]] [[Category:MIPS]]

Aktuálna revízia z 16:30, 14. jún 2023

Záverečný projekt predmetu MIPS / LS2023 - Jozef Záhora

Zadanie

Kalkulačka v pevnej rádovej číarke. +-XXX.xx. Dekadické čísla budú zadávané cez terminál, teda program odchytí číslo, vypíše ho; odchytí znamienko: +,-,*,/; následne aj druhé číslo a vypíše výsledok. 


Literatúra:


Analýza a opis riešenia

Komunikáciu dosky Acrob sme zabezpečili priojením na zbernicu USB (Universal Serial Bus). Žiadne externé súčiastky sme k doske Acrob nemuseli pripájať. Na vypisovanie čísel a znakov zadávaných používateľom sme použili jednoduchý program Serial Terminal by Bray. Prenosovú rýchlosť sme nastavili na 9600 Bd. Po spustení programu a pripojení terminálu používateľ zadá prvé číslo, ktoré bude program čítať až po stlačenie medzerníku. Následne používateľ zadá znamienko operácie, ktorú chce vykonať. Po vypísaní znamienka znovu používateľ zadá číslo, ktoré program číta až po medzeru. Následne čísla konvertuje z reťazca do čísla typu float. Program potom porovná znamienka, vykoná operáciu a vypíše výsledok.

Ukážka práce s Terminalom vrátane správneho nastavenia parametrov.

Algoritmus a program

Algoritmus pre terminálovú kalkulačku sme naprogramovali nasledovne, pričom sme použili dve externé knižnice, ktoré nám boli poskytnuté počas semestra konkrétne uart.h a uart.c.


#include <avr/io.h>
#include <stdio.h>
#include "uart.h"

FILE uart_output = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
FILE uart_input  = FDEV_SETUP_STREAM(NULL, uart_getc, _FDEV_SETUP_READ);

int main(void)
{	
	uart_init();                  // Inicializacia seriovej linky
	stdout = &uart_output;		  // funkcia printf aktivna
    stdin = &uart_input;		  // funkcia scanf a getchar aktivna
	
    char p[7];					  //nastavenie premennych
	char d[7]; 
	int i=0, l;   
	int j=0, k;       
    char a,b,c,r;
	float x,y;

    while(1) {
		i=0;
		j=0;
		l=0;
		k=0;
		
		while((a=getchar()) != ' ') {		//nacitanie prveho cisla, az po stlacenie medzery
			p[i] = a;
			i++;
			}	
		for(l=0; l<=i-1;l++) {
			 printf("%c", p[l]);
			 } 
		
		c = getchar();						//nacitanie znamienka
        printf("%c", c);
	
		while((b=getchar()) != ' ') {		//nacitanie druheho cisla, az po stlacenie medzery
			d[j] = b;
			j++;
			}	
		for(k=0; k<=j-1;k++) {
			printf("%c", d[k]);
			}
			
        printf("=");
		
		x=atof(p);							//prepis retazca do cisla typu float
		y=atof(d);
			
		if(c=='+')printf("%.2f\n",x+y);			//porovnanie nacitaneho znamienka a vykonanie prislusnej operacie
		else if(c=='-')printf("%.2f\n",x-y);
		else if(c=='*')printf("%.2f\n",x*y);
		else if(c=='/')
			if(y!=0) printf("%.2f\n",x/y);
			else printf("\nError - Nulou sa nedeli.\n");	//keby druhe cislo bola nula nebude delit nulou
		else printf("\nError - Nespravna operacia.\n");		//v pripade zadanie zleho znaku, nevykona operaciu
		}					  
    return 0;
 }
#define BAUD 9600
#define F_CPU 16000000UL
#ifndef UART_H_
#define UART_H_
void uart_init( void );
     
void uart_putc( char c );
void uart_puts( const char *s );

char uart_getc( void );


#endif /* UART_H_ */
#include "uart.h"
#include <avr/io.h>
#include <util/setbaud.h>

void uart_init( void ) 
{
    UBRR0H = UBRRH_VALUE;
    UBRR0L = UBRRL_VALUE;

#if USE_2X
    UCSR0A |= _BV(U2X0);
#else
    UCSR0A &= ~(_BV(U2X0));
#endif

    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);   /* Enable RX and TX */
}


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)
{
}

char uart_getc(void) {
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
    return UDR0;
}

Kompletný projekt:

Zdrojový kód: terminalova_kalkulacka.zip

Overenie

Na používanie našej aplikácie stačií doska Acrob a aplikácia Terminál. Postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku výpočtu v terminálovej kalkulačke.

Terminalova kalkulacka.
Terminalova kalkulacka.

Terminálová kalkulačka príklady