Управлять микроконтроллером Atmega88 с ПК по UART можно и без кварца – от внутреннего RC-генератор 8МГц!!!
Для примера возьмем два светодиода и с компьютера через терминал будем включать и выключать их.
Если мы вводим в терминале цифру:
1, то включается светодиод на PC5 (28 ножка),
2, то выключается светодиод на PC5 (28 ножка),
3, то включается светодиод на PC4 (27 ножка),
4, то выключается светодиод на PC4 (27 ножка),
Схема устройства подключения Atmega88:
Скачать файл прошивки hex и с:
– в zip архиве.
– в tar.gz архиве.
Фьюзы для ATmega88 такие же как по умолчанию, снял только делитель на 8 (CKDIV8 – убрал галочку) – программа AVR8_Burn-O-Mat, такие же будут и на PonyProg2000:
———-
USB-TTL (USB-UART) преобразователь использовал – USB-UART для Адуино – HW-597 (на микросхеме CH340).
Но можно сделать его самому на Atmega88 (и других Atmega: ATtiny45/85, ATtiny2313/AT90S2313 и ATmega8/48/88/168), вот писал в одной из своей предыдущей записи:
“gameforstreet.ru/usb-ttl-usb-uart-preobrazovatel-na-atmega/”
А также можно собрать COM-TTL преобразователь – на микросхеме max232 – более подробно здесь – схема и как работает:
“gameforstreet.ru/uart-pic16f690/”
—————
Код на С для кварца 4 МГц (UBRR0L в комментах рассчитан на 10 МГц, 12 МГц и 14745600 Гц):
#include <avr/io.h> #include "delay.h" #include "delay.c" #include <util/delay.h> //*** Инициализация UART ***// void uart_init(void) { //скорость обмена данными UBRR0H = 0; //старший байт UBRR0L = 51; //младший байт 9600 и 8 МГц //8 бит данных, 1 стоп бит, без контроля четности UCSR0B = (1<<RXEN0)| (1<<TXEN0);// 1 - разрешщаем прием 2 разрешаем передачу UCSR0C = (1<<UCSZ01)| (1<<UCSZ00); // Асинхронная передача, Без режима четности, 1 стоп бит. 8 бит размер данных } //*** Прием данных по UART ***// unsigned char uart_receive(void) { while ( !(UCSR0A & (1<<RXC0)) ); return UDR0; } //*** Передача данных по UART ***// void uart_transmit(unsigned char data) { while( !(UCSR0A & (1<<UDRE0))); UDR0 = data; } //*** Главная программа ***// int main(void) { DDRD = 0x00; //установим все порты DDRD как входы PORTD = 0x00; //установим логический 0 на все порты DDRD DDRC = (1 << 5) | (1 << 4); //установим порты PC5 и PC4 регистра DDRC на выход PORTC &= ~(1 << 5) | ~(1 << 4); //установим сигнал низкого уровня (логическай 0) на выводы PC5 и PC4 регистра DDRC char data; uart_init(); while(1) { data=uart_receive(); if(data=='1') { PORTC |= 1 << 5; //устанавливаем логическую 1 на порт PC5 регистра DDRC } if(data=='2') { PORTC &= ~(1 << 5); //устанавливаем логический 0 на порту PC5 регистра DDRC } if(data=='3') { PORTC |= 1 << 4; //устанавливаем логическую 1 на порт PC4 регистра DDRC } if(data=='4') { PORTC &= ~(1 << 4); //устанавливаем логический 0 на порту PC4 регистра DDRC } uart_transmit(data); } }
——————
Как рассчитывается UBRRL
Выбранный вами генератор может быть любой! Это делается путем установки значения UBRRL. Формула для этого здесь:
Примеры расчётов:
Если выбрать – 8 МГц от внутреннего RC-генератор 8МГц
Для начала необходимо рассчитать скорости обмена по UART с учетом использования наших данных:
img
от внутреннего RC-генератор 8МГц = 8 Mhz;
скорость передачи = 9600;
количество бит данных = 8;
количество стоп-бит = 1;
контроль четности = запрещен.
За настройку скорости отвечает регистр UBRR.
Рассчитать его можно по формуле:
img
UBRR = ( F /( B * 16 ) ) — 1
где: F — тактовая частота МК (частота в Hz); B — требуемая скорость (бит/с).
подставив наши данные получим:
img
UBRR = (8000000/(9600*16))-1 = 51 (берём 51,тогда ошибка передачи будет в 1% (на результат работы схемы никак не сказывается) и нужно будет поменять в коде UBRR0L = 51;))
Аналогично рассчитывается для других значений кварца.
———————————-
Терминал использовал Cutecom (можно использовать putty)
Как его установить для Linux и Windows написал здесь:
Подключаем микроконтроллер PIC к USB (UART) на Linux и Windows
———————————-