|
Внешние переменные при обработке прерываний, Помогите найти косяк |
|
|
|
Mar 31 2011, 11:10
|
Группа: Новичок
Сообщений: 5
Регистрация: 31-03-11
Пользователь №: 64 024

|
Я только начинаю программировать AVR , поэтому сильео не пинайте. МК ATMega 16. К 5-му биту регистра А подключена кнопка. В ненажатом состоянии на ножку подается высокий уровень. Для отсеживания нажатий на кнопку я хочу использовать флаг, который устанавливается в обработчике прерываний от таймера и сбрасывается в основном цикле программы после выполнения нужных мне действий. Вся проблема в том, что будучи сброшенным один раз этот флаг уже в 1 не устанавливается. Точнее говоря устанавливается, но только в теле функции обработки прерывания, а в ф-ию main передается ноль. Где косяк? Уже всю голову сломал.
Собственно программа
#include <avr/io.h> #include <string.h> #include <stdio.h> #include <util/delay.h> #include <stdlib.h> #include <avr/interrupt.h>
unsigned char temp; extern int key_pressed=0; extern int i_Regim=0;
extern void Timer_init (void) { // инициализация таймера опроса кнопок
TCCR1A = 0x00; TCCR1B = (0 << CS12)|(1 << CS11)|(0 << CS10)|(1 << WGM12); //предделитель clk/8, режим таймера СТС TCNT1=0x00; OCR1A=780*3; // выбор коэффициента деления TIMSK = (1 << OCIE1A); // разрешение прерывания по совпадению
temp = 0b00000000; // Присвоение начального значения
asm ("sei"); // Разрешение прерываний
}
ISR (TIMER1_COMPA_vect) { // обработка прерывания от таймера 1
// обработка нажатия кнопки "Режим" if (!bit_is_set(PINA,5)) temp++; //начало антидребезг else if (!(temp==0)) temp--; if (temp > 10) { temp=0; // конец антидребезга key_pressed=1; i_Regim++; // переходим к следующему режиму }
}
int main( void ){
PORTA = 0x00; // сброс порта А DDRA= 0x00; // все выводы порта - входы PORTD = 0x00; // сброс порта D DDRD= 0xFF; // все выводы порта D - выходы
i_Regim=0; // устанавливаем режим номер 0 - "работа"
Timer_init (); // инициализация таймера для работы с кнопками
key_pressed=1; // для первоначального отображения информации
while( 1 ){ // основной цикл
if (key_pressed) { PORTD=i_Regim; // ЭТА СТРОЧКА НЕ ВЫПОЛНЯЕТСЯ !!! key_pressed=0; } } // конец основного цикла
return 0; } // конец main
|
|
|
|
|
 |
Ответов
|
Mar 31 2011, 20:58
|
Группа: Новичок
Сообщений: 5
Регистрация: 31-03-11
Пользователь №: 64 024

|
Цитата(_Pasha @ Mar 31 2011, 22:19)  Все выполняется. протез7.7сп2 б.9089 На нехватку ресурсов не матюкаиццо  , т.е. все в самом что ни на есть реальном времени У меня идентичный Протеус. То есть Вы хотите сказать, что строчка "PORTD=i_Regim; " у Вас выполняется? Если да, то значит дело не в алгоритме, а в Протеусе и мне надо разбираться в настройках последнего.
|
|
|
|
|
Apr 1 2011, 04:12
|

Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 8-12-09
Пользователь №: 54 138

|
Цитата(Zloy_Paulik @ Mar 31 2011, 23:58)  У меня идентичный Протеус. То есть Вы хотите сказать, что строчка "PORTD=i_Regim; " у Вас выполняется? Если да, то значит дело не в алгоритме, а в Протеусе и мне надо разбираться в настройках последнего.  Прошу прощения, но подмыло... У меня создается впечатление, что Вы, уважаемые, не свой код отлаживаете, а тестируете Протеус  Вот Вы не знаете, в чем проблема - в Вашей программе или это глюки Протеуса. Вопрос: и зачем такой инструмент нужен? Лично я всегда отлаживаю в "железе" и никогда не пользовался симуляторами, типа Протеуса. Сперва я пользовался только самодельным программатором, стареньким осциллографом, и COM-портом. Если у чипа нет UART, но есть хоть одна свободная нога, использовал программный UART (а что делать?). Потом, когда поделки превратились в изделия, купил себе JTAGICE, хотя пользуюсь им в последнее время крайне редко, в основном с маленькими камешками - сильно выручает debugwire. Не буду говорить про мозг, как основную тулзовину при отладке
|
|
|
|
Сообщений в этой теме
Zloy_Paulik Внешние переменные при обработке прерываний Mar 31 2011, 11:10 rezident Квалификатор extern замените на volatile. Mar 31 2011, 11:17 Zloy_Paulik Цитата(rezident @ Mar 31 2011, 15:17) Ква... Mar 31 2011, 12:24  Marian Цитата(Zloy_Paulik @ Mar 31 2011, 14:24) ... Mar 31 2011, 13:51 Zloy_Paulik
Вот, выкладываю весь пример проекта. Но, как мне... Mar 31 2011, 18:22   Zloy_Paulik Цитата(nk@ @ Apr 1 2011, 07:12) Прошу пр... Apr 1 2011, 07:22    nk@ Цитата(Zloy_Paulik @ Apr 1 2011, 10:22) Н... Apr 2 2011, 11:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|