Страница 1 из 2
Подключение Atmega8 к ПК по UART.
Добавлено: Пт авг 16, 2013 09:18:57
kushman
Добрый день!
Спаял платку с Atmega8, подключил к нему LCD-дисплей, а UART через кабель со встроенной микросхемой AD232
подключил к COM-порту компьютера. Код сгенерил с помощью CodeVisionAVR, прошиваю и запускаю HyperTerminal - а на
экране ничего, совсем. Частота кварца - 12 МГц, скорость обмена 9600. Кабель 100% рабочий, замыкаю Rx на Tx, все
возвращается обратно. Но вот передача не работает, в чем может быть загвоздка? Ведь даже если со скоростями я
ошибся, должны появляться хотя бы какие либо кракозябры в HyperTerminal, а там полная пустота.
Rx и Tx как я понял подключегы крест накрест уже в кабеле.
Вот код:
Код: Выделить всё
#include <mega8.h>
#include <stdio.h>
void init_UART()
{
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x4D;
}
void UART_Transmit(unsigned char data)
{
while ( !( UCSRA & (1<<UDRE)) );
sprintf(lcd_buffer, "UART_Send");
send_lcd(set_second_line, lcd_buffer);
UDR = data;
}
void main(void) {
DDRB=0xFF;
DDRD=0xFF;
DDRC=0x60; //0x60
LCD_Init();
init_UART();
while(1) {
UART_Transmit(0x52);
delay();
}
}
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пт авг 16, 2013 10:20:45
Engineer_Keen
kushman писал(а):Спаял платку с Atmega8, подключил к нему LCD-дисплей
В коде не видно к каким ногам... Я не пишу на Си, но возможно процедура инициализации LCD пытается что-нибудь прочитать с него, но не зная как от подключен не может этого сделать. Возможно программа дальше этой строки и не идет. Достаточно после инициализации зажечь светодиод на любой свободной ноге, чтобы выяснить это.
kushman писал(а):прошиваю и запускаю HyperTerminal - а на экране ничего, совсем.
А на LCD-дисплее есть что? Насколько я понимаю перед передачей должно высветиться "UART_Send".
kushman писал(а):Rx и Tx как я понял подключегы крест накрест уже в кабеле.
Это нужно знать 100%, вы уверены что они крест-накрест?
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пт авг 16, 2013 20:47:27
fawkes
void init_UART()
{
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x4D;
}
Как я понял включен только TX.
Для 12МГц код правильный, а есть ли уверенность, что там 12МГц? FUSE биты установлены на работу с внешним кварцем?
Нужно разделить поиск проблемы на 2 подзадачи:
1. проверить, что LCD работает, для чего послать на оный любую строку.
2. проверить, что работает UART.
Начинать решение можно с любой.
Я бы начал с дисплея, просто в начале работы вывести строчку на экран.
Кстати, а где процедура инициализации дисплея? вызов ее я вижу, а вот сама она в порядке? может Engineer_Keen прав на счет лап?
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Вс авг 18, 2013 11:49:45
misyachniy
Лучше всего передавать непрерывно без пропусков букву 'U' тогда на виходе видно частоту в два раза ниже частоты передачи.
Проверить кабель просто.
Если кросс-кабель то выводы 2 и 3 взаимно перекрещены.
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пн авг 19, 2013 10:27:47
kushman
Добрый день!
LCD-дисплей прекрасно работает и перед передачей выводит на экран ту самую строку - UART_Send. Процедуру инициализации дисплея, функции вывода и т.п. я не стал выкладывать, чтобы не городить тут лишний код.
У UART-а действительно включен только передатчик. Маркировка на кварце говорит, что там именно 12 МГц. А вот насчет FUSE-битов засомневался, приду домой - проверю. Но ведь даже если я что-либо напутал с кварцем, в окне HyperTerminal должно появляться хоть что-то? Может я им неправильно пользуюсь? Но и там вроде никаких секретов нет, окрыл, выбрал СОМ-порт, выставил скоростью, и жди пока на экране кракозябры вылезут, так ведь? А то я ей особо никогда не пользовался.
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пн авг 19, 2013 18:36:40
misyachniy
kushman писал(а):Но ведь даже если я что-либо напутал с кварцем, в окне HyperTerminal должно появляться хоть что-то? Может я им неправильно пользуюсь? Но и там вроде никаких секретов нет, окрыл, выбрал СОМ-порт, выставил скоростью, и жди пока на экране кракозябры вылезут, так ведь?
Трудно сказать. рекомендую вместо HyperTerminal использовать Terminal v1.9b by Bray.
http://easyelectronics.ru/terminalnye-programmy.html.
Можно оперативно переключать режимы и видеть "кракозябры"
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пн авг 19, 2013 19:31:08
kushman
Использовал данную программу, теперь видно, что передача действительно идет, это самое главное. Но появляются на экране одни нолики, в чем может быть дело? Вот что отображается на экране (см. приложение).
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пн авг 19, 2013 20:15:41
Engineer_Keen
Похоже как раз на несовпадение скоростей. Фьюз clkdiv8 не меняли? Что если в терминале сделать 1200 bps?
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пн авг 19, 2013 20:41:24
kushman
Да, действительно несовпадение скоростей. Только где собака порылась не могу понять, выставил UBRRL=0x33, и на скорости 1200 принимается то что нужно, тот байт что передаю, а clkdiv8 точно не трогал.
А его кстати в Atmega8 и нету)
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пн авг 19, 2013 20:53:06
ILYAUL
Что-то я не помню , чтобы в 8-ке был CKDIV8/ Плохая частота 12 - попробуй поиграть в коридоре 4Ah - 4Eh
Кстати 33 соответствует 14400
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пн авг 19, 2013 21:31:20
kushman
ILYAUL писал(а):Что-то я не помню , чтобы в 8-ке был CKDIV8/ Плохая частота 12 - попробуй поиграть в коридоре 4Ah - 4Eh
Кстати 33 соответствует 14400
Да, в 8ке его действительно нет. Но вот что получается, почему я решил попробовать 0x33, видимо все таки контроллер работает от внутреннего генератора на 8 МГц, и действительно происходит деление на 8 (хотя фьюзы настроены на внешний, см. приложение).
То есть я настраиваю контроллер на 8 МГц, на скорость 9600, но передача идет успешно при скорости 1200. Не могу понять в чем дело.
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пн авг 19, 2013 22:12:11
ILYAUL
Я не знаю что в СV означают галочки. Кто работал?
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пн авг 19, 2013 22:34:29
Engineer_Keen
Ну да, нету там делителя, я с 8й никогда не работал, и все фьюзов наизусть не помню
Глянул даташит, раз rstdisbl стоит в 0, получается фьюзы инверсные и относительно нотации atmel cksel получается 1111, т.е. внешний кварц.
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пт авг 23, 2013 05:35:28
foton6
Приветствую всех читающих и прошу помоч в решении одного вопроса)
Передаю числа по UART (4МГц частота, 9600 скорость передачи, 1 стоп бит, 8 битные пакеты)
В протусе все работает отл. На железе приходят кракозябры, причем на разных кварцах краказябры одни и теже Оо
считаю по формуле UBBRx=(F/(16*9600))-1.
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пт авг 23, 2013 07:26:39
Kavka
foton6, вариантов масса. Начиная от неправильной записи битовых операций, до глюков железа.
Формула из спецификации, для нормального режима. Проверьте установку формата передачи и режима двойной скорости. Если ничего не найдёте (по вашему

), то покажите кусок программы, где вы инициализируете USART.
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пт авг 23, 2013 17:59:03
foton6
Спойлер
Код: Выделить всё
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
void init (void)
{
UCSRB|=(1<<TXEN);
UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRL=25;
}
int main(void)
{
init();
while(1)
{
UDR=0x55;
_delay_ms(1000);
}
}
Все перепроверил , косяков не обнаружил(
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пт авг 23, 2013 18:33:49
Kavka
По поводу вот этого.
Код: Выделить всё
UCSRB|=(1<<TXEN);
UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
Ну, как бы по мягче выразиться... В общем, так не пишут. Особенно UCSRC...
Учите матчасть. Курите спецификацию - раздел посвящённый доступу к регистрам UBRRH и UCSRC.
Спойлер
19.9 Accessing UBRRH/UCSRC Registers
19.9.2 Read Access
Doing a read access to the UBRRH or the UCSRC Register is a more complex operation. How-
ever, in most applications, it is rarely necessary to read any of these registers.
The read access is controlled by a timed sequence. Reading the I/O location once returns the
UBRRH Register contents. If the register location was read in previous system clock cycle, read-
ing the register in the current clock cycle will return the UCSRC contents. Note that the timed
sequence for reading the UCSRC is an atomic operation. Interrupts must therefore be controlled
(e.g., by disabling interrupts globally) during the read operation.
Попробуйте вот так.
Код: Выделить всё
UCSRB=(1<<TXEN);
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
И хорошим тоном было бы явно прописать
UBRRH=0;
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пт авг 23, 2013 19:18:49
foton6
Даже если оставить по умалчанию UCSRC.(8 бит)
Все одно и тоже выходит*(
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пт авг 23, 2013 19:39:40
Kavka
Если предыдущие поправки не помогли, то с большой вероятностью это уже не программа виновата.
Схему можете показать? Как оно собрано у вас (фотку)?
Re: Подключение Atmega8 к ПК по UART.
Добавлено: Пт авг 23, 2013 21:50:56
foton6
Схема проста до нельзя)
TxD RxD VCC GND резистор на ресете.
О и кварц