ARV, Вы меня не поняли. Статью я прочёл и абсолютно с ней согласен, но вопрос иной, а именно:
Почему выполнение программы не доходит до момента опроса кнопок?
Я же просто выношу команды в отдельную функцию.
То есть если я просто пишу те же самые команды в main, где и есть опрос, то реакция есть.
(Что в 1 случае, что во 2 суть и алгоритм неизменен (если сейчас абстрагироваться от того, что вообще делают кнопки))
Да в том-то и дело, что абсолютно одинаковый код...
Добавлено after 1 minute 44 seconds:
Ни у одного меня такая шляпа, как я понял
[uquote="gis",url="/forum/viewtopic.php?p=3431667#p3431667"]Может кто-нибудь подсказать? Допустим мне надо перенести часть кода из обработчика внешнего прерывания в основной цикл. Допустим я делаю так.
#include <avr/io.h>
#include <avr/interrupt.h>
char n;
ISR (INT0_vect)
{
n=1;
PORTB|=0x01;//поднимаем первую ножку, чтобы убедиться, что прерывание произошло
}
int main(void)
{
DDRB=0xFF;
PORTB=0x00;
DDRD=0x00;
PORTD=0xFF;
EICRA |= (1<<ISC01)|(0<<ISC00);// прерывание по заднему фронту
EIMSK |= (1<<INT0);
asm ("sei");
while(1)
{
if (n)
{
PORTB|=0x02;//вторая из основного цикла
n=0;
}
}
}
В итоге прерывание происходит, а код внутри условия if не выполняется. Пробывал разные вариации, ничего не получатся.[/uquote]
да что все начинающие наступают на одни и те же грабли - это закономерно.
однако, чтобы вам можно было помочь, вам необходимо предоставить всю информацию о проблеме. то есть как минимум 2 варианта кода: который работает и который не работает. потому как я уже говорил - неправильные ваши "выносы" делают код неработоспособным. это 100%
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
попробовал собрать оба ваших кода. не считая варнинга компилятора на volatile void ti_ini(void), оба варианта отличаются ровно на 2 команды call и ret - для вызова функции, в остальном совпадают байт в байт. если описать функцию ti_ini, как положено static void ti_ini(void), то оба варианта дают 100% одинаковый код. оба варианта должны работать одинаково.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV, вот в том-то и дело, что должны. В общем, ситуация абсурднейшая, не думал, что вообще такое может быть. Никто не подскажет, может ли быть такая белиберда вследствие неисправности отладочной платы?
у вас две абсолютно одинаковые программы, одна работает, другая нет - при чем тут отладочная плата?
проблема вероятнее всего в том, что вы ДУМАЕТЕ, будто есть связь между "выносом" в функцию и неработоспособностью программы, а на самом деле этой связи нет. например, думаете, что прошиваете, а на самом деле нет. или что-то аналогичное - досадное недоразумение.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
AVR, сейчас в ходе манипуляций программа стала идентично работать, если к вынесенной функции приписать модификатор static.
Но я не могу понять почему именно от него такой целебный эффект, ведь судя по его описанию он вообще не должен играть такой роли.
Добавлено after 3 minutes 46 seconds:
Хотя на разных сайтах разное описание этого модификатора, на одном как раз было с подходящим для меня смыслом.
Спасибо за ответы и надеюсь, каким-нибудь новичкам поможет моя кучка текста.
при наличии static компилятор понимает, что данная функция никому больше не будет нужна, а в текущем файле она используется 1 раз, поэтому её код можно внедрить прямо в тело main - получается 100% тот же самый вариант, что и без функции вообще.
квалификатор volatile в определении функции - это явно лишнее, не ошибка, компилятор реагирует предупреждением, и игнорирует, получается обычный вызов функции, как если бы без static
в любом случае код получается одинаковый, и вести себя по-разному не может. проблема у вас в чем-то другом.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Большое спасибо за ответы!
А не подскажите - почему при нажатии кнопки, которая по плану должна изменять частоту мерцания светодиода, этого не происходит?
Кнопка 3 замедляет мигание и кнопка 4 ускоряет, вызывая функцию TIM16_Write, в которой происходит изменение предела сравнения чисел в СТС.
А манипуляции те взяты из пособия по микросхеме, где правильным способом записи данных в регистры считали таковой. Но я убрал все подобные команды - ничего не изменилось.
Sch=1000; //Предел регистра сравнения чисел в СТС
TCCR1B=0;
TCCR1A=0; //регистр управления таймером/счетчиком
TCNT1=0; //Регистр таймера/счетчика
OCR1A=Sch; //значение сравнения, до 16 бит
TIMSK=(1<<OCIE1A); //Разрешение прерывания по совпадению для канала
TCCR1B=(1<<CS12) | //установка делителя (=64, стр. 145)
(1<<WGM12); //бит режима работы таймера - по совпадению