Łukasz Wieczorek 75971 Paweł Zaleski 75975 Grupa I3 [REFLEKSOMETR] Systemy wbudowane projekt laboratoryjny.



Podobne dokumenty
ĆWICZENIE 5. TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM

Start Bity Bit Stop 1 Bit Par Rys. 1

Instytut Teleinformatyki

4 Transmisja szeregowa na przykładzie komunikacji dwukierunkowej z komputerem PC, obsługa wyświetlacza LCD.

4 Transmisja szeregowa, obsługa wyświetlacza LCD.

Architektura mikrokontrolera MCS51

Architektura mikrokontrolera MCS51

Instytut Teleinformatyki

LOW ENERGY TIMER, BURTC

Temat: System przerwań, liczniki i wyświetlacz w STRC51. Ćwiczenie 3.

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

ĆWICZENIE. TEMAT: OBSŁUGA PRZETWORNIKA A/C W ukontrolerze 80C535 KEILuVISON

Temat: System przerwań, liczniki i wyświetlacz w STRC51. Ćwiczenie 3.

LABORATORIUM nr 2. Temat: Obsługa wyświetlacza siedmiosegmentowego LED

Nazwa implementacji: Pamięć i zręczność - zapamiętaj kolejność. Autor: Krzysztof Bytow

KA-NUCLEO-UniExp. Wielofunkcyjny ekspander dla NUCLEO i Arduino z Bluetooth, MEMS 3DoF, LED-RGB i czujnikiem temperatury

Przerwania w architekturze mikrokontrolera X51

Generator funkcyjny. Spis treści. Działanie. Interfejs. Adam Miarka Maksymilian Szczepanik

Wstęp do programowania 1

Funkcja (podprogram) void

Wstęp. do języka C na procesor (kompilator RC51)

DOKUMENTACJA TECHNICZNA WSKAŹNIKA ŁADOWANIA BATERII WSK-2 / 24V

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Instrukcja do ćwiczeń

Politechnika Warszawska

DOKUMENTACJA. dot. Budowy i przebiegu konstrukcji linefollower-a. Data: MCHT2 Jakub Tomczyk Łukasz Pawelec Mateusz Wróbel

Immobilizer samochodowy otwierający dostęp poprzez kod czteroznakowy.

Zewnętrzne układy peryferyjne cz. 1 Wykład 12

8-bitowe mikrokontrolery ADuC firmy Analog Devices w układach pomiarowych

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Temat: Obsługa portu komunikacji szeregowej RS232 w systemie STRC51. Ćwiczenie 2. (sd)

Mikrokontrolery wytyczne do projektów

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Instytut Teleinformatyki

SYSTEM PRZERWAŃ ATmega 32

Interfejsy komunikacyjne pomiary sygnałów losowych i pseudolosowych. Instrukcja do ćwiczenia laboratoryjnego

INSTRUKCJE REPETYCYJNE PĘTLE

dokument DOK wersja 1.0

Nazwa implementacji: Zróbmy grę - Tetris. Autor: Łukasz Ciężki

Instytut Teleinformatyki

1 Badanie aplikacji timera 555

MIKROPROCESORY architektura i programowanie

Schemat blokowy architektury AVR

KA-NUCLEO-Weather. ver. 1.0

Arduino jako wyłącznik z opóźnieniem

PRZEDWZMACNIACZ PASYWNY Z SELEKTOREM WEJŚĆ. dokumentacja. (wersja 1.1

Ćw. 1 Wprowadzenie: Obsługa mikroprocesorowych modułów, podstawy techniki programowania, obsługa operacji WE/WY

Mikrokontrolery z rdzeniem ARM, część 21

APPLICATION OF ADUC MICROCONTROLLER MANUFACTURED BY ANALOG DEVICES FOR PRECISION TENSOMETER MEASUREMENT

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

PMiK Programowanie Mikrokontrolera 8051

Przetwarzanie A/C i C/A

ADuCino 360. Zestaw uruchomieniowy dla mikrokontrolerów ADuCM360/361

MIKROPROCESORY architektura i programowanie

Szkolenia specjalistyczne

ad a) Konfiguracja licznika T1 Niech nasz program składa się z dwóch fragmentów kodu: inicjacja licznika T1 pętla główna

