Подключение Atmega8 к ПК по UART.

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Сообщение 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();        
   }         
     
} 
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

kushman писал(а):Спаял платку с Atmega8, подключил к нему LCD-дисплей
В коде не видно к каким ногам... Я не пишу на Си, но возможно процедура инициализации LCD пытается что-нибудь прочитать с него, но не зная как от подключен не может этого сделать. Возможно программа дальше этой строки и не идет. Достаточно после инициализации зажечь светодиод на любой свободной ноге, чтобы выяснить это.
kushman писал(а):прошиваю и запускаю HyperTerminal - а на экране ничего, совсем.
А на LCD-дисплее есть что? Насколько я понимаю перед передачей должно высветиться "UART_Send".
kushman писал(а):Rx и Tx как я понял подключегы крест накрест уже в кабеле.
Это нужно знать 100%, вы уверены что они крест-накрест?
Реклама
Родился
Аватара пользователя
Сообщения: 5
Зарегистрирован: Пт авг 16, 2013 16:28:32

Сообщение 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 прав на счет лап?
Какая разница на каком языке написана программа. Язык важен для программиста, а для процессора важен алгоритм.
Главное в программе - это комментарий.
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт июл 02, 2013 09:17:49

Сообщение misyachniy »

Лучше всего передавать непрерывно без пропусков букву 'U' тогда на виходе видно частоту в два раза ниже частоты передачи.
Проверить кабель просто.
Если кросс-кабель то выводы 2 и 3 взаимно перекрещены.
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Сообщение kushman »

Добрый день!
LCD-дисплей прекрасно работает и перед передачей выводит на экран ту самую строку - UART_Send. Процедуру инициализации дисплея, функции вывода и т.п. я не стал выкладывать, чтобы не городить тут лишний код.

У UART-а действительно включен только передатчик. Маркировка на кварце говорит, что там именно 12 МГц. А вот насчет FUSE-битов засомневался, приду домой - проверю. Но ведь даже если я что-либо напутал с кварцем, в окне HyperTerminal должно появляться хоть что-то? Может я им неправильно пользуюсь? Но и там вроде никаких секретов нет, окрыл, выбрал СОМ-порт, выставил скоростью, и жди пока на экране кракозябры вылезут, так ведь? А то я ей особо никогда не пользовался.
Реклама
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт июл 02, 2013 09:17:49

Сообщение misyachniy »

kushman писал(а):Но ведь даже если я что-либо напутал с кварцем, в окне HyperTerminal должно появляться хоть что-то? Может я им неправильно пользуюсь? Но и там вроде никаких секретов нет, окрыл, выбрал СОМ-порт, выставил скоростью, и жди пока на экране кракозябры вылезут, так ведь?
Трудно сказать. рекомендую вместо HyperTerminal использовать Terminal v1.9b by Bray.
http://easyelectronics.ru/terminalnye-programmy.html.

Можно оперативно переключать режимы и видеть "кракозябры"
Реклама
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Сообщение kushman »

Использовал данную программу, теперь видно, что передача действительно идет, это самое главное. Но появляются на экране одни нолики, в чем может быть дело? Вот что отображается на экране (см. приложение).
Вложения
UART.jpg
(189.05 КБ) 905 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Похоже как раз на несовпадение скоростей. Фьюз clkdiv8 не меняли? Что если в терминале сделать 1200 bps?
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Сообщение kushman »

Да, действительно несовпадение скоростей. Только где собака порылась не могу понять, выставил UBRRL=0x33, и на скорости 1200 принимается то что нужно, тот байт что передаю, а clkdiv8 точно не трогал.

А его кстати в Atmega8 и нету)
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Что-то я не помню , чтобы в 8-ке был CKDIV8/ Плохая частота 12 - попробуй поиграть в коридоре 4Ah - 4Eh
Кстати 33 соответствует 14400
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Сообщение kushman »

ILYAUL писал(а):Что-то я не помню , чтобы в 8-ке был CKDIV8/ Плохая частота 12 - попробуй поиграть в коридоре 4Ah - 4Eh
Кстати 33 соответствует 14400
Да, в 8ке его действительно нет. Но вот что получается, почему я решил попробовать 0x33, видимо все таки контроллер работает от внутреннего генератора на 8 МГц, и действительно происходит деление на 8 (хотя фьюзы настроены на внешний, см. приложение).

То есть я настраиваю контроллер на 8 МГц, на скорость 9600, но передача идет успешно при скорости 1200. Не могу понять в чем дело.
Вложения
FUSE.jpg
(176.93 КБ) 664 скачивания
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Я не знаю что в СV означают галочки. Кто работал?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Ну да, нету там делителя, я с 8й никогда не работал, и все фьюзов наизусть не помню :dont_know:
Глянул даташит, раз rstdisbl стоит в 0, получается фьюзы инверсные и относительно нотации atmel cksel получается 1111, т.е. внешний кварц.
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение foton6 »

Приветствую всех читающих и прошу помоч в решении одного вопроса)
Передаю числа по UART (4МГц частота, 9600 скорость передачи, 1 стоп бит, 8 битные пакеты)
В протусе все работает отл. На железе приходят кракозябры, причем на разных кварцах краказябры одни и теже Оо

считаю по формуле UBBRx=(F/(16*9600))-1.
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

foton6, вариантов масса. Начиная от неправильной записи битовых операций, до глюков железа.
Формула из спецификации, для нормального режима. Проверьте установку формата передачи и режима двойной скорости. Если ничего не найдёте (по вашему :) ), то покажите кусок программы, где вы инициализируете USART.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение 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);
	}
}
Все перепроверил , косяков не обнаружил(
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

По поводу вот этого.

Код: Выделить всё

UCSRB|=(1<<TXEN);
UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
Ну, как бы по мягче выразиться... В общем, так не пишут. Особенно UCSRC... :shock: :kill:
Учите матчасть. Курите спецификацию - раздел посвящённый доступу к регистрам 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;
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение foton6 »

Даже если оставить по умалчанию UCSRC.(8 бит)
Все одно и тоже выходит*(
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Если предыдущие поправки не помогли, то с большой вероятностью это уже не программа виновата.
Схему можете показать? Как оно собрано у вас (фотку)?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение foton6 »

Схема проста до нельзя)
TxD RxD VCC GND резистор на ресете.
О и кварц
Ответить

Вернуться в «AVR»