Перейти к содержанию

Делаю Прерывание


binarick

Рекомендуемые сообщения

Приветствую уважаемые

Подскажите затык у меня случился)

Атмега8 схема

e485a520d7eat.jpg

код в CVAVR 3.12

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
char lcd_buffer[33];  
//5 - left; 6 - right; 7 - clik
   if	  (PINB.7==1)
   {
   pushkey = 7;
   }
   else if (PINB.6==1)
   {   
   pushkey = 6;
   }
   else if (PINB.5==1)
   {   
   pushkey = 5;
   }
   else
   {   
   pushkey = 8;
   };
   lcd_gotoxy(0, 1);
   sprintf(lcd_buffer,"%u", pushkey);
   lcd_puts(lcd_buffer);
}

и почему-то всегда имею на выходе 8 те pushkey=8

где я туплю тыкните носом плиз

Спасибо за ваше время и ответы

и как-то нужно учитывать дребезг контактов или тут всё ок ?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

а так если попробовать?

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
char lcd_buffer[33];
//5 - left; 6 - right; 7 - clik
pushkey = 8;
if (PINB.7==1) pushkey = 7;
if (PINB.6==1) pushkey = 6;
if (PINB.5==1) pushkey = 5;

lcd_gotoxy(0, 1);
sprintf(lcd_buffer,"%u", pushkey);
lcd_puts(lcd_buffer);
}

не забудь флаг прерывания сбросить

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

для полной картины

DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
GICR|=(0<<INT1) | (1<<INT0);
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
GIFR=(0<<INTF1) | (1<<INTF0);

а так если попробовать?

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
char lcd_buffer[33];
//5 - left; 6 - right; 7 - clik
pushkey = 8;
if (PINB.7==1) pushkey = 7;
if (PINB.6==1) pushkey = 6;
if (PINB.5==1) pushkey = 5;

lcd_gotoxy(0, 1);
sprintf(lcd_buffer,"%u", pushkey);
lcd_puts(lcd_buffer);
}

не забудь флаг прерывания сбросить

И так тоже 8

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

ну значит чтото намудрил с конфигурацией порта возможно

напиши затычку, которая программно в цикле будет читать из порта без прерываний. Посмотри что она выдает. Посмотри на что срабатывает EXT_INT0 в даташите, на нолик, единичку или перепад. А то сравниваешь единицу, а прерывание при ноле. Да и вообще кнопки обычно ставят на землю, а подтягивают к 5 вольтам (это по феньшую)

Избався от дребезга перед проверкой состояний, а то к тому моменту как прерывание пролетит на порту будет вовсе не то что ты ждешь

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Если вставить всю процедуру в main() то всё ок отрабатывает.

я по дребезгу как раз хотел поинтересоваться то, что я подтянул R9-R11 достаточно или чтото нужно ещё сделать.

по примеру которому делаю там было написано:

'обработчик прерывания
Button:
'здесь мы в цикле сканируем все подключенные кнопки
Do
If Pinb.3 = 0 Then
 W = 1
End If
If Pinb.2 = 0 Then
 W = 2
End If
If Pinb.1 = 0 Then
 W = 3
End If
If Pinb.0 = 0 Then
 W = 4
End If
Pulseout Portd , 6 , 2500  'мигнем светодиодом
Loop Until W <> 0          'если дребезг помешал вычислению нажатой кнопки, повторяем
Waitms 10
Gifr = 64                  'сброс флага прерывания
Return

я не знаю такого языка меня смущает строка

Loop Until W <> 0

ну и это не понимаю для чего

Gifr = 64

Ссылка на комментарий
Поделиться на другие сайты

это не ко мне

я в CVAVR не силен

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

сброса я кстати так и не увидел

вот эта вот строчка вроде

Gifr = 64

хотя я хз почему 64, когда должно быть по идее 0x00. Но это по памяти, так что не факт

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

это не ко мне

я в CVAVR не силен

дык это не CVAVR а какойто BASCOM

да сброса нет.

не понимаю просто что за сброс и что он делает.

ща буду вникать

Ссылка на комментарий
Поделиться на другие сайты

ну флаг прерывания у тебя возник? возник. Сам он не упадет. А пока он не упадет, будут все время вызываться прерывания, даже если их нет. Флаг прерывания должен быть сброшен в теле обработчика прерывания вручную

видимо как раз в этом и проблема

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Подправил код

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
char lcd_buffer[33];
//5 - left; 6 - right; 7 - clik
pushkey = 8;
if (PINB.7==1) pushkey = 7;
if (PINB.6==1) pushkey = 6;
if (PINB.5==1) pushkey = 5;
lcd_gotoxy(0, 1);
sprintf(lcd_buffer,"%u", pushkey);
lcd_puts(lcd_buffer);
#asm("cli")
while(1)
{
}
}

Добавил запрет прерываний #asm("cli")

и цикл (слабо понимаю нафига он)

так вот при выполнении в протеусе также нефига не работает и получаю 8

кроме того из-за бесконечного цикла теперь подвисает проц

Всё я в тупике не пойму вроде простая штука а не крутится

Изменено пользователем binarick
Ссылка на комментарий
Поделиться на другие сайты

голова совсем не думай?

зачем в прерывании запрещать прерывание да еще и залеплять бесконечный цикл? Может стоит все таки немного почитать, прежде чем чтото писать?

cli запрещает прерывания глобально, а вам надо всего то снять флаг события (прерывания по внешнему триггеру)

я уже не помню, сбрасывается он в AVR автоматом или надо его вручную обнулять. Давно не трогал эту тему. В PIC надо вручную это делать.

возможно это поможет http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_23.htm

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...