Programowanie Proceduralne

Struktura QSM (Queued Serial Module)

Tester samochodowych sond lambda

Instrukcja do laboratorium Akademii ETI *

WIZUALIZACJA DANYCH SENSORYCZNYCH Sprawozdanie z wykonanego projektu. Jakub Stanisz

Jacek Szlachciak. Urządzenia wirtualne systemu wieloparametrycznego

Liczby pseudolosowe. #include <stdio.h> #include <stdlib.h> int main() { printf("%d\n", RAND_MAX); return 0; }

Programowanie Proceduralne

Programowanie mikrokontrolerów AVR

INDU-52. Przemysłowy Sterownik Mikroprocesorowy. Przeznaczenie Kotły warzelne, Patelnie gastronomiczne, Piekarniki

KA-Nucleo-Weather. Rev Źródło:

LITEcompLPC1114. Zestaw ewaluacyjny z mikrokontrolerem LPC1114 (Cortex-M0) Sponsorzy:

Mikroprocesory i Mikrosterowniki Analog-Digital Converter Konwerter Analogowo-Cyfrowy

Obługa czujników do robota śledzącego linie. Michał Wendland czerwca 2011

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

DOKUMENTACJA PROJEKTU

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

2 Przygotował: mgr inż. Maciej Lasota

Sterownik RO WS-01E opis działania, obsługa

TWRS-21 TABLICOWY WYŚWIETLACZ CYFROWY DOKUMENTACJA TECHNICZNO-RUCHOWA. Wrocław, listopad 1999 r.

Co nie powinno być umieszczane w plikach nagłówkowych:

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wykład 1

W języku C dostępne są trzy instrukcje, umożliwiające tworzenie pętli: for, while oraz do. for (w1;w2;w3) instrukcja

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Mikroprocesorowy miernik czasu

Instytut Teleinformatyki

Pracownia elektryczno-elektroniczna klasa IV

Algorytm selekcji Hoare a. Łukasz Miemus

Ćw. 10 Badanie toru przetwarzania C/A w mikrokontrolerach analogowych

start Program mikroprocesorowego miernika mocy generowanej $crystal = deklaracja

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Program serwisowy pralki Beko model WA 2006

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Zestaw uruchomieniowy z mikrokontrolerem LPC1114 i wbudowanym programatorem ISP

STM32Butterfly2. Zestaw uruchomieniowy dla mikrokontrolerów STM32F107

EGZAMIN POTWIERDZAJĄCY KWALIFIKACJE W ZAWODZIE Rok 2017 CZĘŚĆ PRAKTYCZNA

DVR KEYB v1.4. Interfejs PS-2 do rejestratorów DVR

RS485 MODBUS Module 8AI

Parametryzacja przetworników analogowocyfrowych

STEROWANIE DWUSTANOWE. Przykład 1 MIESZALNIK

Pomoc do programu konfiguracyjnego RFID-CS27-Reader User Guide of setup software RFID-CS27-Reader

RS485 MODBUS Module 8AI

Transkrypt:

2008 Łukasz Wieczorek 75971 Paweł Zaleski 75975 Grupa I3 [REFLEKSOMETR] Systemy wbudowane projekt laboratoryjny.

Spis treści 1 OPIS PROJEKTU... 3 2 UKŁAD ELEKTRONICZNY... 4 2.1 SCHEMAT UKŁADU... 4 2.2 WYKORZYSTANE ELEMENTY... 4 2.3 SCHEMAT PŁYTKI DRUKOWANEJ... 5 2.4 OPIS FUNKCJI ELEMENTÓW... 5 3 OPROGRAMOWANIE... 6 3.1 OPIS... 6 3.1.1 TRYB POJEDYNCZY PRZYCISK... 6 3.1.2 TRYB WIELOKROTNY PRZYCISK... 6 3.1.3 TRYB POJEDYNCZY PRZEGRODA... 6 3.1.4 TRYB WIELOKROTNY PRZEGRODA... 6 3.2 KOD PROGRAMU... 7 Refkeksometr Opis projektu 2

1 Opis projektu Celem projektu jest zmierzenie czasu reakcji badanego, na podstawie szybkości naciśnięcia przycisku lub wsunięcia zasłony w przegrodę. Projekt zakłada wykorzystanie mikrokontrolera C8051F330 firmy Silicon Laboratories. W celu spełnienia założeń projektu przygotowaliśmy płytkę drukowaną oraz zaimplementowaliśmy oprogramowanie dla µk pozwalające na dokonanie pomiaru. Płytka składa się z przycisku wybory trybu, przycisku startu oraz z dwóch rzędów składających się z przegrody, diody LED oraz przycisku, przy pomocy których dokonuje się pomiaru czasu reakcji. Pomiar czasu reakcji rozpoczyna się wybraniem jednego z czterech trybów pracy i naciśnięciem przycisku start. Po losowym odcinku czasu zostaje zapalona jedna z dwóch diod LED. W zależności od wybranego trybu czas reakcji mierzony jest do chwili naciśnięciu przycisku lub wsunięcie zasłony w przegrodę przyporządkowaną do zapalonej diody. W trybach wielokrotnych pojedynczy pomiar zostaje powtórzony 10 razy, a czas reakcji stanowi średnią z pomiarów. Refkeksometr Opis projektu 3

2 Układ elektroniczny 2.1 Schemat układu 2.2 Wykorzystane elementy Elementy umieszczone na płytce: 6x opornik 200 Ω - na schemacie oznaczone R1-R6 2x opornik 560 Ω -na schemacie oznaczone R7-R8 2x dioda LED na schemacie oznaczone LED1, LED2 1x wtyk złącza igłowego, dwupinowy na schemacie oznaczone CON1 1x wtyk złącza taśmowego BH-16s na schemacie oznaczone SV1 4x mikrołącznik PI-2 na schemacie oznaczone SW1-SW4 2x dioda emitująca podczerwień, wymontowana z myszki kulkowej - na schemacie oznaczone IR1 IR2 2x foto czujnik wymontowany z myszki kulkowej na schemacie oznaczone PH1-PH2 Elementy wykorzystane do wykonania złącza taśmowego: 2x gniazdo IDC-16 Taśma szesnastożyłowa Refkeksometr Układ elektroniczny 4

2.3 Schemat płytki drukowanej 2.4 Opis funkcji elementów Element Funkcja SW1, SW2 Przyciski wykorzystywane przy badaniu czasu reakcji. PH1+IR1,PH2+IR2 Przegrody wykorzystywane przy badaniu czasu reakcji. LED1, LED2 Dioda wskazująca badanemu który przycisk należy nacisnąć/którą przegrodę zasłonić SW4 Przycisk umożliwiający cykliczną zmianę trybu. SW3 Potwierdzenie wyboru trybu i rozpoczęcie badania. Refkeksometr Układ elektroniczny 5

3 Oprogramowanie 3.1 Opis Wykonane oprogramowanie umożliwia zbadanie czasu reakcji użytkownika. Zaimplementowane zostały 4 tryby badania: 1. tryb pojedynczy przycisk 2. tryb wielokrotny przycisk 3. tryb pojedynczy przegroda 4. tryb wielokrotny przegroda 3.1.1 Tryb pojedynczy przycisk Zostaje zmierzony czas pomiędzy zapaleniem się diody LED a naciśnięciem odpowiedniego guzika. Po naciśnięciu przycisku Start zostaje odmierzony losowy odcinek czasu z przedziału 2-4 sekundy, a następnie następuje zapalenie jednej z dwóch diod LED. W celu pomiaru czasu reakcji użytkownik musi nacisnąć przycisk przyporządkowany do zapalonej diody. 3.1.2 Tryb wielokrotny przycisk Tryb oblicza średni czas reakcji z 10 pomiarów. Pojedynczy pomiar jest identyczny z pierwszym trybem, jednakże po jego zakończeniu nie zostaje wyświetlony wynik, lecz dokonany kolejny pomiar, aż do 10. 3.1.3 Tryb pojedynczy przegroda Zostaje zmierzony czas pomiędzy zapaleniem się diody LED, a wsunięciem zasłony w przegrodę. Po naciśnięciu przycisku Start zostaje odmierzony losowy odcinek czasu z przedziału 2-4 sekundy, a następnie następuje zapalenie jednej z dwóch diod LED. W celu pomiaru czasu reakcji użytkownik musi wsunąć zasłonę w przegrodę przyporządkowaną do zapalonej diody. 3.1.4 Tryb wielokrotny przegroda Tryb oblicza średni czas reakcji z 10 pomiarów. Pojedynczy pomiar jest identyczny z pierwszym trybem, jednakże po jego zakończeniu nie zostaje wyświetlony wynik, lecz dokonany kolejny pomiar, aż do 10. Refkeksometr Oprogramowanie 6

