Свежие обсуждения
Микроконтроллеры

Проблема с USART в ATmega8

1 4

Мне нужно чтоб один МК передавал состояние 8 кнопок и значение с двух АЦП(режим 8 бит) по одному проводу другому МК по УСАРТу.
Написал код для обеих МК, разрешил прерывания, но в PROTEUSе не вижу положительных результатов.
Прикрепил исходники(WinAVR) и HEX код для обеих МК и проэк в PROTEUS

102179.rar

 

Что-то не грузится Ваше прикрепление

 

// перед записью в UBRRH нужно выставить в ноль бит URSEL
void USART_Init(unsigned int baud) //Инициализация УСАРТ
{
UCSRC = 0;
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
UCSRB = (1<RXEN)|(1RXCIE); //разрешить приём и прерывание
// UCSRC = (1URSEL)|(1USBS)|(3UCSZ0); //8 байт, 2 стоп бита
// для восьми бит нужно выставить UCSZ0 и UCSZ1, хотя тройка увас наверное это и есть два бита....
// лучше сразу нормально писать, код от этого больше не станет
UCSRC = (1URSEL)|(1USBS)|(1UCSZ1)|(1UCSZ0); //8 байт, 2 стоп бита
}

// вот эта конструкция не очень хороша
// прерывание может случится раньше, да вообще лучше принять все байты в прерывании.
if(UCSRA & (1RXC)) //если УСАРТ принял данные
{
k = 0;
i[k] = UDR; //записать их в i[0], после этого должно случиться прерывание и УСАРТ получит остальные 2 байта
PORTC = i[0];
a = i[1];
b = i[2];
}

//при передаче опять та же проблема вы либо передавайте всё в прерывании, либо всё не в прерывании, либо ждите когда передача вся закончится
UDR = i[k]; //передать первый байт

P/S попробуйте IAR WorkBench, больше похоже на ANSI Cи, да вот таких штук не будет, так как все биты предопределены...
ADMUX |= 0x40 | 0x20; //АЦП 8 бит, внутрений ИОН - 5В, а будут вот эти img src="/smile/fun.gif" width="15" height="15" alt="" />
ADMUX = _Bit(ADLAR) | _Bit(REFS0); // АЦП выравнивание по левому краю, ИОН = напряжению питания,

 

Спасибо. С приёмником уже понятно как зделать всё на прерывании, а вот как в передатчике зделать всё в прерывании?
Ведь сначала нужно послать первый байт чтобы случилось прерывание
Объясните пожалуйста

 

Я вот подумал, не будет ли у меня проблем с распознаванием байтов...
Кстати на щёт "ADMUX |= 0x40 | 0x20;" - мне так удобнее потому, что я АЦП настраиваю по табличке с обучалки по МК. (прикрепил её)

 

Прикрепил обновлёные проги.
Протэус гурается на МК, посылающий байты...на этом же МК не пашет ЖКИ и не меняются лог уровни на TXD (ничего он не передаёт)
Убераю в его прошивке функцию глобального разрешения прерываний sei(); начинает работать ЖКИ и передаёт байты...
Но после этого подвисает другой МК хотя я его прошивку не трогал и Протэус кричит теперь на него.
Чтото у меня подозрения что Протэус подглюкивает!

Ещё вопрос. Как можно разорвать одину переменую 1 байт на 4 старших бита и на 4 младших и записать в разные переменые, а потом склеить это всё?
Идея такая, что первые 4 байта будет адресс пакета а остальные 4 - данные.

102327.rar

 

И все таки пока не поздно переходите на IAR, напишите мне на мыло anikha@@ms_tusur_ru.
Да и лучше конечно макетировать, "Протэус"и все прочие симуляторы лишние грабли на вашем и без того не легком пути освоения МК.

 

Извините, задаю вопрос. Я работаю на CodeVision. Ввиду того, что я уже 2 года работаю на нём и хотелось бы узнать, что будет дальше при работе с Codevision с какими "граблями" придётся столкнуться по вашему опыту по сравнению с IAR. Заранее большое спасибо!

 

Я хотел сказать что одно дело симулятор, другое дело реальное устройство...
Перепробовал разные среды разработки остановился на IAR WorkBench, на данный момент самый-самый.
До него только на асме писал под AVR Studio, пишу уже более 4 лет на си.
Попробуйте думаю вам понравится...

 

Ничего себе попробуйте. Это ж месяца 3 усиленного мозгового штурма на переход. А насчёт макетки совершенно с Вами согласен. Будете смеяться но с макеткой и по времени быстрее получается в итоге. Кстати разводка для макетки на ATMega128 есть в http://rapidshare.com/files/46540249/sl5.21.rar.html Макетка-отладочник универсальный лучше фирменных, т.к. фирменные либо под одну функцию заточены, либо по 10 разъёмов программирования на одну плату, да и вообще они у.ё. или в у.е.