Operácie

Tester obvodu 7400: Rozdiel medzi revíziami

Z SensorWiki

 
(24 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 4: Riadok 4:
 
== Zadanie ==
 
== Zadanie ==
  
Mojou úlohou bolo spraviť tester obvodu 7400 (4xNAND)
+
Mojou úlohou bolo spraviť tester obvodu 7400 (4xNAND), pripojeného k doske Arduino UNO
  
 
[[Obrázok: 7400testernand.jpg|400px|thumb|center|Obvod 7400 (4xNAND).]]
 
[[Obrázok: 7400testernand.jpg|400px|thumb|center|Obvod 7400 (4xNAND).]]
  
 
'''Literatúra:'''  
 
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
+
* [https://web.mit.edu/6.131/www/document/7400.pdf Dokumentácia k obvodu]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
+
 
  
  
Riadok 17: 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...
+
Obvod 7400 (4xNAND) je obvod, ktorý obsahuje štyri samostatné NAND brány, pričom každá brána má dva vstupy a jeden výstup. Najskôr som si musel zistiť PIN layout tohto obvodu a následne obvod správne zapojiť. Po zapojení som spravil program, ktorý posiela do obvodu kombinácie (1) jednotiek a (0) núl. Obvod kombinácie vyhodnotí a odošle hodnotu na základe danej kombinácie. Keďže to je NAND obvod, v prípade kombinácie 1-1 vracia 0, pre každú inú kombináciu vracia 1.
  
[[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
+
[[Súbor:pinlayout.jpg|400px|thumb|center|PIN layout obvodu.]]
  
Nezabudnite doplniť schému zapojenia!
+
=== Zapojenie ===
  
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
+
Zapojenie som realizoval zapojením pinu 1 na D8, 2 na D7 a 3 na D6. Pin 7 na GND a 14 na Vcc.
 +
[[Súbor:schema.png|400px|thumb|center|Schéma zapojenia obvodu 7400 (4xNAND).]]
  
  
Riadok 33: Riadok 34:
 
<tabs>
 
<tabs>
 
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
 
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
 +
#include <avr/io.h>
 +
#include <util/delay.h>
 +
#include <stdio.h>
 +
#include "uart.h"
 +
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
 +
#define F_CPU 16000000UL
 +
#define BAUD 9600
 +
 +
#define NAND_A_PIN PD6
 +
#define NAND_B_PIN PD7
 +
#define NAND_OUT_PIN PB0
 +
//Táto časť zahŕňa potrebné knižnice a definuje makrá a piny. Nastavuje komunikáciu cez UART.
 +
 +
 +
 +
void init_pins() {
 +
    DDRD |= (1 << NAND_A_PIN) | (1 << NAND_B_PIN);// Nastaví piny ako vstupy
 +
    DDRB &= ~(1 << NAND_OUT_PIN); // Nastaví pin ako výstup
 +
}
 +
 +
void send_input_signals(uint8_t a, uint8_t b) {
 +
    if (a) PORTD |= (1 << NAND_A_PIN);
 +
    else PORTD &= ~(1 << NAND_A_PIN);
 +
    if (b) PORTD |= (1 << NAND_B_PIN);
 +
    else PORTD &= ~(1 << NAND_B_PIN);
 +
}
 +
 +
uint8_t read_output_signal() {
 +
    return PINB & (1 << NAND_OUT_PIN);
 +
}
 +
//Funkcia init_pins() inicializuje piny mikrokontroléra, funkcia send_input_signals() nastavuje vstupné signály na pinoch PD6 a PD7 na základe parametrov a a b. Funkcia read_output_signal() číta výstupný signál z pinu PB0.
 +
 +
 +
 +
 +
int main() {
 +
    init_pins();
 +
    uart_init();
 +
    stdout = &mystdout;
 +
    printf("Kombinacie:\n");
 +
 +
    for (;;) {
 +
        send_input_signals(1, 0);
 +
        printf("Vystup pro 10: %d\r\n", read_output_signal());
 +
        _delay_ms(1000);
 +
 +
        send_input_signals(1, 1);
 +
        printf("Vystup pro 11: %d\r\n", read_output_signal());
 +
        _delay_ms(1000);
 +
 +
        send_input_signals(0, 1);
 +
        printf("Vystup pro 01: %d\r\n", read_output_signal());
 +
        _delay_ms(1000);
 +
 +
        send_input_signals(0, 0);
 +
        printf("Vystup pro 00: %d\r\n", read_output_signal());
 +
        _delay_ms(1000);
 +
    }
 +
 +
    return 0;
 +
}
 +
</source></tab>
 +
<tab name="uart.h"><source lang="c++" style="background: LightYellow;">
 +
/* ************************************************************************* */
 +
/* FileName:            uart.h                                              */
 +
/* ************************************************************************* */
 +
#define LED PB5  // internal on-board LED
 +
 +
/* na testovanie su uz zadefinovane */
 +
// bit_is_set(PINB, SW1)
 +
// bit_is_clear(PINB, SW1)
 +
 +
/* na cakanie su preddefinovane slucky */
 +
// loop_until_bit_is_set(PINB, SW1);    // cakanie na uvolnenie tlacitka
 +
// loop_until_bit_is_clear(PINB, SW1);  // cakanie na stlacenie tlacitka
 +
 +
 +
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
 +
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
 +
 +
#ifndef UART_H_
 +
#define UART_H_
 +
 +
#include <stdio.h>
 +
 +
#define BAUD_PRESCALE  (((F_CPU / (BAUDRATE * 16UL))) - 1)  // vzor?ek z datasheetu
 +
 +
void hw_init( void );
 +
void uart_init( void );
 +
   
 +
/* Following definition is compatible with STDIO.H, for more
 +
* information see https://www.appelsiini.net/2011/simple-usart-with-avr-libc/
 +
*/
 +
 +
int uart_putc( char c, FILE *stream );
 +
void uart_puts( const char *s );
 +
 +
char uart_getc( void );
 +
 +
void delay(int delay);
 +
 +
#endif /* UART_H_ */
 +
 +
</source></tab>
 +
<tab name="uart.c"><source lang="c++" style="background: LightYellow;">
 +
/* ************************************************************************* */
 +
/* FileName:            uart.c                                              */
 +
/* ************************************************************************* */
 +
 
#include <avr/io.h>
 
#include <avr/io.h>
 +
#include <util/delay.h>
 +
#include "uart.h"
 +
 +
void hw_init( void )
 +
{
 +
  DDRB |= (1<<LED);    // PORTB.5 kde je LED ma byt OUTPUT
 +
  /* sem si mozete dopisat svoje vlastne inicializacne prikazy */
 +
}
  
int main(void)
+
void uart_init( void )  
 
{
 
{
  unsigned int measuredValue;
+
//  for different BAUD rate change the project settings, or uncomment
 +
//  following two lines:
 +
// #undef  BAUD          // avoid compiler warning
 +
//  #define BAUD 115200
 +
 +
  #include <util/setbaud.h>  // requires defined BAUD
 +
 
 +
  UBRR0H = UBRRH_VALUE;
 +
  UBRR0L = UBRRL_VALUE;
 +
  #if USE_2X                // defined in setbaud.h
 +
    UCSR0A |= (1 << U2X0);
 +
  #else
 +
    UCSR0A &= ~(1 << U2X0);
 +
  #endif
  
  while (1)
 
  {
 
    /*  relax  */ 
 
  }
 
  
  return(0);
+
    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
 +
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);   /* Enable RX and TX */
 
}
 
}
  
</source></tab>
 
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
 
#include <avr/io.h>
 
  
void adc_init(void);                                   // A/D converter initialization
+
int uart_putc( char c, FILE *stream )
 +
{
 +
  if (c == '\n')
 +
      uart_putc('\r',stream);
 +
 
 +
  loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
 +
  UDR0 = c;
 +
  return 0;
 +
}
 +
 
 +
 
 +
void uart_puts(const char *s)
 +
{
 +
  /* toto je vasa uloha */
 +
}
 +
 
 +
char uart_getc(void)
 +
{
 +
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
 +
    return UDR0;
 +
}
 +
 
 +
void delay(int delay)      // vlastna funkcia pre dlhsie casy
 +
{
 +
  for (int i=1; i<=delay; i++)
 +
  _delay_ms(1);
 +
}
 +
 
  
unsigned int adc_read(char a_pin);
+
</source></tab>
 +
</tabs>
 +
//V tejto časti sa inicializujú piny, UART komunikácia, a je nastavený výstup pre stdout pre použitie funkcie printf(). Následne sa v nekonečnej slučke posielajú rôzne kombinácie vstupných signálov pomocou send_input_signals() a číta sa a vypisuje výstupný signál pomocou printf() a read_output_signal() do Serialu.
 
</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'':
 
  
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
+
Zdrojový kód: [[Médiá:Macáksemestrálna.zip|Macáksemestralna.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 overenie toho, či naozaj tento obvod funguje správne, použijeme Serial na vypisovanie kombinácií jednotiek a núl, a hodnôt, ktoré obvod vracia.
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.  
 
  
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
+
[[Súbor:7400obv.jpg|400px|thumb|center|Ukážka zapojeného obvodu.]]
  
 
'''Video:'''
 
'''Video:'''
<center><youtube>_l02MBu41n0</youtube></center>
+
<center><youtube>https://youtube.com/shorts/uJokjM96CD4</youtube></center>
 +
 
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
 
[[Category:AVR]] [[Category:MIPS]]
 
[[Category:AVR]] [[Category:MIPS]]

Aktuálna revízia z 09:22, 6. máj 2024

Záverečný projekt predmetu MIPS / LS2024 - Jakub Macák


Zadanie

Mojou úlohou bolo spraviť tester obvodu 7400 (4xNAND), pripojeného k doske Arduino UNO

Obvod 7400 (4xNAND).

Literatúra:


Analýza a opis riešenia

Obvod 7400 (4xNAND) je obvod, ktorý obsahuje štyri samostatné NAND brány, pričom každá brána má dva vstupy a jeden výstup. Najskôr som si musel zistiť PIN layout tohto obvodu a následne obvod správne zapojiť. Po zapojení som spravil program, ktorý posiela do obvodu kombinácie (1) jednotiek a (0) núl. Obvod kombinácie vyhodnotí a odošle hodnotu na základe danej kombinácie. Keďže to je NAND obvod, v prípade kombinácie 1-1 vracia 0, pre každú inú kombináciu vracia 1.

PIN layout obvodu.

Zapojenie

Zapojenie som realizoval zapojením pinu 1 na D8, 2 na D7 a 3 na D6. Pin 7 na GND a 14 na Vcc.

Schéma zapojenia obvodu 7400 (4xNAND).


Algoritmus a program

Algoritmus programu je....


#include <avr/io.h> 
#include <util/delay.h> 
#include <stdio.h> 
#include "uart.h" 
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
#define F_CPU 16000000UL
#define BAUD 9600

#define NAND_A_PIN PD6 
#define NAND_B_PIN PD7
#define NAND_OUT_PIN PB0
//Táto časť zahŕňa potrebné knižnice a definuje makrá a piny. Nastavuje komunikáciu cez UART.



void init_pins() {
    DDRD |= (1 << NAND_A_PIN) | (1 << NAND_B_PIN);// Nastaví piny ako vstupy
    DDRB &= ~(1 << NAND_OUT_PIN); // Nastaví pin ako výstup
}

void send_input_signals(uint8_t a, uint8_t b) {
    if (a) PORTD |= (1 << NAND_A_PIN);
    else PORTD &= ~(1 << NAND_A_PIN);
    if (b) PORTD |= (1 << NAND_B_PIN);
    else PORTD &= ~(1 << NAND_B_PIN);
}

uint8_t read_output_signal() {
    return PINB & (1 << NAND_OUT_PIN);
}
//Funkcia init_pins() inicializuje piny mikrokontroléra, funkcia send_input_signals() nastavuje vstupné signály na pinoch PD6 a PD7 na základe parametrov a a b. Funkcia read_output_signal() číta výstupný signál z pinu PB0.




int main() {
    init_pins();
    uart_init();
    stdout = &mystdout;
    printf("Kombinacie:\n");

    for (;;) {
        send_input_signals(1, 0); 
        printf("Vystup pro 10: %d\r\n", read_output_signal());
        _delay_ms(1000); 

        send_input_signals(1, 1); 
        printf("Vystup pro 11: %d\r\n", read_output_signal());
        _delay_ms(1000); 

        send_input_signals(0, 1); 
        printf("Vystup pro 01: %d\r\n", read_output_signal());
        _delay_ms(1000); 

        send_input_signals(0, 0); 
        printf("Vystup pro 00: %d\r\n", read_output_signal());
        _delay_ms(1000); 
    }

    return 0; 
}
/* ************************************************************************* */
/* FileName:             uart.h                                              */
/* ************************************************************************* */
#define LED PB5  // internal on-board LED 

 /* na testovanie su uz zadefinovane */
 // bit_is_set(PINB, SW1)
 // bit_is_clear(PINB, SW1)

 /* na cakanie su preddefinovane slucky */
 // loop_until_bit_is_set(PINB, SW1);    // cakanie na uvolnenie tlacitka
 // loop_until_bit_is_clear(PINB, SW1);  // cakanie na stlacenie tlacitka


#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))

#ifndef UART_H_
#define UART_H_

#include <stdio.h>

#define BAUD_PRESCALE  (((F_CPU / (BAUDRATE * 16UL))) - 1)  // vzor?ek z datasheetu

void hw_init( void );
void uart_init( void );
     
/* Following definition is compatible with STDIO.H, for more
 * information see https://www.appelsiini.net/2011/simple-usart-with-avr-libc/
 */
	 
int uart_putc( char c, FILE *stream );
void uart_puts( const char *s );

char uart_getc( void );

void delay(int delay); 

#endif /* UART_H_ */
/* ************************************************************************* */
/* FileName:             uart.c                                              */
/* ************************************************************************* */

#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"

void hw_init( void )
{ 
  DDRB |= (1<<LED);    // PORTB.5 kde je LED ma byt OUTPUT
  /* sem si mozete dopisat svoje vlastne inicializacne prikazy */ 	
}

void uart_init( void ) 
{
//  for different BAUD rate change the project settings, or uncomment 
//  following two lines:	
//	#undef  BAUD           // avoid compiler warning
//  #define BAUD 115200
	
   #include <util/setbaud.h>  // requires defined BAUD
   
   UBRR0H = UBRRH_VALUE;
   UBRR0L = UBRRL_VALUE;
   #if USE_2X                 // defined in setbaud.h 
    UCSR0A |= (1 << U2X0);
   #else
    UCSR0A &= ~(1 << U2X0);
   #endif


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


int uart_putc( char c, FILE *stream )
{
   if (c == '\n') 
      uart_putc('\r',stream);
   
   loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
   UDR0 = c;
   return 0;
}


void uart_puts(const char *s)
{
  /* toto je vasa uloha */
}

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

void delay(int delay)      // vlastna funkcia pre dlhsie casy 
{
  for (int i=1; i<=delay; i++)
  _delay_ms(1);
}

//V tejto časti sa inicializujú piny, UART komunikácia, a je nastavený výstup pre stdout pre použitie funkcie printf(). Následne sa v nekonečnej slučke posielajú rôzne kombinácie vstupných signálov pomocou send_input_signals() a číta sa a vypisuje výstupný signál pomocou printf() a read_output_signal() do Serialu. </source></tab> </tabs>


Zdrojový kód: Macáksemestralna.zip


Overenie

Na overenie toho, či naozaj tento obvod funguje správne, použijeme Serial na vypisovanie kombinácií jednotiek a núl, a hodnôt, ktoré obvod vracia.

Ukážka zapojeného obvodu.

Video: