Moduł czujników IR. Tomasz Kubiec Marcin Krawiec

Podobne dokumenty
Komunikacja w mikrokontrolerach Laboratorium

SYSTEMY MIKROPROCESOROWE

Funkcje czasowe (multifunction timer)

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Mikroprocesory i Mikrosterowniki Laboratorium

Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej Ćwiczenie nr 4

Opis procedur asemblera AVR

Wbudowane układy komunikacyjne cz. 1 Wykład 10

Struktura QSM (Queued Serial Module)

Wizualizacja stanu czujników robota mobilnego. Sprawozdanie z wykonania projektu.

Magistrala SPI. Linie MOSI i MISO sąwspólne dla wszystkich urządzeńna magistrali, linia SS jest prowadzona do każdego Slave oddzielnie.

Wstęp Architektura... 13

2. Architektura mikrokontrolerów PIC16F8x... 13

Mikrokontrolery AVR Wprowadzenie

MODBUS RTU wersja M1.14 protokół komunikacyjny wyświetlaczy LDN

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

SYSTEMY MIKROPROCESOROWE W AUTOMATYCE. Projekt bariery świetlnej.

Projekt MARM. Dokumentacja projektu. Łukasz Wolniak. Stacja pogodowa

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

OPIS STEROWNIKA 841 USB

KOMUNIKACJA Z OTOCZENIEM MIKROKONTROLERA

1. Wprowadzenie Programowanie mikrokontrolerów Sprzęt i oprogramowanie... 33

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

Płytka laboratoryjna do współpracy z mikrokontrolerem MC68332

ADVANCE ELECTRONIC. Instrukcja obsługi aplikacji. Modbus konfigurator. Modbus konfigurator. wersja 1.1

Programowanie mikrokontrolerów. 8 listopada 2007

Uniwersalny asynchroniczny. UART Universal Asynchronous Receier- Transmiter

Listing_ $crystal = deklaracja

Organizacja pamięci VRAM monitora znakowego. 1. Tryb pracy automatycznej

Opis układów wykorzystanych w aplikacji

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

Ćwiczenie 7 Matryca RGB

2. PORTY WEJŚCIA/WYJŚCIA (I/O)

OPIS STEROWNIKA 821B USB

ZL4PIC. Uniwersalny zestaw uruchomieniowy dla mikrokontrolerów PIC

Instytut Teleinformatyki

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

dokument DOK wersja 1.0

RS-H0-05 (K)* Czytnik RFID MHz Mifare. Karta użytkownika

PROGRAM TESTOWY LCWIN.EXE OPIS DZIAŁANIA I INSTRUKCJA UŻYTKOWNIKA

interfejs szeregowy wyświetlaczy do systemów PLC

Technika Mikroprocesorowa

Szkolenia specjalistyczne

WIZUALIZACJA DANYCH SENSORYCZNYCH Sprawozdanie z wykonanego projektu. Jakub Stanisz

Niektóre piny mogą pełnić różne role, zależnie od aktualnej wartości sygnałów sterujących.

Kod produktu: MP01105

Instytut Teleinformatyki

1.2 Schemat blokowy oraz opis sygnałów wejściowych i wyjściowych

Struktura mikrokontrolera MC68332

OPTIMA PC v Program konfiguracyjny dla cyfrowych paneli domofonowy serii OPTIMA ELFON. Instrukcja obsługi. Rev 1

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Instytut Teleinformatyki

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

start Program mikroprocesorowego miernika mocy generowanej $crystal = deklaracja

Ćwiczenie 2. Siedmiosegmentowy wyświetlacz LED

Mikroprocesory i Mikrosterowniki

Zestaw uruchomieniowy z mikrokontrolerem LPC1114 i wbudowanym programatorem ISP

Kod produktu: MP01105T

Instrukcja integracji urządzenia na magistrali Modbus RTU. wersja 1.1

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Wstęp: Interfejs portu równoległego 6821 i portu szeregowego 6850 firmy Motorola

Politechnika Wrocławska

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

Mikroprocesory i Mikrosterowniki Liczniki Timer Counter T/C0, T/C1, T/C2

Electronic Infosystems

Uniwersalny sterownik silnika krokowego z portem szeregowym RS232 z procesorem AT90S2313 na płycie E200. Zestaw do samodzielnego montażu.

Konfigurator Modbus. Instrukcja obsługi programu Konfigurator Modbus. wyprodukowano dla

1. Wstęp Różnice pomiędzy mikrokontrolerami ST7 a ST7LITE Rdzeń mikrokontrolerów ST7FLITE... 15

1.2. Architektura rdzenia ARM Cortex-M3...16

Mikrokontroler ATmega32. System przerwań Porty wejścia-wyjścia Układy czasowo-licznikowe

Odbiór i dekodowanie znaków ASCII za pomocą makiety cyfrowej. Znaki wysyłane przez komputer za pośrednictwem łącza RS-232.

Podstawy systemów mikroprocesorowych. Interfejs USART. Interfejsy szeregowe w mikrokontrolerach AVR

Programowanie Mikrokontrolerów

MultiTool instrukcja użytkownika 2010 SFAR

Liczniki, rejestry lab. 08 Mikrokontrolery WSTĘP

Sterownik momentu obrotowego silnika prądu stałego

Instrukcja integracji urządzenia na magistrali Modbus RTU

UNIPROD GLIWICE ul. Sowińskiego 3 tel: , fax kontakt@uniprod.pl

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

ZL4PIC uniwersalny zestaw uruchomieniowy dla mikrokontrolerów PIC (v.1.0) Uniwersalny zestaw uruchomieniowy dla mikrokontrolerów PIC

POLITECHNIKA WARSZAWSKA Wydział Elektryczny Instytut Elektroenergetyki Zakład Elektrowni i Gospodarki Elektroenergetycznej

Aplikacja czujnika temperatury dla modułu uniwersalnego UNIV 1.0 i procesora UNIV 1.0 (CPU)

MAGISTRALA MODBUS W SIŁOWNIKU XSM Opis sterowania

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

Ultradźwiękowy generator mocy MARP wersja Dokumentacja techniczno-ruchowa

Podstawy techniki mikroprocesorowej

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

3.2. Zegar/kalendarz z pamięcią statyczną RAM 256 x 8

Mikroprocesory i Mikrosterowniki

Technika mikroprocesorowa I Wykład 2

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

Wstęp. Opis ATMEGA128 MINI MODUŁ VE-APS-1406

Spółka z o.o. INSTRUKCJA UŻYTKOWANIA PROGRAMU SCHRS. Do współpracy z: dotyczy programu SCHRS w wersji: 1.27

2.1 Porównanie procesorów

Zastosowanie procesorów AVR firmy ATMEL w cyfrowych pomiarach częstotliwości

LB-471P, panel ciśnieniomierza z pętlą prądową 4..20mA INSTRUKCJA UśYTKOWANIA wersja instrukcji 1.1

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

Tworzenie nowego projektu w asemblerze dla mikroprocesora z rodziny 8051

Transkrypt:

Moduł czujników IR Tomasz Kubiec Marcin Krawiec 26 stycznia 2005

Spis treści 1 Hardware 2 1.1 Wstęp................................... 2 1.2 Opis portów................................ 2 1.3 Przetwornik A/C............................. 2 1.4 Diody IR.................................. 3 1.5 Fototranzystory.............................. 3 1.6 Diody LED................................ 3 1.7 Zasilacz.................................. 3 2 Software 14 2.1 Realizacja oprogramowania niskiego poziomu.............. 14 2.1.1 Odczyt danych z przetwornika A/C MAX1112:......... 14 2.1.2 Komunikacja z komputerem PC RS232C.......... 15 2.1.3 Odczyt danych z wewnętrznego przetwornika A/C:...... 16 2.1.4 Wysyłanie przetworzonych danych na linijki świetlne:..... 17 2.2 Programowanie up MC68HC11..................... 17 2.2.1 Kompilacja:............................ 17 2.2.2 Programowanie:.......................... 17 3 Kod źródłowy programu 21 1

Rozdział 1 Hardware 1.1 Wstęp Schemat ideowy urządzenia przedstawia rys. 1.1 oraz rys. 1.2. Elementem sterującym jest mikrokontroler MC68HC11E2 firmy Motorola. Za jego pośrednictwem odczytywane są informacje z przetworników A/C (MAX1112) a następnie konwertowane do odpowiedniego formatu i wyświetlane za pomocą 8 linijek świetlnych i wysyłane do komputera za pośrednictwem układu MAX232. 1.2 Opis portów Port B wykorzystywany jest do adresowania 8-bitowych przerzutników typu D latch (US1-8 rys. 1.2), Port C służy do wystawiania danych do zatrzaśnięcia w w/w przerzutnikach. Wszystkie bity portu C zostały wzmocnione w układzie 74HCT245 ponieważ każdy z nich dociera do 8 wejść TTL, Port D pełni dwie funkcje i tak: piny PD0/RxD oraz PD1/TxD służą do realizacji połączenia z układem MAX 232 (US1); piny PD2/MISO PD3/MOSI PD4/SCK służą do realizacji połączenia z przetwornikami A/C za pośrednictwem interfejsu SPI. Port E (wejścia wewnętrznego przetwornika A/C) służą do odczytywania informacji z potencjometrów P1 oraz P2. 1.3 Przetwornik A/C Przetwornik analogowo-cyfrowy MAX1112 firmy MAXIM jest ośmiobitowym ośmiowejściowym przetwornikiem posiadającym wbudowany interfejs SPI (Serial Peripheral Interface). Analogowe wejścia przetworników dołączone są do rezystorów R1-R8 (rys. 1.2) na których odkłada się napięcie zależne od prądu tranzystorów Q1-Q8 czyli od natężenia oświetlenia. Diody D3-D10 mają za zadanie zabezpieczyć 2

wejścia przetworników przed przekroczeniem napięcia maksymalnego 5,1V. Katody tychże diod połączone są do źródła napięcia odniesienia wynoszącego 4,6V. 1.4 Diody IR Do oświetlania terenu wykorzystano 9 diod IR333/HO/L10. Diody te działają w głębokiej podczerwieni gdyż emitują promieniowanie o długości fali 940nm. Diody zostały zasilone przez rezystory R9-R17 a ich prąd pracy wynosi 20mA. 1.5 Fototranzystory W układzie zastosowano 8 fotoranzystorów P T 202B. Kolektory tych tranzystorów zostały zasilone napięciem 17V. Rezystory R1-R8 zostały dobrane w taki sposób, aby przy maksymalnym oświetleniu fototranzystorów odłożyło się na nich napięcie ok. 5V. 1.6 Diody LED Anody diod LED (D1-D64) podłączone są do napięcia +4,6V i zapalane stanem niskim na wyjściu przerzutników D (US1-US8). 1.7 Zasilacz Do zasilania urządzenia użyto zasilacz firmy YOKOGAWA. Zasilacz oferuje dwa napięcia: +17V oraz +5V. Napięcie +5V użyte zostało do zasilenia mikrokontrolera oraz diod IR. Napięcie +17V użyto do zasilania fototranzystorów oraz stabilizatora LM317T, który jest źródłem napięcia 4,6V, którego użyto do zasilenia diod LED. 3

4 Rysunek 1.1: Schemat ideowy płyty głównej

Rysunek 1.2: Schemat ideowy płyty czołowej 5

Rysunek 1.3: Rozmieszczenie elementów po stronie TOP 6

Rysunek 1.4: Rozmieszczenie elementów po stronie BOTTOM 7

Rysunek 1.5: Warstwa TOP 8

Rysunek 1.6: Warstwa BOTTOM 9

Rysunek 1.7: Rozmieszczenie elementów po stronie TOP 10

Rysunek 1.8: Rozmieszczenie elementów po stronie BOTTOM 11

Rysunek 1.9: Warstwa TOP 12

Rysunek 1.10: Warstwa BOTTOM 13

Rozdział 2 Software 2.1 Realizacja oprogramowania niskiego poziomu W projekcie wykorzystano up MC68HC11E2 firmy MOTOROLA. Układ realizuje następujące zadania: Odczyt danych z ośmiokonałowego, ośmiobitowego przetwornika A/C MAX1112 firmy MAXIM za pośrednictwem protokołu SPI. Odczyt danych z wewnętrznego, ośmiobitowego przetwornika A/C. Wysyłanie przetworzonych informacji na osiem ośmiodiodowych linijek świetlnych. Przesłanie danych pomiarowych do komputera PC za pośrednictwem protokołu RS232. 2.1.1 Odczyt danych z przetwornika A/C MAX1112: 1. Jednorazowa inicjalizacja protokołu SPI: #%00111000 * +- MISO Nieistotne przy ustawieniu MASTER * +-- MOSI W trybie MASTER na 1 * +--- SCK W trybie MASTER musi byc na 1 * +---- SS W trybie 1 MASTER musi byc na 1 STAA DDRDUNI/$\overline{BIP}$= #%01010000 * +- SPR0 Clock Rate Selects * +-- SPR1 Clock Rate Selects * +--- CPHA Clock Phase * +---- CPOL Clock Polarity * +----- MSTR Master Mode Select * +------ * +------- * +-------- STAA SPCR 14

2. Odczyt danych z przetwornika MAX1112: Wysłanie bajtu konfiguracyjnego na magistrale SPI: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 START SEL2 SEL1 SEL0 UNI/BIP SGL/DIF PD1 PD0 Rysunek 2.1: Ogólna postać bajtu konfiguracyjnego dla przetwornika MAX1112 START Bit startu; SEL2, SEL1, SEL0 Wybór kanału (patrz dokumentacja); UNI/BIP 1=unipolarny, 0=bipolarny w naszym przypadku 1 ; SGL/DIF Wybór trybu konwersji w naszym przypadku 1; PD1, PD0 Tryby taktowania i pracy w naszym przypadku PD0=PD1=1; Odczyt pierwszego bajtu danych: Pierwszy bajt odebranych danych zapisywany jest w RB1. Bajt ten pomijamy zawiera nieistotne informacje. Odczyt drugiego bajtu danych właściwych: b2 - b7 sześć starszych bitów danych przechowywany w RB2; 0 0 b7 b6 b5 b4 b3 b2 Rysunek 2.2: Drugi bajt odebranych danych Odczyt trzeciego bajtu danych właściwych: b0 - b1 dwa młodsze bity danych przechowywany w RB3; b1 b0 0 0 0 0 0 0 Rysunek 2.3: Trzeci bajt odebranych danych Następnie dane poddawane są konwersji, tak aby wszystkie osiem bitów znalazło się w jednym rejestrze (akumulator ACCA) funkcja Conv- Data. 2.1.2 Komunikacja z komputerem PC RS232C Aby w rozsądny sposób zrealizować komunikację z komputerem, która nie kolidowałaby z wyświetlaniem danych na linijkach świetlnych, w up zostało odblokowane przerwanie od odbiornika SCI. Po pojawieniu się znaku w buforze odbiornika generowane jest przerwanie. Obsługa wektora tego przerwania została skrócona do minimum zapisanie odebranego znaku. Dopiero w programie głównym sprawdzane jest co to za znak i w zależności od tego podejmowane jest odpowiednie działanie. Następnie zmienna przechowująca odebrany znak jest kasowana. 1. Gdy odebrany znak to M : 15

Odczyt aktualnych danych z przetwornika A/C MAX 1112 funkcja Read8 ; Wysłanie aktualnych danych zawartych w zmiennych RD1 RD8, w następującym formacie: M RD1 spacja RD2 spacja... spacja RD8 spacja K wartośćk spacja P wartośćp, gdzie: K współczynnik korekcji zera (dolny potencjometr) zakres zmian 0... 64, z zabezpieczeniem, aby po odjeciu współczynnika korekcji zera nie otrzymac liczby ujemnej; P współczynnik wzmocnienia (górny potencjometr) zakres zmian 1... 4, z zabezpieczeniem, aby po przemnozeniu współczynnika wzmocnienia pzrez daną nie otrzymac liczby przekraczającej 255; RD1 RD8 wysyłane są w postaci dziesiętnej. Jeśli liczba dziesiętna jest mniejsza od 100, w miejsce nieznaczącego zera wpisywana jest spacja. Analogicznie jeśli liczba jest mniejsza od 10, to w miejsca nieznaczących zer wpisywane są spacje. 2. Gdy odebrany znak to T : Odczyt aktualnych danych z przetwornika A/C MAX 1112 funkcja Read8 ; Konwersja danych do postaci niezbędnej do wyświetlenia na diodach funkcja ConvNaDiody (skalowanie, wprowadzenie korekcji zera, wzmocnienie... ) Wysłanie przekonwertowanych danych zawartych w zmiennych RD1 RD8, w następującym formacie: T RD1 spacja RD2 spacja... spacja RD8 spacja P wartoscp spacja K wartosck Jeśli liczba dziesiętna jest mniejsza od 100, w miejsce nieznaczącego zera wpisywana jest spacja. Analogicznie jeśli liczba jest mniejsza od 10, to w miejsca nieznaczących zer wpisywane są spacje. 2.1.3 Odczyt danych z wewnętrznego przetwornika A/C: Odczytywane dane to: Współczynnik korekcji zera przechowywany w zmiennej K zakres zmian 0... 64, z zabezpieczeniem, aby po odjeciu współczynnika korekcji zera nie otrzymac liczby ujemnej; Współczynnik wzmocnienia przechowywany w zmiennej P zakres zmian 1... 4, z zabezpieczeniem, aby po przemnozeniu współczynnika wzmocnienia pzrez daną nie otrzymac liczby przekraczającej 255; 16

2.1.4 Wysyłanie przetworzonych danych na linijki świetlne: 1. Odczyt aktualnych danych z przetwornika A/C MAX 1112 funkcja Read8 ; 2. Konwersja danych do postaci niezbędnej do wyświetlenia na diodach funkcjaconvnadiody (skalowanie, wprowadzenie korekcji zera... ) Adres przechowywany jest w ACCB jedynka na najmłodszym bicie, reszta zer, to wybór pierwszego przerzutnika. Analogicznie jedynka na najstarszym bicie, reszta zer, to wybór ósmego przerzutnika. Funkcja ConvNaDiody wykorzystuje funkcję Skaluj80 dane zastosowane do skalowania zostały uzyskane w fazie testów układu. Zbliżaliśmy i oddalaliśmy białą kartkę formatu A4. Maksymalny zakres działania 80cm. Bajty wysyłane na diody mają następującą postać: 00000000 świecą wszystkie diody; 11111111 wszystkie diody zgaszone; 00001111 świecą cztery dolne diody; 2.2 Programowanie up MC68HC11 2.2.1 Kompilacja: Pliki *.asm kompilowane były przy pomocy darmowego kompilatora as11new.exe. Przykładowe wywołanie kompilatora w wierszu poleceń: \IR\HC11\PROGRAM>as11new.exe IR.asm Freeware assember ASxx.EXE Ver 1.03. Number of errors 0 Po pomyślnej kompilacji tworzony jest plik z S rekordami. W tym przypadku jest to plik IR.S19 2.2.2 Programowanie: Uruchamiamy aplikację PROJECT1.EXE, która stanowi prosty edytor oraz programator (w rzeczywistości korzysta z zewnętrznego kompilatora i bootloadera) procesorów: Przed rozpoczęciem programowania musimy dokonać ustawień w zakładce Preferencje: Lokalizacja bootloadera; Lokalizacja danych do wysłania; 17

Rysunek 2.4: Aplikacja Project1.exe Rysunek 2.5: Okno preferencji Po dokonaniu tych ustawień możemy przejść do programowania procesora. Układ musi być połączony z komputerem i podłączony do zasilania. Microswitchami przestawiamy procesor w tryb pracy Special Bootstrap. Dokonujemy tego naciskając przycisk 1 i trzymając go przyciskamy styk 2 (reset). Teraz najpierw zwalniamy przycisk 2(reset) a następnie przycisk nr 1. Procesor jest gotowy do programowania. Klikamy 18

ikonę oznaczoną strzałką i czekamy, aż pasek postępu dojdzie do końca a aplikacja potwierdzi poprawność programowania. Jeśli wszystko przebiegło pomyślnie, resetujemy procesor i mamy w pełni działający układ... Rysunek 2.6: Przejście w tryb pracy Special Bootstrap 19

Rysunek 2.7: Ikona programowania 20

Rozdział 3 Kod źródłowy programu * Dochodzi przerwanie od RS a * Definicje stalych PTime EQU $1000 opoznienie podstawowe PTime1 EQU $100 opoznienie podstawowe1 * Rejestry mikrokontrolera 68HC11 PORTA EQU $1000 I/O Port A PIOC EQU $1002 Parallel I/O Control Register PORTC EQU $1003 I/O Port C PORTB EQU $1004 Output Port B PORTCL EQU $1005 Alternate Latched Port C DDRC EQU $1007 Data Direction for Port C PORTD EQU $1008 I/O Port D DDRD EQU $1009 Data Direction for Port D PORTE EQU $100A Input Port E CFORC EQU $100B Compare Force Register OC1M EQU $100C OC1 Action Mask Register OC1D EQU $100D OC1 Action Data Register TCNT EQU $100E Timer Counter Register (HB,LB, 2 bytes) TIC1 EQU $1010 Input Capture 1 Register TIC2 EQU $1012 Input Capture 2 Register TIC3 EQU $1014 Input Capture 3 Register 21

TOC1 EQU $1016 Output Compare 1 Register TOC2 EQU $1018 Output Compare 2 Register TOC3 EQU $101A Output Compare 3 Register TOC4 EQU $101C Output Compare 4 Register TOC5 EQU $101E Output Compare 5 Register TCTL1 EQU $1020 Timer Control Register 1 TCTL2 EQU $1021 Timer Control Register 2 TMASK1 EQU $1022 Timer Interrupt Mask Register 1 TFLG1 EQU $1023 Timer Interrupt Flag Register 1 TMASK2 EQU $1024 Timer Interrupt Mask Register 2 TFLG2 EQU $1025 Timer Interrupt Flag Register 2 PACTL EQU $1026 Pulse Accumulator Control Register PACNT EQU $1027 Pulse Accumulator Count Register SPCR EQU $1028 SPI Control Register SPSR EQU $1029 SPI Status Register SPDR EQU $102A SPI Data Register BAUD EQU $102B SCI Baud Rate Control SCCR1 EQU $102C SCI Control Register 1 SCCR2 EQU $102D SCI Control Register 2 SCSR EQU $102E SCI Status Register SCDR EQU $102F SCI Data Register (Read RDR, Write TDR) ADCTL EQU $1030 A/D Control Register ADR1 EQU $1031 A/D Result Register 1 ADR2 EQU $1032 A/D Result Register 2 ADR3 EQU $1033 A/D Result Register 3 ADR4 EQU $1034 A/D Result Register 4 OPTION EQU $1039 System Configuration Options COPRST EQU $103A Arm/Reset COP Timer Circuity PPROG EQU $103B EEPROM Program Control Register HPIRO EQU $103C Highest Priority I-Bit Int and Misc INIT EQU $103D RAM and I/O Mapping Register TEST1 EQU $103E Factory TEST Countrol Register CONFIG EQU $103F COP,ROM and EEPROM Enables * Mapa pamieci EepStr EQU $F800 adres poczatku EEPROM RamStr EQU $0000 adres poczatku RAM SCIVect EQU $FFD6 adres wektora SCI OC2Vect EQU $FFE6 adres wektora OC2 ResVect EQU $FFFE adres wektora restartu Stack EQU $00FF szczyt stosu 22

* Deklaracje zmiennych w RAM ORG RamStr poczatek RAM Blank RMB 1 flaga nieznaczacego zera RD1 RMB 1 rej. danych nr 1 RD2 RMB 1 rej. danych nr 2 RD3 RMB 1 rej. danych nr 3 RD4 RMB 1 rej. danych nr 4 RD5 RMB 1 rej. danych nr 5 RD6 RMB 1 rej. danych nr 6 RD7 RMB 1 rej. danych nr 7 RD8 RMB 1 rej. danych nr 8 RB1 RMB 1 rej. danych odczytanych z MAXA RB2 RMB 1 rej. danych odczytanych z MAXA RB3 RMB 1 rej. danych odczytanych z MAXA Bylo RMB 1 Znacznik ustawiany w obsl. przerw. * "Bylo" zawiera odebrany znak P RMB 1 Wzmocnienie K RMB 1 Kalibracja * Program glowny rejestratora Start ORG EepStr poczatek EEPROM * Inicjalizacja: * wskaznika stosu LDS #Stack szczyt stosu na koncu RAM * portu szeregowego (SCI) #%00110000 STAA BAUD 9600Bd #%00101100 23

* +--- RxE - wlaczenie odbiornika * +---- TxE - wlaczenie nadajnika * +------ RIE - odblokowanie przerwania od odb. STAA SCCR2 SCDR odczyt zastanego znaku CLI * przetwornika analogowo-cyfrowego (ADC) #%10010000 * +----- DLY - 4000 taktow opoznienia przy starcie * +------- CSEL - zegar przetwornika z procesora (E) * +-------- ADPU - wlaczenie zasilania ADC STAA OPTION JSR Delay opoznienie dla ADC * protokolu SPI #%00111000 * +- MISO Nieistotne przy ustawieniu MASTER * +-- MOSI W trybie MASTER na 1 * +--- SCK W trybie MASTER musi byc na 1 * +---- SS W trybie 1 MASTER musi byc na 1 STAA DDRD #%01010000 * +- SPR0 Clock Rate Selects * +-- SPR1 Clock Rate Selects * +--- CPHA Clock Phase * +---- CPOL Clock Polarity * +----- MSTR Master Mode Select * +------ * +------- * +-------- STAA SPCR * PORTU C (praca w trybie OUTPUT) #%11111111 STAA DDRC ****PROGRAM GLOWNY*************************************************** *Zapalenie wszystkich bargrafow 24

#%00000000 LDAB #%11111111 STAA PORTC Dane na port C JSR Delay1 STAB PORTB Adres na port B LDAB #%00000000 Blokada przerzutnikow D STAB PORTB *Koniec zapalania bargrafow #0 Opoznienie 100*Opoznienie podstawowe Jeszcze INCA JSR Delay CMPA #100 BLO Jeszcze *Gaszenie bargrafow #%11111111 LDAB #%11111111 STAA PORTC Dane na port C JSR Delay1 STAB PORTB Adres na port B LDAB #%00000000 Blokada przerzutnikow D STAB PORTB *Koniec gaszenia **** GLOWNA PETLA PROGRAMU **** Main Main1 LDAB #%00000000 Blokada przerzutnikow D STAB PORTB JSR OdczytPK Odczyt wsp. P i K z wewnetrznego A/C Bylo Czy bylo przerwanie od odbiornika RS? CMPA # M Czy odebrany znak to (M) BNE Main1...nie -> skocz do Main1 JSR Read8...tak -> odczytaj aktualne dane JSR Wyslij wyslij aktualne dane przez RS 25

Main2 Bylo Czy bylo przerwanie od odbiornika RS? CMPA # T Czy odebrany znak to (T) BNE Main2...nie -> skocz do Main2 JSR Read8...tak -> odczytaj aktualne dane JSR ConvNaDiody konwertuj dane dla bargrafow JSR Wyslij wyslij skonwertowane dane przez RS #%00000000 STAA Bylo Kasowanie znacznika JSR Read8 Odczytaj dane z MAX a 1112 JSR ConvNaDiody Konwersja na bargrafy JSR Wyswietl Wyswietlenie danych na bargrafach JMP Main Powrot na poczatek glownej petli * Procedury uzytkowe ************************************************ *ConvNaDiody *Najpierw wywolac Read8 aby zaktualizowac dane w rejestrach danych. *Do akumulatora wczytywana jest dana, ktora pozniej podlega *skalowaniu. Przeskalowane dane zawarte w ACCB wpisywane sš do tych *samych rejestrow danych. ConvNaDiody JSR STAB JSR STAB JSR STAB JSR STAB RD1 Skaluj80 RD1 RD2 Skaluj80 RD2 RD3 Skaluj80 RD3 RD4 Skaluj80 RD4 RD5 26

JSR STAB JSR STAB JSR STAB JSR STAB Skaluj80 RD5 RD6 Skaluj80 RD6 RD7 Skaluj80 RD7 RD8 Skaluj80 RD8 *#################################################################### *Skaluj80 *Przed wywolaniem powinnismy zaladowac do ACCA dane ktore maja ulec *przeskalowaniu. Dana te porownywane sa z osmioma wartosciami *uzyskanymi w fazie badan. W zaleznosci od tego w jakim przedziale *znajda sie rzeczywiste dane, zostaje im przypisana odpowiednia *kombinacja binarna, ktora pozniej zostaje wyslana na bargrafy. Skaluj80 CMPA #120 BLO Mniej1 LDAB #%00000000 Mniej1 CMPA #50 BLO Mniej2 LDAB #%00000001 Mniej2 CMPA #32 BLO Mniej3 LDAB #%00000011 Mniej3 CMPA #26 BLO Mniej4 LDAB #%00000111 27

Mniej4 CMPA #21 BLO Mniej5 LDAB #%00001111 Mniej5 CMPA #17 BLO Mniej6 LDAB #%00011111 Mniej6 CMPA #13 BLO Mniej7 LDAB #%00111111 Mniej7 CMPA #11 BLO Mniej8 LDAB #%01111111 Mniej8 LDAB #%11111111 *#################################################################### ** Wyslij na RS ***************************************************** *Wysyla na port RS: *1. Kod ASCII litery. Ta sama litera jest znakiem inicjujacym * przesyl danych z urzadzenia do PC ta (M lub T). *2. Osiem bajtow z danymi z przetwornika MAX1112 *3. Kod ASCII litery P *4. Wartosc aktualnego wspolczynnika wzmocnienia - zmienna P *5. Kod ASCII litery K *6. Wartosc aktualnego wspolczynnika korekcji zera - zmienna K *Format wysylanych danych zalezy od ustawien w funkcji SendData *Do testow wszystkie dane liczbowe wysylane sa w postaci dziesietnej *i sa rozdzielone spacja (po literach brak spacji. *Dodatkowy opis w funkcji SendData. 28

Wyslij JSR JSR JSR JSR JSR JSR JSR JSR JSR JSR JSR JSR JSR Bylo SendC RD1 SendData RD2 SendData RD3 SendData RD4 SendData RD5 SendData RD6 SendData RD7 SendData RD8 SendData # P SendC P SendData # K SendC K SendData *#################################################################### ** Wyswietl na diodach ********************************************** *Wyswietla na diodach wartosci zawarte w rejestrach danch; *Przed jej wywolaniem powinna zostac najpierw wywolana funkcja Read8 * oraz zaraz po niej funkcja ConvNaDiody; *DANE: 00000000 - swieca wszystkie diody; *DANE: 11110000 - swieca 4-y gorne diody, Patrz funkcja Skaluj80; Wyswietl LDAB #%00000000 Blokada przerzutnikow D STAB PORTB 29

LDAB #%00000001 Adres poczatkowy (1-y bargraf) RD1 STAA PORTC Dane na port C * JSR Delay1 STAB PORTB Adres na port B PSHB LDAB #%00000000 Blokada przerzutnikow D STAB PORTB PULB LSLB RD2 STAA PORTC Dane na port C * JSR Delay1 STAB PORTB Adres na port B PSHB LDAB #%00000000 Blokada przerzutnikow D STAB PORTB PULB LSLB RD3 STAA PORTC Dane na port C * JSR Delay1 STAB PORTB Adres na port B PSHB LDAB #%00000000 Blokada przerzutnikow D STAB PORTB PULB LSLB RD4 STAA PORTC Dane na port C * JSR Delay1 STAB PORTB Adres na port B PSHB LDAB #%00000000 Blokada przerzutnikow D STAB PORTB PULB LSLB RD5 30

STAA PORTC Dane na port C * JSR Delay1 STAB PORTB Adres na port B PSHB LDAB #%00000000 Blokada przerzutnikow D STAB PORTB PULB LSLB RD6 STAA PORTC Dane na port C * JSR Delay1 STAB PORTB Adres na port B PSHB LDAB #%00000000 Blokada przerzutnikow D STAB PORTB PULB LSLB RD7 STAA PORTC Dane na port C * JSR Delay1 STAB PORTB Adres na port B PSHB LDAB #%00000000 Blokada przerzutnikow D STAB PORTB PULB LSLB RD8 STAA PORTC Dane na port C * JSR Delay1 STAB PORTB Adres na port B PSHB LDAB #%00000000 Blokada przerzutnikow D STAB PORTB PULB *#################################################################### 31

* Funkcja na potrzeby testow - wysyla na diody tylko jedna ramke *danych oraz adres jednego przerzutnika - tutaj nr 8 Wyswietl8 LDAB #%00000000 Blokada przerzutnikow D STAB PORTB LDAB #%10000000 RD8 STAA PORTC Dane na port C * JSR Delay1 STAB PORTB Adres na port B LDAB #%00000000 Blokada przerzutnikow D STAB PORTB *#################################################################### *Odczytuje wszystkie 8 kanalow przetwornika i zapisuje dane do *Rejestrow danych RD1-RD8 Read8 #%10001111 Bajt konfiguracyjny dla MAXA ch 0 JSR ReadMAX JSR ConvData Zapisanie danych na jednym bajcie STAA RD1 #%11001111 Bajt konfiguracyjny dla MAXA ch 1 JSR ReadMAX JSR ConvData STAA RD2 #%10011111 Bajt konfiguracyjny dla MAXA ch 2 JSR ReadMAX JSR ConvData STAA RD3 #%11011111 Bajt konfiguracyjny dla MAXA ch 3 JSR ReadMAX JSR ConvData STAA RD4 #%10101111 Bajt konfiguracyjny dla MAXA ch 4 JSR ReadMAX JSR ConvData STAA RD5 #%11101111 Bajt konfiguracyjny dla MAXA ch 5 32

JSR ReadMAX JSR ConvData STAA RD6 #%10111111 Bajt konfiguracyjny dla MAXA ch 6 JSR ReadMAX JSR ConvData STAA RD7 #%11111111 Bajt konfiguracyjny dla MAXA ch 7 JSR ReadMAX JSR ConvData STAA RD8 *#################################################################### *Konwersja RB2 i RB3 do jednego bajtu, gdyz *po odczytaniu MAXA RB2=00XXXXXX - X to dane, *natomiast RB3=XX000000 - RB3 zawiera 2 młodsze bity, *pozostałe 6starszych znajduje sie w RB2. *Konwersja powoduje, że wszystkie 8 bitow znajdzie sie w ACCA *Tutaj takze dokonywana jest korekcja zera i wzmocnienie sygnalu *Aktualna przekonwertowana dana znajduje sie w ACCA ConvData RB2 przepisanie danych LDAB RB3 LSLB przes. logic. B w lewo, reszta w C ROLA rot. A w lewo, C -> LSB, MSB -> C LSLB przes. logic. B w lewo, reszta w C ROLA rot. A w lewo, C -> LSB, MSB -> C * A zawiera juz 8 bitow danych LDAB K Zaladowanie do ACCB wart. wsp. K CMPA K Porownanie K z ACCA BHS Mniej Skocz jesli rowne lub mniejsze * Jesli K wieksze od ACCA TAB Przepisz A->B, aby po odjeciu * nie dostac wartosci ujemnej Mniej SBA Odjecie od pomiaru wart. wsp K * Dokładniej ACCA <- ACCA - ACCB 33

LDAB P ACCB <- P MUL ACCD <- ACCA x ACCB CPD #255 Czy ACCD <= 255?? BLS Less Tak, jest mniejsze lub rowne LDAB #255 Nie, ACCB <- 255 Less TBA ACCA <- ACCB *#################################################################### *Wyslanie bajtu z danymi na RS *SendDec wysyła poszczegolne bajty w postaci dziesietnej, ale: * - jesli liczba jest >=100 (przyjmijmy, ze rowna 100), to zobaczymy * na konsoli liczbe 100. * - jesli 10<=liczba<100, to na wyswietlaczu pojawi sie: spacja10 * - jesli liczba <10 to na konsoli zobaczymy np: spacja spacja9 *Aby wyslac zawartosc rejestru w postaci jednego bajtu nalezy uzyc * funkcji SendC (ta jest teraz traktowana jako koment.) * Aby nie rozdzielac wysylanych danych spacjami nalezy pozbyc sie *dwoch linii za te spacje odpowiedzilnych. *Dana w ACCA SendData JSR SendDec Wyslanie bajtu w postaci dziesietnej ****** JSR SendC Wyslanie bajtu (kod ASCII) #$20 Zaladowanie spacji JSR SendC Wyslanie spacji... *#################################################################### *Czytaj dane z MAX1112 ********************************************** *bajty z danymi to RB2 i RB3 *Ramka wejsciowa dla MAXA powinna byc w ACCA przed wywolaniem proced. 34