3.2 Kod programu ///////////////////////////////////// // Generated Initialization File // ///////////////////////////////////// #include "C8051F330.h" #include "terminal.h" #include "stdlib.h" // sfr16 at(0xcdca) TMR2RL; sfr16 at(0xcdcc) TMR2; sfr16 at(0xbebd) ADC0; #define SYSCLK 24500000 #define TIMER2_RATE 1000 sbit at 0x82 led1; sbit at 0x93 led2; sbit at 0x90 sw1; sbit at 0x91 sw2; sbit at 0x92 start; sbit at 0x87 change; #define VREF 3350 //VREF == VDD #define CZEKAJ 2 int pchange = 0; int pstart = 0; int psw1 = 0; int psw2 = 0; int mode = 0; int counter = 0; int psensor1 = 3500; int psensor2 = 3500; int totaltime = 0; int i=0; // Peripheral specific initialization functions, // Called from the Init_Device() function void PCA_Init() PCA0MD &= ~0x40; PCA0MD = 0x00; void Timer_Init() TMOD = 0x20; CKCON = 0x08;//0x18 TH1 = 0x2B; SCON0 = 0x10; TL1 = TH1; TR1 = 1; TI0 = 1;//znacznik gotowosci timera void Timer2_Init(int counts) TMR2CN = 0x00; CKCON = 0x10; Refkeksometr Oprogramowanie 7

TMR2RL = 65536 - counts; TMR2 = TMR2RL; ET2 = 0; TR2 = 1; void ADC_Init() AMX0P = 0x0C; AMX0N = 0x11; ADC0CN = 0x40; ADC0CF = (SYSCLK/1000000)<<3; //AD0SC = (SYSCLK/CLKsar)-1; ADC0CF &= ~0x04; void Voltage_Reference_Init() REF0CN = 0x0E; EIE1 &= ~0x08; void Port_IO_Init() // P0.0 - Unassigned, Open-Drain, Digital // P0.1 - Unassigned, Open-Drain, Digital // P0.2 - Unassigned, Push-Pull, Digital // P0.3 - Unassigned, Open-Drain, Digital // P0.4 - TX0 (UART0), Push-Pull, Digital // P0.5 - RX0 (UART0), Open-Drain, Digital // P0.6 - Skipped, Open-Drain, Analog // P0.7 - Unassigned, Open-Drain, Digital // P1.0 - Unassigned, Open-Drain, Digital // P1.1 - Unassigned, Open-Drain, Digital // P1.2 - Unassigned, Open-Drain, Digital // P1.3 - Unassigned, Push-Pull, Digital // P1.4 - Skipped, Open-Drain, Analog // P1.5 - Skipped, Open-Drain, Analog // P1.6 - Unassigned, Open-Drain, Digital // P1.7 - Skipped, Open-Drain, Analog P0MDIN = 0xBF; P1MDIN = 0x4F; P0MDOUT = 0x14; P1MDOUT = 0x08; P0SKIP = 0x40; P1SKIP = 0xB0; XBR0 = 0x01; XBR1 = 0x40; void Oscillator_Init() //OSCLCN = 0x03; OSCICN = 0x83; // Initialization function for device, // Call Init_Device() from your main program void Init_Device(void) Refkeksometr Oprogramowanie 8

