Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Передача данных на контроллер по UART через COM порт и вывод их на LCD дисплей⇐ ПредыдущаяСтр 12 из 12
Рис 30. - Схема приема от COM порта по UART
Цель работы: Научиться передавать данные через виртуальный COM порт компьютера на МК. Ход работы: Выбрать в CodeWizard закладки: Сhip, USART, LCD (см. рис. 31).
Нажимаем, на шестеренку.
/***************************************************** Chip type: ATmega16 Program type: Application AVR Core Clock frequency: 1, 000000 MHz *****************************************************/ #include < mega16.h> #include < alcd.h> #include < stdio.h> #define FRAMING_ERROR (1< < FE) #define PARITY_ERROR (1< < UPE) #define DATA_OVERRUN (1< < DOR) #define DATA_REGISTER_EMPTY (1< < UDRE) #define RX_COMPLETE (1< < RXC) #define RX_BUFFER_SIZE 16 #define TX_BUFFER_SIZE 16 char rx_buffer[RX_BUFFER_SIZE]; char tx_buffer[TX_BUFFER_SIZE]; unsigned char rx_wr_index, tx_rd_index, rx_counter, tx_counter, rx_rd_index; bit rx_buffer_overflow; interrupt [USART_RXC] void usart_rx_isr(void) { char status, data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index++]=data; if (++rx_counter == 0) { if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; } } } } interrupt [USART_TXC] void usart_tx_isr(void) { if (tx_counter) { --tx_counter; UDR=tx_buffer[tx_rd_index++]; if (tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; } } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm(" cli") --rx_counter; #asm(" sei") return data; } #pragma used- #endif void main(void) { DDRC=0xFF; UCSRB=0xD8; UCSRC=0x86; UBRRL=0x06; lcd_init(16); #asm(" sei") while (1) { while(j< 5) // цикл пока все 5 символов не будут выведены на экран { lcd_gotoxy(j, 0); //выбираем место куда будет выводиться символ lcd_putchar(getchar()); //выводим на экран j++; //увеличить счетчик } j=0; // обнулить счетчик }
}
Двойным кликом на контроллер открыть меню, и выбрать hex файл который появился в результате компиляции. Нужно указать в настройках компонента COMPIM порт с которого будут считываться данные.
Рис.32 Выбор порта
В случае если мы хотим отправлять данные с этого же компьютера мы должны указать виртуальный порт. Пару связанных COM портов мы создаем при помощи программы com0com. Важное замечания: для 64-битных систем нужно искать программу com0com с подписанными драйверами. Запускаем симуляцию. При помощи терминала отправляем данные на МК.
От симуляции можно легко перейти к работе с реальным железом. Если у вашего пк есть COM порт, то вам для сопряжения с микроконтроллером понадобится преобразователь уровней ТТЛ – RS232. Его легко собрать на микросхеме MAX232. Он нужен, потому что напряжение на выходе данных из COM-порта ПК: · логическая " 1" от -5 до -15 вольт · логический " 0" от +5 до +15 вольт а в МК · логическая " 1" от 1, 8 до напряжения питания вольт · логический \" 0\" от 0 до 1, 3 вольт Схема подключения RS232 примерно такая:
Если у вашего ПК нет СОМ-портов, то нужно юзать адаптер на микросхеме FT232 - он подключается к USB вашего ПК и в системе появляется виртуальный СОМ порт, а на выводах FT232 соответствующие сигналы UART.
.
|