ReadMAX STAA SPDR Wyslanie na SPI bajtu inicjujacego JSR GetByte Odczyt bajtu z SPI STAA RB1 1 bajt to bzdury #$00 STAA SPDR Wyslanie 2 bajtu 00h JSR GetByte i jednoczedne odebranie danych STAA RB2 1-y bajt poprawnych danych w RB2 #$00 STAA SPDR Wyslanie 3 bajtu 00h JSR GetByte i jednoczedne odebranie danych STAA RB3 2-i bajt poprawnych danych w RB3 *#################################################################### *Odczyt bajtu z SPI************************************************** *Wynik w ACCA GetByte SPSR czytaj status ANDA #$80 odbiornik gotowy? BEQ GetByte...nie, poczekaj SPDR tak, gotowy,...czytaj odebrany znak *#################################################################### * Wysylanie trzycyfrowej liczby dziesietnej (%3d) ******************* * dana w ACCA SendDec TAB CLRA liczba w ACCD STAA Blank zerowanie flagi zer nieznaczacych 35

SeDe1 SeDe2 SeDe3 SeDe4 SeDe5 PSHX zachowanie IX na stosie LDX #100 waga pierwszej cyfry IDIV dzielenie przez 100 XGDX reszta w IX TBA wynik ACCA jest zerowy? BNE SeDe1...nie, wyslij cyfre INC Blank ustaw flage zera nieznaczacego #$20 spacja zamiast zera BSR SendC wyslanie znaku BRA SeDe2 BSR Send1D wyslanie cyfry XGDX reszta w ACCD LDX #10 waga drugiej cyfry IDIV dzielenie przez 10 XGDX reszta w IX TBA wynik w ACCA zerowy? BNE SeDe4...nie, wyslij cyfre TST Blank byly setki? BEQ SeDe4...tak, wyslij cyfre #$20 spacja zamiast zera BSR SendC wyslanie znaku BRA SeDe5 BSR Send1D wyslanie cyfry XGDX TBA PULX reszta w ACCD jednostki w ACCA odzyskanie IX ze stosu *#################################################################### * Wyslanie jednej cyfry ********************************************* * dana w ACCA Send1D ADDA # 0 konwersja cyfry do ASCII 36

*#################################################################### * Wyslanie znaku **************************************************** * dana w ACCA SendC SendE TST SCSR nadajnik wolny? BPL SendC...nie, czekaj STAA SCDR wyslanie znaku *#################################################################### * Wysylanie CR+LF *************************************************** SendCrLf #$D ASCII CR BSR SendC #$A ASCII LF BRA SendC *#################################################################### * Pobranie znaku z echem ******************************************** * wynik w ACCA GetC SCSR czytaj status ANDA #$20 odbiornik gotowy? BEQ GetC...nie, czekaj SCDR czytaj odebrany znak BRA SendC wyslij znak (echo) 37

*#################################################################### * Odczyt wartoci wzmocnienia P i kalibracji K ********************** OdczytPK JSR Delay opoznienie dla ADC #%00100000 * ++++- CD..CA - kanal 0 przetwornika * +----- MULT - pojedynczy kanal ADC * +------ SCAN - ciagly tryb pracy STAA ADCTL JSR Delay opoznienie dla ADC ADR1 odczyt zawartosci ADR1 -> ACCA STAA P przepisanie zawartosci ACCA -> P JSR Delay opoznienie dla ADC #%00100001 * ++++- CD..CA - kanal 1 przetwornika * +----- MULT - pojedynczy kanal ADC * +------ SCAN - ciagly tryb pracy STAA ADCTL JSR Delay opoznienie dla ADC CLRA LDAB ADR2 do ACCB gdyz zaraz bedzie to dzielone LDX #4 waga=8, po podzieleniu mamy od 0-31 IDIV dzielenie przez 8 XGDX reszta w IX, wynik w ACCD (ACCB) STAB K LDAB P Zaladuj P do ACCB LDX #63 do IX 63, bo 255/63=4 IDIV dzielenie przez 63 XGDX wynik w ACCD (ACCB), a reszta w IX CMPB #1 Czy ACCB >= 1? BHS Wieksze TAK - skocz do Wieksze LDAB #1 Nie - przypisz ACCB wartosc 1 Wieksze STAB P Przepisz ACCB do P 38

*#################################################################### * Obsluga przerwania od odbionika SCI ******************************* SCISVC SCSR czytaj status ANDA #$20 odbiornik gotowy? BEQ SCISVC...nie, czekaj SCDR czytaj odebrany znak STAA Bylo zapisz znak do zmiennej Bylo RTI *#################################################################### * Opoznienie podstawowe ********************************************* Delay DelLoop LDX #PTime stala do opoznienia DEX koniec odliczania wstecz? BNE DelLoop...nie, kontynuuj *#################################################################### * Opoznienie podstawowe1 ********************************************* Delay1 DelLoop1 LDX #PTime1 stala do opoznienia DEX koniec odliczania wstecz? BNE DelLoop1...nie, kontynuuj 39

*#################################################################### * Wektory obslugi przerwania i restartu ORG SCIVect DW SCISVC wektor obslugi przerwania od SCI ORG ResVect DW Start wektor restartu END 40