|
|
Riadok 1: |
Riadok 1: |
| Tester logických obvodov 7400 a 7493. Diagnostický report cez sériové rozhranie
| | ToDo |
| | |
| | |
| Záverečný projekt predmetu MIPS / LS2023 - '''Erik Szegi'''
| |
| | |
| | |
| == Zadanie ==
| |
| | |
| Tester logických obvodov- testovali sme, ako rýchlo dokážeme stlačiť tlačidlo po bliknutú kontrolky LED.
| |
| [[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
| |
| | |
| '''Literatúra:'''
| |
| * [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]
| |
| | |
| | |
| __TOC__
| |
| | |
| == Analýza a opis riešenia ==
| |
| | |
| Najprv sme pripojili LCD displej s tlačidlom a LED diódou
| |
| | |
| [[Súbor:schema.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
| |
| | |
| | |
| === Algoritmus a program ===
| |
| | |
| Algoritmus programu je....
| |
| | |
| | |
| <tabs>
| |
| <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
| |
| #include <avr/io.h>
| |
| | |
| #define F_CPU 16000000UL
| |
| #include <avr/io.h>
| |
| #include <avr/interrupt.h>
| |
| #include <util/delay.h>
| |
| #include "lcd_ch.h"
| |
| | |
| #define SW1 PD6 // tlacitko
| |
| #define LED1 PD7 // LED
| |
| | |
| #define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
| |
| #define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
| |
| | |
| #define LED1_ON set_bit(PORTD,LED1) //zapni LED
| |
| #define LED1_OFF clear_bit(PORTD,LED1) //vypni LED
| |
| | |
| static volatile int M_Sec = 0; //integer pocíta v milisekundách
| |
| int Random_Number = 0; //generuje random cislo
| |
| int Rychlost = 0; //cas rychlost
| |
| | |
| //**spustenie casovaca**//
| |
| void TIMER_START(void){
| |
| TCNT1 = 0xFFF0;
| |
| TCCR1B = 0b00000101;
| |
| TIMSK1 = (1<<TOIE1);
| |
| sei();
| |
| TCCR0A = (1 << COM0A0)
| |
| | (1 << WGM01);
| |
| TCCR0B = (1 << CS02);
| |
| }
| |
| | |
| //** output a input port**//
| |
| void Start(void){
| |
| DDRD =0b10000000;
| |
| PORTD =0b01000000;
| |
| }
| |
| | |
| | |
| int main(void)
| |
| {
| |
| Start();
| |
| ini_ports();
| |
| lcd_init();
| |
|
| |
| while(1){
| |
|
| |
| if(bit_is_set(PIND,LED1)){
| |
| goto jump1;
| |
| }
| |
|
| |
| Random_Number=rand(); //generovanie random cisiel pomocou preddefinovanej funkcie
| |
| _delay_ms(200); //Kvôli rýchlej generovanie čakáme, aby led nebliklo veľmi rýchlo
| |
|
| |
| if ((Random_Number>1) && (Random_Number<1500)){
| |
| PORTD |= (1<<LED1);
| |
| M_Sec=0;
| |
| def_Clear_spec_znaky();
| |
| TIMER_START();
| |
|
| |
| jump1:
| |
| if ( !(PIND & (1<<SW1)) ){ // Ak tlacitko je stlacene tak vypni led
| |
| Rychlost = M_Sec;
| |
| char riadok[]= {""};
| |
| sprintf(riadok,"%d ms",Rychlost);
| |
| def_Clear_spec_znaky();
| |
| lcd_puts("Rychlost:");
| |
| lcd_command(0xC0+5);
| |
| lcd_puts(riadok);
| |
| PORTD &= ~(1<<LED1);
| |
| }
| |
|
| |
| }
| |
| }
| |
| }
| |
| | |
| ISR (TIMER1_OVF_vect)
| |
| {
| |
| char riadok[]= {" "};
| |
| TCNT1 = 0xFFF0;
| |
| M_Sec++;
| |
|
| |
| }
| |
| | |
| </source></tab>
| |
| <tab name="lcd_ch.h"><source lang="c++" style="background: LightYellow;">
| |
| #ifndef F_CPU
| |
| #define F_CPU 16000000UL /* Define CPU frequency here 16MHz */
| |
| #endif
| |
| | |
| #ifndef LCD_CH_H_
| |
| #define LCD_CH_H_
| |
| | |
| #include <avr/io.h>
| |
| #include <util/delay.h>
| |
| | |
| extern unsigned char kon_vyp;
| |
| | |
| #ifdef _Shield_LCD
| |
| #define LCD_CTRL_DDR DDRB
| |
| #define LCD_CTRL_PORT PORTB
| |
| | |
| #define LCD_DATA_DDR DDRD
| |
| #define LCD_DATA_PORT PORTD
| |
| | |
| // Riadiaca zbernica display-a
| |
| #define LCD_RS_pin 0
| |
| //#define LCD_RW_pin = 0
| |
| #define LCD_EN_pin 1
| |
| // Datova zbernica
| |
| #define LCD_D4_pin 4
| |
| #define LCD_D5_pin 5
| |
| #define LCD_D6_pin 6
| |
| #define LCD_D7_pin 7
| |
| | |
| #else
| |
| // LCD klasik yapojenie vid. MIPS
| |
| #define LCD_CTRL_DDR DDRD
| |
| #define LCD_CTRL_PORT PORTD
| |
| | |
| #define LCD_DATA_DDR DDRB
| |
| #define LCD_DATA_PORT PORTB
| |
| #define LCD_DATA_PIN PINB
| |
| | |
| #define LCD_RS_pin 2
| |
| #define LCD_RW_pin 3
| |
| #define LCD_EN_pin 4
| |
| | |
| #define LCD_D4_pin 1
| |
| #define LCD_D5_pin 2
| |
| #define LCD_D6_pin 3
| |
| #define LCD_D7_pin 4
| |
| | |
| #endif
| |
|
| |
| | |
| | |
| | |
| // Oneskorenie 6 SC
| |
| #define NOP() asm("nop")
| |
| #define LCD_DELAY NOP();NOP();NOP();NOP();NOP();NOP();
| |
| | |
| #ifdef _Shield_LCD
| |
| // formatovanie dat
| |
| #define PORT_DATA_WR_H(x) LCD_DATA_PORT &=0b00001111; LCD_DATA_PORT |= (x & 0xF0 )
| |
| #define PORT_DATA_WR_L(x) LCD_DATA_PORT &=0b00001111; LCD_DATA_PORT |= (x & 0x0F )<<4
| |
| #else
| |
| | |
| #define PORT_DATA_WR_H(x) LCD_DATA_PORT &=0b11100001; LCD_DATA_PORT |= (x & 0xF0 )>>3
| |
| #define PORT_DATA_WR_L(x) LCD_DATA_PORT &=0b11100001; LCD_DATA_PORT |= (x & 0x0F )<<1
| |
| | |
| #define PORT_DATA_RD_H ((LCD_DATA_PIN & ((1<<LCD_D4_pin)|(1<<LCD_D5_pin)|(1<<LCD_D6_pin)|(1<<LCD_D7_pin)))<<3)
| |
| #define PORT_DATA_RD_L ((LCD_DATA_PIN & ((1<<LCD_D4_pin)|(1<<LCD_D5_pin)|(1<<LCD_D6_pin)|(1<<LCD_D7_pin)))>>1)
| |
| | |
| | |
| #endif
| |
| | |
| /* Public functions for your use */
| |
| #ifndef _Shield_LCD
| |
| int8_t lcd_read_AC(void);
| |
| void def_spec_znaky_AC(void);
| |
| #endif
| |
|
| |
| void lcd_init(void);
| |
| void lcd_data(unsigned char );
| |
| void lcd_command(unsigned char );
| |
| // void lcd_puts(const char *s); /* deklaracia funkcie */
| |
| | |
| | |
| | |
| void ini_ports(void);
| |
| void En_imp(void);
| |
| | |
| void wr_data (unsigned char );
| |
| unsigned char busy_flag(void);
| |
| | |
| void zob_text(char *);
| |
| void def_Clear_spec_znaky(void);
| |
| | |
| | |
| void def_znak(unsigned char *,unsigned char );
| |
| void def_spec_znaky(void);
| |
| | |
| #endif /* LCD_CH_H_ */
| |
| unsigned int adc_read(char a_pin);
| |
| </source></tab>
| |
| </tabs>
| |
| | |
| Ako program funguje:
| |
| Projekt pozostáva, ako už bolo spomenuté, z LED diódy, LCD displeja a tlačidla. Najprv stlačíme tlačidlo, čím sa celá vec spustí. Potom sa rozsvieti LED dióda a zhasne až po stlačení tlačidla. Ide o to, aby sme ho stlačili najrýchlejšie, pretože na LCD displeji sa zobrazí informácia o tom, že ako rýchlo sme boli v milisekundách. Túto časť sa mi bohužiaľ z technických dôvodov nepodarilo nahrať na video. Pravdepodobne niečo nebolo v poriadku s mojím LCD displejom.
| |
| | |
| Kompletný projekt:
| |
| Zdrojový kód: [[Médiá:MIPS-ErikSzegi-TesterLogickýchObvodov.zip|projekt.zip]]
| |
| | |
| === Overenie ===
| |
| | |
| | |
| [[Súbor:projekt.jpg|400px|thumb|center|Aplikácia.]]
| |
| | |
| '''Video:'''
| |
| <center><youtube>gwoF2MafUGQ</youtube></center>
| |
| | |
| Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
| |
| | |
| [[Category:AVR]] [[Category:MIPS]]
| |