PCA_Init(); Timer_Init(); Timer2_Init(SYSCLK/TIMER2_RATE); ADC_Init(); Voltage_Reference_Init(); Port_IO_Init(); Oscillator_Init(); int read_pot(int count) unsigned int i, pomiar; unsigned long sumator; AD0INT = 0; AD0BUSY = 1; sumator = 0; i = 0; do while (!AD0INT); pomiar = ADC0; AD0BUSY = 1; sumator += pomiar; i++; while (i!= count); return sumator * VREF / 1024 / count; void waittimer(int rand) unsigned int count; rand = 2000 + rand % 2000; TF2H = 0; TR2 = 1; for(count = rand; count!= 0; count--) while(!tf2h); TF2H = 0; TR2=0; void changemode() if(change == 0 && pchange == 1) mode++; if(mode > 2) mode = 0; if(mode == 0) printf("tryb pojedynczy - przycisk\n"); else if(mode == 1) printf("tryb wielokrotny - przycisk\n"); else if(mode == 2) printf("tryb pojedynczy - przegroda\n"); pchange = 0; if(change == 1) pchange = 1; void randomled() if(rand() % 2 == 1) led1 = 0; led2 = 1; else led1 = 1; Refkeksometr Oprogramowanie 9

led2 = 0; void startgame() if(start == 0 && pstart == 1) led1 = 1; led2 = 1; i=0; totaltime = 0; printf("start\n"); waittimer(rand()); randomled(); counter = 0; ET2 = 1; TR2 = 1; pstart = 0; if(start == 1) pstart = 1; int sw1click() if(sw1 == 0 && psw1 == 1) psw1 = 0; return 1; if(sw1 == 1) psw1 = 1; return 0; int sw2click() if(sw2 == 0 && psw2 == 1) psw2 = 0; return 1; if(sw2 == 1) psw2 = 1; return 0; void stoptimer() int s; int ms; ET2 = 0; TR2 = 0; s = counter/1000; ms = (counter % 1000) / 10; printf("czas reakcji %d sekund, %d setnych\n", s, ms); int sensor2() int value=0; AMX0P = 0x0C; value = read_pot(100); if(value < 3300 && psensor2 > 3300) psensor2 = value; return 1; Refkeksometr Oprogramowanie 10

AMX0P = 0x0D; value = read_pot(100); if(value < 3300 && psensor2 > 3300) psensor2 = value; return 1; psensor2 = value; return 0; int sensor1() int value=0; AMX0P = 0x06; value = read_pot(100); if(value < 3300 && psensor1 > 3300) psensor1 = value; return 1; AMX0P = 0x0F; value = read_pot(100); if(value < 3300 && psensor1 > 3300) psensor1 = value; return 1; psensor1 = value; return 0; void reflex() if(mode == 0) if(sw1click() && led1 == 0) stoptimer(); else if(sw2click() && led2 == 0) stoptimer(); else if(mode == 1) if(sw1click() && led1 == 0) totaltime+= counter; counter = 0; ET2 = 0; TR2 = 0; i++; if(i<10) printf("pomiar %d\n", i); led1 = 1; led2 = 1; waittimer(rand()); randomled(); ET2 = 1; TR2 = 1; else int count = totaltime/10; int s = count/1000; int ms = (count% 1000) / 10; printf("sredni czas reakcji z 10 prób wynosi: %d sekund, %d setnych\n", s, ms); Refkeksometr Oprogramowanie 11

else if(sw2click() && led2 == 0) totaltime+= counter; counter = 0; ET2 = 0; TR2 = 0; i++; if(i<10) printf("pomiar %d\n", i); led1 = 1; led2 = 1; waittimer(rand()); randomled(); ET2 = 1; TR2 = 1; else int count = totaltime/10; int s = count/1000; int ms = (count% 1000) / 10; printf("sredni czas reakcji z 10 prób wynosi: %d sekund, %d setnych\n", s, ms); else if(mode == 2) if(sensor1() && led1 == 0) stoptimer(); else if(sensor2() && led2 == 0) stoptimer(); void Timer2_ISR (void) interrupt 5 if(tf2h == 1) counter++; TF2H = 0; void main(void) Init_Device(); AD0EN = 1; EA = 1; printf("\n"); while (1) changemode(); startgame(); reflex(); Refkeksometr Oprogramowanie 12