Operácie

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

Z SensorWiki

(Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2023 - '''Meno Priezvisko''' == Zadanie == <li value="11"> Kalkulačka v pevnej rádovej číarke. +-XXX.xx. Dekadické čísl…“)
 
Riadok 1: Riadok 1:
Záverečný projekt predmetu MIPS / LS2023 - '''Meno Priezvisko'''
+
Záverečný projekt predmetu MIPS / LS2023 - '''Jozef Záhora'''
  
  
 
== Zadanie ==
 
== Zadanie ==
  
  <li value="11"> Kalkulačka v pevnej rádovej číarke. +-XXX.xx. Dekadické čísla budú zadávané cez terminál (program odchytí, číslo, vypíše, odchytí znamienko: +,-,*,/,= druhé číslo a vypíše výsledok)
+
  <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.
 
 
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
 
  
 
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
 
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
Riadok 12: Riadok 10:
 
'''Literatúra:'''  
 
'''Literatúra:'''  
 
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
 
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
+
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentácia k ATmega328p]
  
  
Riadok 19: Riadok 17:
 
== Analýza  a opis riešenia ==
 
== Analýza  a opis riešenia ==
  
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
+
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.
 
 
[[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
 
 
 
Nezabudnite doplniť schému zapojenia!
 
  
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
+
[[Súbor:TerminalExample.png]]
  
 +
Ukážka práce s Terminalom vrátane správneho nastavenia parametrov.
  
 
=== Algoritmus a program ===
 
=== Algoritmus a program ===
  
Algoritmus programu je....
+
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.
  
  
 
<tabs>
 
<tabs>
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
+
<tab name="Program pre terminálovú kalkulačku"><source lang="c++" style="background: LightYellow;">
 
#include <avr/io.h>
 
#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)
 
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;
 +
}
 +
 +
</source></tab>
 +
<tab name="uart.h"><source lang="c++" style="background: LightYellow;">
 +
#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_ */
 +
</source></tab>
 +
<tab name="uart.c"><source lang="c++" style="background: LightYellow;">
 +
#include "uart.h"
 +
#include <avr/io.h>
 +
#include <util/setbaud.h>
 +
 +
void uart_init( void )
 
{
 
{
   unsigned int measuredValue;
+
    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 */
 +
}
  
  while (1)
 
  {
 
    /*  relax  */ 
 
  }
 
  
  return(0);
+
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;
 
}
 
}
  
</source></tab>
 
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
 
#include <avr/io.h>
 
  
void adc_init(void);                                  // A/D converter initialization
+
void uart_puts(const char *s)
 +
{
 +
}
  
unsigned int adc_read(char a_pin);
+
char uart_getc(void) {
 +
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
 +
    return UDR0;
 +
}
 
</source></tab>
 
</source></tab>
 
</tabs>
 
</tabs>
  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':  
+
Kompletný projekt:  
 
 
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
  
 +
Zdrojový kód: [[Médiá:Zahora_semestralnyprojektMIPS.zip|terminalova_kalkulacka.zip]]
  
 
=== Overenie ===
 
=== Overenie ===
  
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 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 záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.
+
Na konci uvádzame fotku výpočtu v terminálovej kalkulačke.
 
 
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
 
  
'''Video:'''
+
[[Súbor:Terminalova_kalkulacka.png]]
<center><youtube>_l02MBu41n0</youtube></center>
 
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
+
Terminálová kalkulačka
  
 
[[Category:AVR]] [[Category:MIPS]]
 
[[Category:AVR]] [[Category:MIPS]]

Verzia zo dňa a času 12:21, 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.
    Vývojová doska ACROB.

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

    TerminalExample.png

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

    Terminálová kalkulačka