реклама на сайте
подробности

 
 
> проблемы с AVR, глюк AVR или ?
impuls-v
сообщение May 8 2006, 07:03
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



Кто может помогите с одной проблемой.
Написал небольшую программу, и сталкнулся с такой проблемой нужно по прерыванию от внешего входа 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"
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Laksus
сообщение May 10 2006, 21:24
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



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-цепочку,
она также и уменьшить влияние дребезга.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016