roboforum.ru

Технический форум по робототехнике.
Текущее время: 21 май 2025, 18:20

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Глюки во время прерывания
СообщениеДобавлено: 14 авг 2011, 15:59 
Не в сети
Аватара пользователя

Зарегистрирован: 14 авг 2011, 15:42
Сообщения: 18
Здравствуйте, товарищи программисты. Я написал код, который прекрасно работает в цикле и выводит цифры 010 на индикатор, но когда я вставил его в главное прерывание, то он начал выводить всего лишь 0, причем расположенный слева, в то время как начинается "рисование" справа. Отчего это происходит, и как это вылечить?

Заранее благодарен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 14 авг 2011, 17:47 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
посмотреть внимательно в код, перепроверить фьюзы и если нужно переписать код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 14 авг 2011, 18:25 
Не в сети
Аватара пользователя

Зарегистрирован: 16 май 2009, 12:50
Сообщения: 1530
Откуда: Россия
прог. языки: Java, C
После словосочетания "главное прерывание" у меня аж слезы потекли :D
Код покажите чтоли.

_________________
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 14 авг 2011, 19:28 
Не в сети
Аватара пользователя

Зарегистрирован: 09 май 2011, 16:43
Сообщения: 536
Откуда: Украина, Киев
прог. языки: Нецензурный
ФИО: Евгений НеОН
Топикстартеру: тута форум роботостроителей, а не телепатов. Тут тока Дядя Мур телепат, но он щас занят, видимо. Потому придётся код-таки рассекретить.
Я бы предложил перевесить на неглавное прерывание, но не знаю как..Я вообще прерывания так и не осилил пока(((. Жду комплектуху для экспериментов.

_________________
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили “Титаник“
2:5020/2140.1979@fidonet


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 15 авг 2011, 00:13 
Не в сети

Зарегистрирован: 08 апр 2011, 19:14
Сообщения: 3
Откуда: Санкт-Петербург
Skype: k580ik80
прог. языки: C/C++, assembler
ФИО: Кирилл Дмитриев
Если индикация динамическая на 7-сегментный дисплей, то можно предположить что при вызове прерывания правая и центральная цифра загораются на очень короткое время, а левая продолжает гореть до следующего вызова. Исправить это можно если в прерывании выводить по одной цифре.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 15 авг 2011, 16:45 
Не в сети
Аватара пользователя

Зарегистрирован: 14 авг 2011, 15:42
Сообщения: 18
Извините, что сразу не выложил код. Просто я использовал API. Пришлось его "разбиблиотечить". Вот нынешний код:
Код:
// стандартные библиотеки
#include <mega8.h>
#include <delay.h>
#include <stdbool.h>

// обозначение портов индикатора
#define IND_PORT_A PORTD.2
#define IND_PORT_B PORTD.3
#define IND_PORT_C PORTD.4
#define IND_PORT_D PORTD.5
#define IND_PORT_E PORTD.6
#define IND_PORT_F PORTD.7
#define IND_PORT_G PORTC.1
#define IND_PORT_DP PORTC.2
#define IND_PORT_1 PORTC.3
#define IND_PORT_2 PORTC.4
#define IND_PORT_3 PORTC.5

int current = 1;
bool inited = false;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {

if (!inited) return;

if (current == 1) {
   
    IND_PORT_3 = 0;
    IND_PORT_A = 0;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 0;
    IND_PORT_E = 0;
    IND_PORT_F = 0;
    IND_PORT_G = 1;
    IND_PORT_1 = 1;
    IND_PORT_1 = 0;
   
} else if (current == 2) {

    IND_PORT_1 = 0;
    IND_PORT_A = 1;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 1;
    IND_PORT_E = 1;
    IND_PORT_F = 1;
    IND_PORT_G = 1;
    IND_PORT_2 = 1;
   
} else if (current == 3) {

    IND_PORT_2 = 0;   
    IND_PORT_A = 0;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 0;
    IND_PORT_E = 0;
    IND_PORT_F = 0;
    IND_PORT_G = 1;
    IND_PORT_3 = 1;
   
}

}

void main() {

    #include "init_mc.c"

    IND_PORT_1 = 0;
    IND_PORT_2 = 0;
    IND_PORT_3 = 0;

    while (1) {
   
       
   
    }
   
    inited = true;

}


Цифры даже не горят. Архив с проектом прикреплен.


Вложения:
Копия interrupts.rar [77.23 КиБ]
Скачиваний: 0
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 15 авг 2011, 17:05 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
Инициализация таймера и прерывания где-то спрятана?
inited никогда не станет true, потому что мейн в цикле висит?
current, очевидно, где-то в прерывании должен меняться?
ну и вообще :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 15 авг 2011, 17:47 
Не в сети

Зарегистрирован: 08 апр 2011, 19:14
Сообщения: 3
Откуда: Санкт-Петербург
Skype: k580ik80
прог. языки: C/C++, assembler
ФИО: Кирилл Дмитриев
IND_PORT_1 = 1;
IND_PORT_1 = 0;

индикатор включается и сразу гаснет =)

инициализация в файле init_mc.c ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 15 авг 2011, 19:30 
Не в сети
Аватара пользователя

Зарегистрирован: 14 авг 2011, 15:42
Сообщения: 18
Ну до чего глупая была ошибка! Строчку
Код:
inited = true

поместил после главного цикла! Но почему-то не хочет работать первый индикатор
Да, инициализация в файле init_mc.c:
Код:
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2 State1 State0
PORTB=0x07;
DDRB=0x00;

// Port C initialization
// Func6=In Func5ut Func4ut Func3ut Func2ut Func1ut Func0=In
// State6=T State5=1 State4=1 State3=1 State2 State1 State0=T
PORTC=0x38;
DDRC=0x3E;

// Port D initialization
// Func7ut Func6ut Func5ut Func4ut Func3ut Func2ut Func1=In Func0=In
// State7 State6 State5 State4 State3 State2 State1=T State0=T
PORTD=0x00;
DDRD=0xFC;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
TCCR0=0x05;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")

Вот код сейчас:
Код:
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {

if (!inited) return;

if (current == 1) {
   
    IND_PORT_3 = 0;
    IND_PORT_A = 0;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 0;
    IND_PORT_E = 0;
    IND_PORT_F = 0;
    IND_PORT_G = 1;
    IND_PORT_1 = 1;
    IND_PORT_1 = 0;
    //delay_ms (100);
    current = 2;
   
} else if (current == 2) {

    IND_PORT_1 = 0;
    IND_PORT_A = 1;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 1;
    IND_PORT_E = 1;
    IND_PORT_F = 1;
    IND_PORT_G = 1;
    IND_PORT_2 = 1;
    //delay_ms (100);
    current = 3;
   
} else if (current == 3) {

    IND_PORT_2 = 0;
    IND_PORT_A = 0;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 0;
    IND_PORT_E = 0;
    IND_PORT_F = 0;
    IND_PORT_G = 1;
    IND_PORT_3 = 1;
    //delay_ms (100);
    current = 1;
   
}

}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 15 авг 2011, 19:56 
Не в сети

Зарегистрирован: 08 апр 2011, 19:14
Сообщения: 3
Откуда: Санкт-Петербург
Skype: k580ik80
прог. языки: C/C++, assembler
ФИО: Кирилл Дмитриев
>Но почему-то не хочет работать первый индикатор

Потому что IND_PORT_1 в первой ветке сначала устанавливается в 1, потом сразу сбрасывается в 0 =)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 16 авг 2011, 07:53 
Не в сети
Аватара пользователя

Зарегистрирован: 14 авг 2011, 15:42
Сообщения: 18
*FACEPALM* Во дела...

Большое спасибо всем, кто помогал, проблема решена!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюки во время прерывания
СообщениеДобавлено: 28 сен 2011, 15:42 
Не в сети

Зарегистрирован: 28 сен 2011, 13:54
Сообщения: 4
Откуда: Украина
Skype: rea.in.ua
прог. языки: C, C++
Хоть трабл и решен, вставлю свои пять копеек:
лично я стараюсь никогда не вставлять в обработчик прерываний собственно код - в обработчике взвожу глобальную перменную-флаг и быстренько из обработчика вываливаюсь. А потом в мэйн смотрю за флагом и делаю то или иное. Многих глюков удается избежать.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO