Technika mikroprocesorowa laboratorium. dr inż. Dorota Rabczuk

Podobne dokumenty
GND(VSS) i VCC - masa i zasilanie. V0 - regulacja kontrastu

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

Programowanie Mikrokontrolerów

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Bootloader programming

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

SYSTEM PRZERWAŃ ATmega 32

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Technika Mikroprocesorowa

ATMega328. Memories: Flash memory 32kB SRAM 2kB EEPROM 1kB

Komunikacja w mikrokontrolerach. Wydział Elektroniki Mikrosystemów i Fotoniki Piotr Markowski

WYDZIAŁ ELEKTRYCZNY KATEDRA TELEKOMUNIKACJI I APARATURY ELEKTRONICZNEJ. Instrukcja do zajęć laboratoryjnych. Numer ćwiczenia: 2

Mikroprocesory i Mikrosterowniki Analog-Digital Converter Konwerter Analogowo-Cyfrowy

Czujnik zbliżeniowy indukcyjny

Mikroprocesory i Mikrosterowniki

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

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

start Program mikroprocesorowego miernika mocy generowanej $crystal = deklaracja

Opis procedur asemblera AVR

LABORATORIUM. TIMERY w mikrokontrolerach Atmega16-32

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

Mikroprocesory i Mikrosterowniki

LABORATORIUM. TIMERY w mikrokontrolerach Atmega16-32

2. Architektura mikrokontrolerów PIC16F8x... 13

Komunikacja w mikrokontrolerach. Magistrala szeregowa I2C / TWI Inter-Integrated Circuit Two Wire Interface

Listing_ $crystal = deklaracja

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

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

Instytut Teleinformatyki

Instytut Teleinformatyki

Uproszczony schemat blokowy zespołu 8-bitowego timera przedstawiono na rys.1

Wbudowane układy peryferyjne cz. 2 Wykład 8

