Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблемы с AVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
impuls-v
Кто может помогите с одной проблемой.
Написал небольшую программу, и сталкнулся с такой проблемой нужно по прерыванию от внешего входа INT1 отправить пакет по rs232 в комп. Однако вместо одного пакета программа зацикливается на прерывании INT1 и шлет заданный пакет постоянно. Хотя даже прерывание по входу и небыло.

Если кто может зашейте данную программу в контроллер и проверьте, может быть контроллер с глюком, потому что прерывание по внешнему входу использовал много раз и все было нормально.
Ниже приведена часть моей программы из нее удалено все лишнее.

Код
#include <mega8535.h>
// частота кристалла [Гц]
#define xtal 16000000
// глобальные переменные
unsigned char dd1, mm, tm, hh, date, transmit, F1;
                                              
void main(void)
{
DDRB=0x00; //порт B как вход
PORTB=0xff;
MCUCR|=0x3C; // прерывание INT1 по переднему фронту
// инициализация UART  
UBRRL=0x67; //скорость 9600 бит/с
UCSRB|=0x98;  //разреш прерыв по приему и прием и передачу.
UCSRC|=0x86; // 8-ми битовый кадр          
#asm("sei");  // разрешение глобальных прерываний (установка бита 07 SREG)
GIFR=0x00;
GICR=0x80;  //прерывание по внешнему входу INT0        
dd1=0xCF;
mm=0xD1;
tm=0xD2;
hh=0xD3;
while (1);      
}    

interrupt [EXT_INT1] void INT1(void)
{
UCSRB|=0x20;  //разреш прерыв по опустош UDR
transmit=-1;
  date=PINB;  //читаю данне с порта
  UDR=0xCC;     //  отпровляю синхрослово - начало пакета
}
    
interrupt [USART_DRE] void DRE(void)
{
transmit++;
if (transmit==0) UDR=dd1;
if (transmit==1) UDR=mm;
if (transmit==2) UDR=tm;
if (transmit==3) UDR=hh;
if (transmit==4) { UDR=date; // отпровляю байт данных
transmit=-1; // сбрасываю счетчик байт
UCSRB&=0xdf;} // запрещаю прерывание по опустошению UDR
}


Вот такой пакет должен получится :"CC CF D1 D2 D3 FC"
haker_fox
1. Я бы посоветовал разрешать глобальные прерывания (asm("sei")) лишь после того, как выполнены все настройки прерываний (от UART'а, INTx). В Вашем случае - перед циклом while(1).
2. Дальше, Вы разрешаете прерывания INT0

GICR=0x80; //прерывание по внешнему входу INT0

а обрабатываете от INT1

interrupt [EXT_INT1] void INT1(void).

Хотя это просто опечатка, потому что при записи 0x80 в GICR действительно разрешаются прерывания INT1.
3. Вы записываете в GIFR число 0, если я не ошибаюсь, при записи во "флаговые" регистры числа 0, соответствующие разряды регистра устанавливаются в 1, поэтому и возникает прерывание. Я бы посоветовал не обнулять этот регистр. Также не плохо было бы прогнать программу на симуляторе, чтобы понять в чем соль.
impuls-v
to haker_fox
та действительно просто опечатка
А в GIFR я добавил запись уже после того как случился глюк, так проверить.
impuls-v
Люди я конечно благодарен за подсказки, но всеже меня интересует другое.
У кого есть возможность прошейте в контроллер и посмотрите что выдает в комп.
Потомучто у меня сложилось впечатление что это или контроллер с глюком или это наводки НО ТАКИЕ БОЛЬШИЕ что срабатывает прерывание, что то маловероятно.
haker_fox
Цитата([banned] @ May 9 2006, 22:03) *
Цитата(haker_fox @ May 8 2006, 11:59) *

при записи во "флаговые" регистры числа 0, соответствующие разряды регистра устанавливаются в 1, поэтому и возникает прерывание.


вам и правда не стоит пользоваться визадом - а то еще ченить придумаете

только ДШ НО ВНИМАТЕЛЬНО !


Да, здесь я действительно ошибься. Даташита не было под рукой.

Цитата(impuls-v @ May 10 2006, 06:07) *
Люди я конечно благодарен за подсказки, но всеже меня интересует другое.
У кого есть возможность прошейте в контроллер и посмотрите что выдает в комп.
Потомучто у меня сложилось впечатление что это или контроллер с глюком или это наводки НО ТАКИЕ БОЛЬШИЕ что срабатывает прерывание, что то маловероятно.


Вы пробывали прогнать программу в AVRStudio, ну или в VMlab'е? Какие результаты?
Laksus
1- Макетки с 8535 сейчас у меня нет, как раз паяю.
2- Есть макетка с мега8, на ней и попробовал. Кварц тут 4МГц,
поэтому скорость УАРТ была 2400, чтобы не менять уставку.
Терминал использовал с http://bray.velenje.cx/avr/terminal/

У меня на макетке выводы прерывания
INT0 - подключен к регулируемому генератору меандра ~0.1...2сек
INT1 - висит в воздухе.

После зашивки Вашего кода в мега8 действительно понесся мусор.
После изменения прерывания на INT0 (где у меня генератор) выводит
данные без сбоев.
После того как включил подтягивающий резистор на INT1,
DDRD &= (1<<3); // PD3(INT1) INPUT
PORTD |=(1<<3); //PULUP
мусор перестал идти, но при замыкании/размыкании вывода INT1
перемычкой на ноль, шло очень много сбоев (дребезг контактов).

После того как в конце подпрограммы прерывания INT1 о
тключил прерывание
GICR &= ~(1<<7);//disable INT1
}
а после передачи последнего байта группы включил
прерывания и поставил очистку флага прерывания
(пока группа передается, насколько я понимаю,
нам прерывания INT1 не нужны)
if (transmit==4) {
UDR=date; // отпровляю байт данных
transmit=-1; // сбрасываю счетчик байт
UCSRB&=0xdf; // // запрещаю прерывание по опустошению UDR
GICR |= (1<<7);//enable INT1
GIFR = (1<<7);//reset INT1 flag
}
сбои прекратились.
________________
Александр
2006 05 10
PS По моему, для устранения наводок лучше не подтягивающий резистор,
а где-то 1...10кОм, а после еще добавить RC-цепочку,
она также и уменьшить влияние дребезга.
impuls-v
Laksus спасибо большое за проверку и совет.
Проблема была действительно в очень сильной наводке. После того как вчера вечером засунул схемку в экран мусор прекратился, ну и навсякий случай подключил подтягивающий резистор.
По поводу запрета прерываний они у меня тоже запрещены до того момента пока не передастся пакет.
По поводу дребезга думаю просто поставить одновибратор на АГ4, 5.
Так что проблему устранил сам но за помощь все равно большое спасибо.
Laksus
По поводу дребезга думаю просто поставить одновибратор на АГ4, 5.
___________________
Ну, по моему мнению, одновибратор на АГ4, 5 это очень избыточно.

Програмный запрет прерываний INT1 на время передачи блока +
наружный резистор +
RC-цепочка с правильно подобранной постоянной времени
сделают то же самое, но гораздо дешевле,
потребуют меньше места на плате,
без расширения ассортимента деталей.
_______________
Александр
2006 05 11
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.