roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Re: МикроКонтроллер AVR начинающим - общие вопросы

ADonis » 02 окт 2010, 11:47

Да это проверено тоже, без прерывания работает все нормально, т.е. могу контролировать ногу, все работает, а как только делаю на прерывании, то вот такая ерунда. Плата тестовая тоже проверена не раз, но еще ни разу не работал с прерываниями в реальности, только виртуально :sorry:

Добавлено спустя 2 часа 25 минут 32 секунды:
Добился работы переделав на:
Код: Выделить всёРазвернуть
TIMSK=0x80;

и прерывание:
Код: Выделить всёРазвернуть
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
// Place your code here
        PORTD.0=~PORTD.0;
}


но есть одно но: прерывание генерируется с максмальной частотой 36-38 кГц. И никак я его не могу его увеличить при частоте ядра 1 МГц. неважно, OCR2=0x12 или 0x02, частота будет одинакова... почему?

Добавлено спустя 7 минут 5 секунд:
Изменил частоту кварца на 2МГц, соответственно увеличилась и частота получения прерывания. Выходит, есть некоторое "железное" ограничение, выше которого не прыгнешь?

Добавлено спустя 2 минуты 39 секунд:
Кстати, на картинке изображен не висящий провод, т.к. это горит ИК светодиод, а снимаю показания звуковухой через фотодиод. Светодиод не будет же гореть, если нога будет "висящей"

Re: МикроКонтроллер AVR начинающим - общие вопросы

Grem » 02 окт 2010, 18:08

если скомпилировать пустой int main(), в хексе будет последний код - 76?
нет пк под рукой, чтоб глянуть

Re: МикроКонтроллер AVR начинающим - общие вопросы

ADonis » 02 окт 2010, 21:39

скомпилировал вот это:
void main(void)
{
}

в cvavr, получилось аж 92 слова, в хексе аж 218 последний... если я правильно понял о чем речь :-X

Re: МикроКонтроллер AVR начинающим - общие вопросы

Para_bellum » 06 окт 2010, 20:55

Доброго вечера.
Есть вот такой код:
Код: Выделить всёРазвернуть
void search (void) {
    stop(); 
    for (servo = 400; servo < 1600; servo += 100) {
        if (PIND.3 == 0) {
            i = servo;
            break;
            servo = 970; //центр
        }
        delay_ms(100);
    }

    s = abs(1000-i);
    s = s*1.75;

    if (i < 1000) {
        turn_left();
    }

    else if (i > 1000) {
        turn_right();
    }
   
    else if (i == 0) {
        move_backward();
        search();
    }
    #asm ("sei");
}


Прерывание:
Код: Выделить всёРазвернуть
interrupt [EXT_INT1] void ext_int1_isr(void) {
    #asm ("cli");
    search();
}

Срабатывает по сигналу с Sharp'а, вроде всё нормально, вот только есть подозрение, что эта подпрограмма выполняется три раза подряд, причём i всегда больше 1000 и выполняется turn_right() (или turn_left, в зависимости от знака < или >). Может #asm ("cli"); не срабатывать? Да и уместно ли использование этой операции в прерывании?

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 06 окт 2010, 21:34

При выполнении прерывания они и так глобально запрещаются ! Механизм прерывания в AVR - http://proavr.narod.ru/03.htm

Я бы не советовал из прерывания вызвать функцию. Просто установите флаг ( переменная или бит ) - сделайте его "1" например - и в основном цикле проги вставьте условие
Код: Выделить всёРазвернуть
if( флаг ) { вызвать нужную функцию }

Re: МикроКонтроллер AVR начинающим - общие вопросы

Para_bellum » 06 окт 2010, 21:37

Поооооонял. Сейчас гляну. Благодарен.

Re: МикроКонтроллер AVR начинающим - общие вопросы

osc » 08 окт 2010, 09:01

ADonis, замените
Код: Выделить всёРазвернуть
PORTD.0=~PORTD.0; 
на
Код: Выделить всёРазвернуть
PORTD.0=~PIND.0; 

Re: МикроКонтроллер AVR начинающим - общие вопросы

Duhas » 08 окт 2010, 10:07

а зачем если не секрет ? )

Re: МикроКонтроллер AVR начинающим - общие вопросы

osc » 24 окт 2010, 16:56

Регистр PORT разве не Write only?

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 24 окт 2010, 17:09

нет.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Webspider » 02 ноя 2010, 01:10

Доброго времени суток! Возникла проблема с подключением ЖКИ 16х2 DV-16236.
Собрал в соотвествии с даташитом. просимулировал в ISIS.всё тип-топ. в контроллер зашил всего одну строчку с putsf.
при подаче питания загорается подсветка и почему-то только все точки верхней строки ЖКИ. на этом всё кончается.
Исключил, что проблема может быть в контроллере, подвесив поморгать светодиод.

В чём может быть проблема? Нужно ли изначально в визарде подтягивать к VCC порт на котором висит ЖКИ( читал где-то)?

Re: МикроКонтроллер AVR начинающим - общие вопросы

galex1981 » 02 ноя 2010, 10:55

А в Протеус работаетпрограмма? Можете выложить схему и программу?

Re: МикроКонтроллер AVR начинающим - общие вопросы

Webspider » 02 ноя 2010, 13:56

Выкладывать собственно и нечего. в конечном итоге просто сделал всё как в http://avr123.nm.ru/z5.htm с той лишь разницей что вешал дисплей на порт С :(

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 02 ноя 2010, 14:54

Всё просто :ROFL:

Re: МикроКонтроллер AVR начинающим - общие вопросы

Webspider » 02 ноя 2010, 15:47

В предыдущем посте имел ввиду, что даже сделав по задаче 5 курса - всё равно не заработало.


cron
Rambler\'s Top100 Mail.ru counter