Zaliczenie Termin zaliczenia: Sala IE 415 Termin poprawkowy: > (informacja na stronie:

Mikrokontrolery AVR Wprowadzenie

Uniwersalny asynchroniczny. UART Universal Asynchronous Receier- Transmiter

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania. Sterowniki Urządzeń Mechatronicznych laboratorium. Ćw. 3: Timer v1.0

Instytut Teleinformatyki

Zespół Szkół Technicznych. Badanie wyświetlaczy LCD

Programowanie mikrokontrolerów. 8 listopada 2007

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

Komunikacja w mikrokontrolerach Laboratorium

Szkolenia specjalistyczne

LOW ENERGY TIMER, BURTC

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

Wykład 2. Przegląd mikrokontrolerów 8-bit: -AVR -PIC

Rev Źródło:

Komunikacja w mikrokontrolerach Laboratorium

LCD (Liquid Crystal Display)

Instrukcja do ćwiczeń

Alfanumeryczny wyświetlacz LCD

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

Komunikacja w mikrokontrolerach Laboratorium

LABORATORIUM - ELEKTRONIKA Układy mikroprocesorowe cz.2

Technika mikroprocesorowa materiały do laboratorium. Autor: Dorota Rabczuk

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

Podstawy Techniki Mikroprocesorowej Laboratorium

TECHNIKA MIKROPROCESOROWA

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

Mikroprocesory i mikrosterowniki

Programowanie mikrokontrolerów AVR z rodziny ATmega.

AGH Akademia Górniczo- Hutnicza w Krakowie Katedra Elektroniki WIET

Instytut Teleinformatyki

Mikroprocesory i Mikrosterowniki Laboratorium

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

Wbudowane układy peryferyjne cz. 1 Wykład 7

Instytut Teleinformatyki

HC541 8-bitowy bufor jednokierunkowy HC245 8-bitowy bufor dwukierunkowy HC244 dwa 4-bitowe bufory jednokierunkowe

CW-HC08 Programowanie mikrokontrolera MC9S08QD4 [2]

Obsługa modułu wyświetlacza LCD

Instrukcja obsługi i użytkowania Panel sterujący KPZ 52(E) 7

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

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

Programowanie mikrokontrolerów. 5 grudnia 2007

Układy czasowo-licznikowe w systemach mikroprocesorowych

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

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

PRZETWORNIK ADC w mikrokontrolerach Atmega16-32

Inż. Kamil Kujawski Inż. Krzysztof Krefta. Wykład w ramach zajęć Akademia ETI

Programowanie Układów Logicznych kod kursu: ETD6203. Komunikacja z układami cyfrowymi W dr inż. Daniel Kopiec

Wykład 4. Przegląd mikrokontrolerów 16-bit: - PIC24 - dspic - MSP430

Dokumentacja Techniczna. Czytnik RFID UW-M4GM

PROGRAMOWALNE SYSTEMY MECHATRONIKI

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

Układy czasowo-licznikowe w systemach mikroprocesorowych

PRUS. projekt dokumentacja końcowa

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

Dodatek D. Układ współpracy z klawiaturą i wyświetlaczem 8279

Expandery wejść MCP23S17 oraz MCP23017

Ćwiczenie 7 Matryca RGB

LabVIEW PLATFORMA EDUKACYJNA Lekcja 6 LabVIEW i Arduino programy wykorzystujące wyświetlacz LCD, czujnik temperatury, PWM i diodę LED

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

Urządzenia peryferyjne RS-232. Wykład 2

Programowanie mikrokontrolerów AVR

Wyświetlacze graficzne : 162x64 z kontrolerem S1D x60 z kontrolerem S1D15710

OPBOX ver USB 2.0 Mini Ultrasonic Box with Integrated Pulser and Receiver

Układy czasowe / liczniki (timers/counters)

Moduł mikrokontrolera PROTON (v1.1)

Transkrypt:

Technika mikroprocesorowa laboratorium dr inż. Dorota Rabczuk

Features High Performance, Low Power AVR 8-Bit Microcontroller Advanced RISC Architecture 131 Powerful Instructions Most Single Clock Cycle Execution 32 x 8 General Purpose Working Registers Fully Static Operation Up to 20 MIPS Throughput at 20 MHz On-chip 2-cycle Multiplier High Endurance Non-volatile Memory Segments 4/8/16/32K Bytes of In-System Self-Programmable Flash progam memory (ATmega48PA/88PA/168PA/328P) 256/512/512/1K Bytes EEPROM (ATmega48PA/88PA/168PA/328P) 512/1K/1K/2K Bytes Internal SRAM (ATmega48PA/88PA/168PA/328P) Write/Erase Cycles: 10,000 Flash/100,000 EEPROM Data retention: 20 years at 85 C/100 years at 25 C(1) Optional Boot Code Section with Independent Lock Bits In-System Programming by On-chip Boot Program True Read-While-Write Operation Programming Lock for Software Security ATmega48PA ATmega88PA ATmega168PA ATmega328P

Features Peripheral Features Two 8-bit Timer/Counters with Separate Prescaler and Compare Mode One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode Real Time Counter with Separate Oscillator Six PWM Channels 8-channel 10-bit ADC in TQFP and QFN/MLF package Temperature Measurement 6-channel 10-bit ADC in PDIP Package Temperature Measurement Programmable Serial USART Master/Slave SPI Serial Interface Byte-oriented 2-wire Serial Interface (Philips I2C compatible) Programmable Watchdog Timer with Separate On-chip Oscillator On-chip Analog Comparator Interrupt and Wake-up on Pin Change ATmega48PA ATmega88PA ATmega168PA ATmega328P

Features Special Microcontroller Features Power-on Reset and Programmable Brown-out Detection Internal Calibrated Oscillator External and Internal Interrupt Sources Six Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, Standby, and Extended Standby I/O and Packages 23 Programmable I/O Lines 28-pin PDIP, 32-lead TQFP, 28-pad QFN/MLF and 32-pad QFN/MLF Operating Voltage: 1.8-5.5V for ATmega48PA/88PA/168PA/328P Temperature Range: -40 C to 85 C Speed Grade: 0-20 MHz @ 1.8-5.5V Low Power Consumption at 1 MHz, 1.8V, 25 C for ATmega48PA/88PA/168PA/328P: Active Mode: 0.2 ma Power-down Mode: 0.1 μa Power-save Mode: 0.75 μa (Including 32 khz RTC) ATmega48PA ATmega88PA ATmega168PA ATmega328P

ATmega328P - pinout

Block Diagram

Clock Systems and their Distribution The device has the following clock source options, selectable by Flash Fuse bits

Default Clock Source The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 programmed, resulting in 1.0MHz system clock. The startup time is set to maximum and time-out period enabled. (CKSEL = "0010", SUT = "10", CKDIV8 = "0"). The default setting ensures that all users can make their desired clock source setting using any available programming interface. Other clock sources Low power crystal oscillator crystal External oscillator Low frequency crystal oscillator Used for real time clock

Active Clock Domains and Wake-up Sources in the Different Sleep Modes

Reset Logic

General Digital I/O

Port Pin Configurations

Binary and hex numbers are best suited to address ports Examples: 0b00000001 = 0x01 0b00000010 = 0x02 0b00000100 = 0x04 0b00001000 = 0x08 0b00010000 = 0x10 0b00100000 = 0x20 0b01000000 = 0x40 0b10000000 = 0x80 _BV(0) = 0b00000001 _BV(1) = 0b00000010 _BV(2) = 0b00000100 _BV(3) = 0b00001000 _BV(4) = 0b00010000 _BV(5) = 0b00100000 _BV(6) = 0b01000000 _BV(7) = 0b10000000

Bitwise operators: & AND OR ~ NOT << SHIFT LEFT >> SHIFT RIGHT Examples: ~ 0b00000001 = ~ _BV(0) = 0b11111110 = 0xFE ~ 0b00000010 = ~ _BV(1) = 0b11111101 = 0xFD ~ 0b00000100 = ~ _BV(2) = 0b11111011 = 0xFB ~ 0b00001000 = ~ _BV(3) = 0b11110111 = 0xF7 ~ 0b00010000 = ~ _BV(4) = 0b11101111 = 0xEF ~ 0b00100000 = ~ _BV(5) = 0b11011111 = 0xDF ~ 0b01000000 = ~ _BV(6) = 0b10111111 = 0xBF ~ 0b10000000 = ~ _BV(7) = 0b01111111 = 0x7F

Bitwise operators: & AND OR ~ NOT << SHIFT LEFT >> SHIFT RIGHT 0b00000001 = (1<<0) 0b00000010 = (1<<1) 0b00000100 = (1<<2) 0b00001000 = (1<<3) 0b00010000 = (1<<4) 0b00100000 = (1<<5) 0b01000000 = (1<<6) 0b10000000 = (1<<7) ~ 0b00000001 = 0b11111110 = ~(1<<0) ~ 0b00000010 = 0b11111101 = ~(1<<1) ~ 0b00000100 = 0b11111011 = ~(1<<2) ~ 0b00001000 = 0b11110111 = ~(1<<3) ~ 0b00010000 = 0b11101111 = ~(1<<4) ~ 0b00100000 = 0b11011111 = ~(1<<5) ~ 0b01000000 = 0b10111111 = ~(1<<6) ~ 0b10000000 = 0b01111111 = ~(1<<7)

Example: Bitwise OR PORTD = 0b???????? Number= 0b00000100???????? unknown bits 00000100 =?????1?? result: one bit set Example: Bitwise NOT PORTD = 0b10101010 ~PORTD = 0b01010101 Example: Bitwise AND PORTD = 0b???????? Number= 0b11111011 Example: Bitwise SHIFT PORTD = 0b10101010 PORTD<<1 = 0b01010100???????? unknown bits & 11111011 =?????0?? result: one bit cleared

PORTD, 2 as input internally pulled up DDRD = DDRD & 0xFB; (input) PORTD = PORTD 0x04; (pullup) PORTD, 2 as input floating (high Z) DDRD = DDRD & 0xFB; (input) PORTD = PORTD & 0xFB; (floating) PORTB, 5 as output DDRB = DDRB 0x20; (output) PORTB = PORTB 0x20; (high) PORTB = PORTB & 0xDF; (low)

PORTD, 2 as input internally pulled up DDRD = DDRD & ~(1<<2); (input) PORTD = PORTD (1<<2); (pullup) PORTD, 2 as input floating (high Z) DDRD = DDRD & ~(1<<2); (input) PORTD = PORTD & ~(1<<2); (floating) PORTB, 5 as output DDRB = DDRB (1<<5); PORTB = PORTB (1<<5); PORTB = PORTB & ~(1<<5); (output) (high) (low)

#define cbi(reg, bitmask) *reg &= ~bitmask #define sbi(reg, bitmask) *reg = bitmask Przykłady: cbi (PORTD, (1<<6)); PORTD &= ~(1<<6); cbi (PORTD, PORTD6); PORTD &= ~(1<< PORTD6); cbi (PORTD, _BV(6)); PORTD &= ~(1<<_BV(6)); sbi (PORTB, (1<<6)); PORTD = (1<<6); sbi (PORTD, PORTD6); PORTD = (1<< PORTD6); sbi (PORTD, _BV(6)); PORTD = (1<<_BV(6));

#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> void setup() { } int main(void) { setup(); while (1) loop() return 0; } void setup() { DDRB = DDRB 0x20; } void loop() { PORTB = PORTB 0x20; delay(1000); // wait for a second PORTB = PORTB & 0xDF; delay(1000); }

Interrupt Vectors in ATmega328P

External Interrupts The External Interrupts are triggered by the INT0 and INT1 pins Register Description

External Interrupts Register Description

Przerwanie poziomem niskim hierarchia przerwań #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> void setup() { DDRD = (1<<5) (1<<6); PORTD = (1<<5) (1<<6); DDRD &= ~(1<<2) & ~(1<<3); PORTD = (1<<2) (1<<1<<3); EICRA =0; EIMSK = sei(); } ISR (INT0_vect) { PORTD = PORTD & ~(1<<5); } ISR (INT1_vect) {.. } void loop() {.. }

Przerwanie zboczem - stany nieustalone przycisku

Przerwanie zboczem - przykład #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> void setup() { DDRD = (1<<5); PORTD = (1<<5); DDRD &= ~(1<<2); PORTD = (1<<2); EICRA = (1<<ISC00); EIMSK = sei(); } void loop() {.. } ISR (INT0_vect) { switch(a) { } } case(0): _delay_ms(50); PORTD = PORTD & ~(1<<5); EIFR = EIFR (1<<INTF0); a =.; break; case(1):.. break;

Przerwania zewnętrzne PCINT Przerwania zewnętrzne PCINT dostępne są na pinach PCINT23 - PCINT0. W rejestrze PCICR leżą bity aktywacji przerwań PCINT0-7(bit PCIE0), PCINT8-14(bit PCIE1), PCINT15-23(bit PCIE2). W rejestrach PCMSK0, 1, 2 leżą maski indywidualne przerwań PCINT23-0. Przerwania PCINT23-0 są aktywowane każda zmianą na odpowiadających pinach wejściowych.

Przerwanie zewnętrzne PCINT - przykład #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> void setup() { DDRB = (1<<z); PORTB = (1<<z); PCICR = (1<<PCIEy); PCMSKy = (1<<PCINTx); sei(); } int main(void) { setup(); while (1) loop() return 0; } ISR(PCINTy_vect) { switch(a) { case(0): _delay_ms(50); PORTB = PORTB (1<<z); PCIFR = PCIFR (1<<PCIFy); a =.; break; } } void loop() {} case(1):.. break;

Timery/Liczniki Moduły liczników/timerów liczają impulsy zegarowe mikrokontrolera lub impulsy na liniach zewnętrznych mikrokontrolera. Timer 8-bitowy przepełnia się na wartości 2 8 a timer 16-bitowy przepełnia się na wartości 2 16. Po przepełnieniu rejestr liczący TCNT0 zapełnia się zerami, a Timer zlicza nadal. Prescaler wydłuża N-krotnie krok timera, tym samym wydłużając czas do przepełnienia. Prescaler timera 0

Rejestry: zliczania, masek i flag timera 0 Rejestr zliczania Rejestr masek Maski trybów porównawczych A i B Maska trybu przepełnienia Rejestr flagowy Flagi trybów porównawczych A i B Flaga przepełnienia

Prescaler timera 1

Rejestry: zliczania, masek i flag timera 1 Maska trybu przechwytu Maski trybów porównawczych A i B Maska trybu przepełnienia Flaga przechwytu Flagi trybów porównawczych A i B Flaga przepełnienia

Timer0 programowe sprawdzanie flagi przepełnienia Timer0 - przerwanie OVERFLOW loop() { while (! (TIFR & (1<<TOV0))); TIFR =(1<<TOV0); PORTB &= ~(1<<6); while( );.. } setup() { TCCR0 =. DDRB = (1<<6); } ISR (TIMER0_OVF_vect) {. } int main(void) { TCCR0 =; TIMSK = ; sei(); do { while(1); return 0; }

Timer1 przerwanie trybu COMPARE ISR (TIMER1_COMPA_vect) { TCNT1 = OCR1A = if ((PORTB & (1<<6)) PORTB &=~(1<<6); else PORTB = (1<<6): //PORTB ^= (1 << 6); } Timer1 rejestry trybów porównawczych A i B Przerwanie nie powoduje zerowania rejestru zliczania int main(void) { DDRB = (1<<6); OCR1A = 31250; TCCR1B = (1<<CS12); TIMSK1 = ; sei(); while(1); return 0; }

Timer1 tryb CTC przerwanie powoduje zerowanie rejestru zliczania Wyjście na pinie OC1A lub OC1B (tryby odpowiednio COMPA i COMPB) Możliwość zmiany częstotliwości przebiegu ISR (TIMER1_COMPA_vect) {//zmiana częstotliwości} int main(void) { DDRB = (1<<1) (1<<2); OCR1A = TCCR1B = //tryb ctc TCCR1B = (1<<CS12); TIMSK1 = ; sei(); while(1); return 0; } Stała częstotliwość przebiegu int main(void) { DDRB = (1<<1) (1<<2); OCR1A = //0.5 sekundy TCCR1B = //tryb ctc TCCR1B = (1<<CS12); while(1); return 0; }

Ustawienia trybu CTC

Timer0 tryb fast PWM środek impulsu W zależności od wypełnienia przebiegu środek impulsu wypada w różnej fazie przebiegu Wyjście na pinie OC0A lub OC0B

Timer0 fast PWM na OC0A int bright = 0; void setup() { DDRD = TCCR0A = TCCR0B = // prescaler=64 OCR0A = 0; } void loop() { for (brights = 0; brights < 255; brights++) { OCR0A = bright; _delay_ms(20); //alternatywnie byte a=1; void loop() { bright += a; if(!bright bright>254) a = a; OCR0A = bright; _delay_ms(500); } } for //malejąco {. _delay_ms_(20); } }

Timer0 tryb phase correct PWM środek impulsu Niezależnie od wypełnienia przebiegu środek impulsu wypada zawsze w tej samej fazie przebiegu Wyjście na pinie OC0A lub OC0B

Wyjścia trybów PWM realizowanych z timerami 0, 1, 2

Dioda RGB kolory R, G, B po kolei void setup() { DDRx = //wyjścia OC0A(red), OC0B(green), OC2A(blue) TCCR0A = //fast PWM na OC0A oraz OC0B TCCR0B = // prescaler =256 OCR0A = 0; OCR0B = 0; //fast PWM na OC2A TCCR2A = (1<<COM2A1) (1<<WGM21) (1<<WGM20); TCCR2B = (1<<CS22); OCR2A=0; } void loop() { for (red = 0; red < 255; red++) {.= red; _delay_ms(10);} for (red = 255; red >0; red--) {..= red; _delay_ms(10);} //kolejne kolory }

Dioda RGB mieszanie kolorów podstawowych R, G, B Wygodnie jest stosować parametry wejściowe: hue, saturation i value z cylindrycznej przestrzeni kolorów HSV (odcień, nasycenie i jaskrawość) i przeliczać je na składowe R, G, B 0 < saturation < 255 0 < value < 255 0 < hue < 360 void Hsv2Rgb( double *r, double *g, double *b, double h, double s, double v ) { int i; double f, p, q, t; s/=100.0; v/=255.0; if( s == 0 ) { // (grey) *r = *g = *b = v; return; } h /= 60; i = (int)floor( h ); f = h - i; // factorial part of h p = v * ( 1.0 - s ); q = v * ( 1.0 - s * f ); t = v * ( 1.0 - s * ( 1 - f ) ); switch( i ) { case 0: *r = v; *g = t; *b = p; break; case 1: *r = q; *g = v; *b = p; break; case 2: *r = p; *g = v; *b = t; break; case 3: *r = p; *g = q; *b = v; break; case 4: *r = t; *g = p; *b = v; break; default: *r = v; *g = p; *b = q; break; } }

Dioda RGB - mieszanie kolorów R, G, B w przykładzie przyjęto: saturation =100; value = 100; hue = 0, 60, 120, 180, 240, 300 int main(void) { double red = 0.0; double green = 0.0; double blue = 0.0; double hue = 0; double saturation = 100; double valuee = 100; //fast PWM na OC0A (green), OC0B (red), OC2A (blue) } } while(1) { Hsv2Rgb(&red, &green, &blue, hue, saturation, valuee); red = red * 255.0; green = green * 255.0; blue = blue * 255.0; hue = hue + 20.0; if(hue >= 360) hue = 0; OCR0A = (uint8_t)red; //Red led is connected to pin PD6/digital 6 OCR0B = (uint8_t)green; //Green led is connected to pin PD5/digital 5 OCR2A = (uint8_t)blue; //Blue led is connected to pin PD3/digital pin 3 _delay_ms(200);

Watchdog Timer

Zestawienie rozkazów kontrolera HD44780 Komendy i dane są rozróżniane na podstawie stanu linii RS (0 - komendy; 1 - dane). Kierunek transmisji jest określany stanem linii R/W (0 - Write; 1 - Read). Sterownik HD44780 posiada dwa rodzaje pamięci: pamięć generatora znaków (CGROM/CGRAM) oraz pamięć danych (DDRAM). Pamięć generatora znaków CGROM/CGRAM zawiera graficzną postać znaków wyświetlanych na wyświetlaczu. Oprócz znaków zdefiniowanych na stałe przez producenta sterownika w pamięci CGROM do dyspozycji użytkownika pozostaje 8-znakowa pamięć CGRAM, w której można zdefiniować własne znaki (np. polskie znaki diakrytyczne). Pamięć danych DDRAM ma pojemność 80 bajtów (jeden sterownik HD4478 może obsłużyć maksymalnie 80 znaków, czyli np. 2 linie po 40 znaków, lub 4 linie po 20 znaków).

Połączenia przykładowe

Linie wyświetlacza LCD linia RS: 0 komendy dla sterownika; 1 wyświetlanie znaków ascii linia RW: 0 - zapis do sterownika lcd; 1 - odczyt ze sterownika lcd linia E - impuls aktywujący zapis/odczyt (strob): 0 - stan idle; 1 - stan aktywny linie D0 D7: bity komend lub znaków do wyświetlenia w trybie 8-bitowym linie D4 D7: bity komend lub znaków do wyświetlenia w trybie 4-bitowym

Inicjalizacja LCD //lcd na PORTD #define D7 7 #define D6 6 #define D5 5 #define D4 4 #define E 3 #define RS 2 #define RW 1 RS stan low RW stan low E stan high D7 stan low D6 stan low D5 stan high D4 stan high E stan low //lepiej napisz funkcję void lcd_4bity (unsigned char bajt) { PORTD = (1<<E); if(bajt & 0x01) PORTD = (1<<D4); else. if if if PORTD &= }

Inicjalizacja LCD cd //przejście w tryb sterowania //4-bitowy D7 D6 D5 D4 lcd_4bity (0x0..); //zdefiniuj funkcję nadawania bajtu //w dwóch częściach po 4 bity //najpierw starsze potem młodsze void lcd_bajt (unsigned char bajt) { PORTD = (1<<E); lcd_4bity(..); PORTD &= ~(1<<E); _delay_us(5); PORTD = (1<<E); lcd_4bity(.); PORTD &= ~(1<<E); _delay_us(200); } //posługując się funkcją lcd_bajt () //wydaj po kolei rozkazy inicjujące wyświetlacz Function set Display cursor shift Display ON/OFF Entry mode set Display clear 0b001DNF00 0b0001SR00 0b00001DCB 0b000001IS 0b00000001

Rozkazy z grupy INI Function set (RS= 0, R/W = 0, dane = 001DNFxx) - dla D = 1 - interfejs 8-bitowy - dla D = 0 - interfejs 4-bitowy - dla N = 1 - wyświetlacz dwuwierszowy - dla N = 0 - wyświetlacz jednowierszowy - dla F = 1 - matryca znaków 5*10 punktów - dla F = 0 - matryca znaków 5*7punktów Display cursor shift - (RS = 0, R/W = 0, dane = 0001SRxx) - dla S = 1 - przesuwana jest zawartość okna - dla S = 0 - przesuwany jest kursor - dla R = 1 - kierunek przesuwu w prawo - dla R = 0 - kierunek przesuwu w lewo Display ON/OFF - (RS = 0, R/W = 0, dane = 00001DCB) - dla D = 1 - włączenie wyświetlacza - dla D = 0 - wyłączenie wyświetlacza - dla C = 1 - włączenie kursora - dla C = 0 - wyłączenie kursora - dla B = 1 - włączenie migania kursora - dla B = 0 - wyłączenie migania kursora

Rozkazy z grupy INI Entry mode set - (RS = 0; R/W = 0, dane = 000001IS) - określenie trybu pracy kursora/okna wyświetlacza : - dla S = 1 po zapisaniu znaku do wyświetlacza kursor nie zmienia położenia, natomiast przesuwa się cała zawartość wyświetlacza - dla S = 0 po zapisaniu znaku do wyświetlacza kursor zmienia położenie, a przesuwanie okna jest wyłączone - dla I = 1 kursor lub okno wyświetlacza przesuwa się w prawo (inkrementacja adresu znaku) - dla I = 0 kursor lub okno wyświetlacza przesuwa się w lewo (dekrementacja adresu znaku) Maksymalny czas trwania instrukcji - 40us Display clear - (RS = 0, R/W = 0, dane = 00000001) -instrukcja ta powoduje wyczyszczenie wyświetlacza poprzez wypełnienie go spacjami, ustawienie trybu zapisu danych od pozycji w lewym górnym rogu wyświetlacza oraz wyłączenie trybu przesuwania okna; maksymalny czas trwania instrukcji - 1,64ms Display/cursor home - (RS - 0, R/W = 0, dane = 0000001x) - instrukcja powoduje ustawienie kursora na pozycji pierwszego znaku w pierwszej linii; maksymalny czas trwania instrukcji 1,64ms

Podstawowe rozkazy: DD RAM set - (RS = 0, R/W = 0, dane = 1AAAAAAA) - ustawia adres pamięci wyświetlacza, pod który nastąpi zapis (bądź odczyt) danych operacją Data write lub Data read. Sterownik obsługuje 64 pozycje w każdej linii, dlatego w celu ustawienia kursora w 1-szej linii należy wydać rozkaz 0b10000000, a w drugiej linii rozkaz 0b11000000 Data write - (RS = 1, R/W = 0, dane = zapisywany bajt danych) - zapis danych do pamięci wyświetlacza, bądź pamięci CG RAM (jeśli poprzednio wydano komendę CG RAM set) Pozostałe rozkazy: CG RAM set - (RS= 0, RW = 0, dane = 01AAALLL) - ustawia adres pamięci generatora znaków. AAA - 3-bitowy adres znaku, LLL - 3-bitowy numer linii składającej się na graficzne odwzorowanie znaku. Busy flag read - (RS = 0, R/W = 1, dane = BAAAAAAA) - odczyt flagi zajętości i adresu pamięci wyświetlacza. B - flaga zajętości wyświetlacza, AAAAAAA - 7-bitowy adres pamięci. Data read - (RS = 1, R/W= 1, dane = odczytywany bajt danych) - odczyt danych z pamięci wyświetlacza, bądź pamięci CG RAM (jeśli poprzednio wydano komendę CG RAM set)

Przykłady użycia podstawowych rozkazów //Przykład rozkazu DD RAM set czyli ustawienia pozycji wyświetlania: //RS w stan niski lcd_bajt (wskaż pozycję kursora) ; //Przykład rozkazu Data write czyli wyświetlania znaku: //RS w stan wysoki lcd_bajt('a'); //znak ascii a do wyświetlenia

Analog-to-Digital Converter 10-bit Resolution 0.5 LSB Integral Non-linearity ± 2 LSB Absolute Accuracy 13-260 μs Conversion Time Up to 76.9 ksps (Up to 15 ksps at Maximu Resolution) 6 Multiplexed Single Ended Input Channels 0 - VCC ADC Input Voltage Range Selectable 1.1V ADC Reference Voltage Free Running or Single Conversion Mode Interrupt on ADC Conversion Complete Sleep Mode Noise Canceler

Konfiguracja przetwornika adc

Konfiguracja przetwornika adc

Konfiguracja przetwornika adc Bit 7 ADEN: ADC Enable Bit 6 ADSC: ADC Start Conversion Bit 5 ADATE: ADC Auto Trigger Enable Bit 4 ADIF: ADC Interrupt Flag Bit 3 ADIE: ADC Interrupt Enable Bits 2:0 ADPS2:0: ADC Prescaler Select Bits

Dzielenie liczby na kolumny dziesiętne Liczba / 1000 = tysiące Liczba % 1000 = reszta z tysięcy reszta z tysięcy / 100 = setki reszta z tysięcy % 100 = reszta z setek reszta z setek / 10 = dziesiątki reszta z setek % 10 = reszta z dziesiątek reszta z dziesiątek / 1 = jedności Przykład liczba 4987 4987 / 1000 = 4 4987 % 1000 = 987 987 / 100 = 9 987 % 100 = 87 87 / 10 = 8 87 % 10 = 7 7 / 1 = 7

Kodowanie ascii Kodowanie ascii cyfr wymaga dodania wartości 48 = 0x30

Transoptor odbiciowy Transoptor to optoelektroniczny element półprzewodnikowy, zawierający fotoemiter (najczęściej diodę elektroluminescencyjną z arsenku galu GaAs) i fotodetektor (fototranzystor lub fotodiodę) - zintegrowane we wspólnej obudowie. Transoptory odbiciowe (refleksyjne) znalazły zastosowanie jako czujniki odcienia szarości. Światło emitowane zostaje na powierzchnię znajdującą się po przeciwnej stronie czujnika. Zależnie od odcienia (biel odbija, czerń absorbuje), część światła pada na fotodetektor, na którym pojawia się adekwatne napięcie. Transoptor odbiciowy może także służyć jako np. przełącznik krańcowy wykrywając przed sobą przeszkodę jasnego koloru. http://leksykon.forbot.pl/transoptor,80.htm

Transoptor odbiciowy CNY70 Ze względu na ryzyko uszkodzenia elementu napięcie na fotodiodę (punkt TIN przełącznik 2 zasilania) należy podawać tylko na czas pomiaru. Napięcie z TOUT należy podać na wejście przetwornika ADC. Transoptor przesłaniać na przemian kartką białą i czarną z odległości 3-5cm. Wynik pomiaru o wartości powyżej 500 (przy rozdzielczości przetwornika równej 1024) wskazuje na czarny kolor kartki, a poniżej 100 na biały. T T T TIN TOUT

Kulkowy czujnik przechyłu (tilt sensor) Dwie kulki stalowe zamykają obwód elektryczny w czujniku ustawionym pionowo. Po przechyleniu czujnika kulki przestają domykać obwód.

Joystick analogowy Wyprowadzenia joysticka: X napięcie analogowe proporcjonalne do wychylenia wzdłuż osi X Y napięcie analogowe proporcjonalne do wychylenia wzdłuż osi Y S napięcie Vcc lub 0 wskazujące stan przycisku joysticka

Rozpoznanie ruchu joysticka W górę Brak rozpoznania Brak rozpoznania W lewo W prawo Brak rozpoznania Brak rozpoznania W dół

Klawiatura analogowa KA Napięcie analogowe mierzone na wyjściu KA pozwala rozpoznać, który przycisk naciśnięto

Enkoder obrotowy typ: ALPS EC12 12 kroków w 360 stopniach 2 wyjścia cyfrowe : ERC1 i ERC2 zmiany stanu na wyjściach wskazują kierunek obrotu

Ćwiczenia do wyboru: 1. Jeśli czujnik odbiciowy rozpoznaje powierzchnię białą wówczas kolejne naciśnięcia przycisku nr 1 klawiatury analogowej przedłużają świecącą linijkę o 1 diodę (do 8-miu), a jeśli czujnik odbiciowy rozpoznaje powierzchnię czarną kolejne naciśnięcia przycisku nr 1 klawiatury analogowej skracają linijkę świecącą o 1 diodę 2. Kolejne obroty enkodera w prawo przedłużają świecącą linijkę o 1 diodę (do 8-miu), a kolejne obroty enkodera w lewo skracają linijkę świecącą o 1 diodę 3. Kolejne wychylenia joysticka w górę przedłużają świecącą linijkę o 1 diodę (do 8-miu), a kolejne wychylenia joysticka w dół skracają linijkę świecącą o 1 diodę 4. Krótkie naciśnięcia switcha samopowrotnego (poniżej 1s) przedłużają świecącą linijkę o 1 diodę (do 8- miu), a długie naciśnięcia switcha samopowrotnego (powyżej 2s) skracają linijkę świecącą o 1 diodę

USART Interface and USART connection to PC COM MAX 232 converts signals from an RS-232 serial port to signals suitable for use in TTL

USART to USB adapter

Asynchronous USART transmission Start bit Data bits Parity bit Stop bits

#define FOSC 16000000 // Clock Speed #define BAUD 9600 #define MYUBRR FOSC/16/BAUD-1

Bit 7 RXCn: USART Receive Complete Bit 6 TXCn: USART Transmit Complete Bit 5 UDREn: USART Data Register Empty Bit 4 FEn: Frame Error Bit 3 DORn: Data OverRun Bit 2 UPEn: USART Parity Error Bit 1 U2Xn: Double the USART Transmission Speed Bit 0 MPCMn: Multi-processor Communication Mode Bit 7 RXCn: Flaga odbioru znaku Bit 6 TXCn: Flaga nadania znaku Bit 5 UDREn: Flaga pustego bufora nadawczego (mieści 2 znaki) Bit 4 FEn: Błąd ramki Bit 3 DORn: Błąd nadpisania znaku (nie odczytanego) Bit 2 UPEn: Błąd parzystości Bit 1 U2Xn: Podwojona prędkość transmisji Bit 0 MPCMn: Tryb z adresowaniem odbiorników Bit 7 RXCIEn: RX Complete Interrupt Enable n Bit 6 TXCIEn: TX Complete Interrupt Enable n Bit 5 UDRIEn: Data Register Empty Interrupt Enable n Bit 4 RXENn: Receiver Enable n Bit 3 TXENn: Transmitter Enable n Bit 2 UCSZn2: Character Size n Bit 1 RXB8n: Receive Data Bit 8 n Bit 0 TXB8n: Transmit Data Bit 8 n Bit 7 RXCIEn: Maska przerwania odbioru znaku Bit 6 TXCIEn: Maska przerwania nadania znaku Bit 5 UDRIEn: Maska przerwania pustego bufora nadawczego Bit 4 RXENn: Włączenie odbiornika Bit 3 TXENn: Włączenie nadajnika Bit 2 UCSZn2: Liczba bitów danych Bit 1 RXB8n: 8-my bit odebrany Bit 0 TXB8n: 8-my bit nadawany

Transmisja może się odbywać w pełnym dupleksie char a,o; ISR (USART_RX_vect) { o = UDR0; lcd_bajt(o); } ISR (USART_TX_vect) { UDR0 = a++; } int main (void) { setup(); a = 30; UDR0 = a; sei(); while (1) ; return 0; }

Zasada pracy rejestru przesuwnego 74HC595 Bity danych są wprowadzane synchronicznie szeregowo po linii DS, a wyprowadzane równolegle na liniach Q0-Q7. Dane są wprowadzane do rejestru przesuwnego 74HC595 zboczem narastającym zegara SH_CP Linia ST_CP (latch) jest w stanie niskim podczas wprowadzania danych 1 1 0 0 0 0 1 1 Dane są wyprowadzane na linie równoległe Q0 Q7 zboczem narastającym impulsu ST_CP (latch) Linia DS linia danych wprowadzanych szeregowo Linia SH_CP impulsy zegarowe Linia ST_CP latch, stan idle = stan wysoki, podczas transferu danych przechodzi w stan niski, po czym ponownie wraca na stan wysoki bezczynny Linia Q0 Q7 linie danych wyprowadzanych równolegle

ST_CP DS SH_CP SH_CP ST_CP DS Do wyjść równoległych rejestru 74HC595 można podłączyć Np. diody, switch e lub wyświetlacz 7-segmentowy. Na schemacie powyżej linia A została podłączona do wyjścia Q0 itd., a kropka DP do wyjścia Q7.

Łączenie łańcuchowe rejestrów przesuwnych 74HC595 daisy chain Oprócz wyprowadzeń równoległych na liniach Q0-Q7 rejestr przesuwny 74HC595 posiada również wyjście szeregowe na linii Q7. Wyjście to może zostać wykorzystanie do podania danych na wejście kolejnego rejestru przesuwnego w łańcuchu. W połączeniu łańcuchowym wyjście rejestru n wyprowadza dane na wejście rejestru n+1 w łańcuchu. Takie połączenie pozwala na oszczędność linii mikrokontrolera.

Łączenie łańcuchowe rejestrów przesuwnych 74HC595 daisy chain ST_CP SH_CP DS W układzie laboratoryjnym Mizero http://net-rabbits.eu/ w łańcuch daisy chain połączono 5 rejestrów przesuwnych 74HC595. Na wyjściu 4-ch z nich znajdują się wyświetlacze 7-segmentowe, na wyjściu piątego podłączono 8 diod świecących na niebiesko. W celu poprawnego wysterowania urządzeń w łańcuchu należy podać bajt sterujący na każde z nich tj. w sumie 5 bajtów.

//74HC595 na PORTB #define ST_CP 2 #define DS 3 #define SH_CP 5 void setup (void) { DDRB = (1<<ST_CP) (1<<DS) (1<<SH_CP); PORTB = (1<<ST_CP); PORTB &= ~(1<<SH_CP) & ~(1<<DS); } void transfer_74hc595 (unsigned char dana) { PORTB &= ~(1<<ST_CP); if (dana & (0x80)) PORTB = (1<<DS); else PORTB &= ~(1<<DS); PORTB = (1<<SH_CP); _delay_us(1); PORTB &= ; _delay_us(1); PORTB &=..; _delay_us(1);.. PORTB = (1<<ST_CP); } Funkcja transfer_74hc595 (unsigned char dana) pobiera 8 bitów danych i analizując bit po bicie kolejno wystawia je na linię DS. Każdemu bitowi na linii DS musi towarzyszyć impuls dodatni na linii SH_CP (prostokąty podświetlone). Czas stanu niskiego i wysokiego impulsu to 1us.

SCK = SH_CP CS = ST_CP MOSI = DS W celu usprawnienia obsługi rejestru łączymy linie SH_CP, ST_CP i DS. z liniami magistrali SPI. Będziemy teraz mogli skorzystać z rejestrów interfejsu SPI mikrokontrolera tj. podać od razu bajt danych dla linii DS oraz wydać rozkaz generowania impulsów zegarowych na potrzeby wpisu do rejestru 74HC595 zamiast programowego taktowania linii zegarowej.