Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
27.01.2012, 18:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от CodeNameHawk
|
Переименуйте index на например i.
Не забудьте включить #include ‹avr/interrupt.h›
(Пишет, что index встроенная функция)
|
Добавлю два слова.
Не брезгуйте ключевым словом volatile для тех переменных, которые модифицируются в теле обработчика. Компилятор может повести себя весьма непредсказуемо по отношению к незащищенным от оптимизации переменным.
Код:
|
unsigned int tick = 0; //счетчик тиков таймера
unsigned int cod[9];
volatile unsigned char idx = 0; // Зачем здесь 16-бит переменная? У вас 16-бит МК?
// External Interrupt 0 service routine
ISR(INT0_vect)
{
.....................
.......................
if ( idx != 9 ) cod[idx++] = tick;
........................
......................
} |
Во внешней петле следите за достижением idx значения 9. По достижении и выполнении необходимых вам действий не забудьте обнулить idx.
Где-то так. Но не обязательно. Можно по всякому..
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
27.01.2012, 18:27
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Вот сейчас попробовал вот такую прогу для понятия механизма заполнения массива:
#include ‹avr/io.h›
#include ‹stdint.h›
#include ‹util/delay.h›
#include ‹avr/interrupt.h›
#define F_CPU 1000000ul
volatile unsigned int tick = 0;
unsigned int cod[9];
volatile unsigned int idx = 0;
volatile char end_cond;
int main(void)
{
// External Interrupt(s) initialization
// INT: On
// INT Mode: Falling Edge
MCUCR=0x02;
GIMSK=0x40;
PCMSK=0x00;
EIFR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
end_cond=0;
sei();
while(end_cond==0)
{
}
}
// External Interrupt 0 service routine
ISR(INT0_vect)
{
if ( idx != 9 ) cod[idx++] = tick;
tick=tick+2;
}
Заработала зараза! Спасибо откликнувшимся! А переменную idx сделал int потому, как вычитал, что массив должен состоять из переменных того же типа, что и массив, но может по ходу дальнейшего развития программы и размера получаемых значений заменю на char.
|
|
|
|
27.01.2012, 18:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от roma9112
|
что массив должен состоять из переменных того же типа, что и массив
|
Эк завернуто...
Тип объявленного масива УКАЗЫВАЕТ на типы элементов этого массива. Но никак не "ДОЛЖЕН состоять"...
char array[]
говорит о том, что вы объявили динамический массив, состоящий из переменных типа char.
Переменная, выполняющая роль индексатора массива может быть ЛЮБОЙ. По вкусу. Но вы должны помнить, что компилятор не проверяет на фазе сборки выход индексатора за границы размерности массива. Это целиком забота программиста. Нарушение границ приведет к затиранию друих областей памяти, где может располагаться что угодно.
Выбор типа переменной для индексатора базируется на определении РАЗМЕРА будущего массива. Хотя бы ориентировочно. А посему бессмысленно для массива из девяти значений (ваш пример) применять переменную, способную проиндексировать размерность в 65536 байтовых значений.
PS Рекомендовано перед повторением чужих фрагментов и введения в них своих модификаций обратиться к основоположникам языка. K&R - наше все!
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
27.01.2012, 20:50
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Может я неправильно растолковал эту фразу:
Массив – это последовательно хранимый набор нескольких
«пронумерованных» переменных одинакового типа, называемых
элементами массива.
Для определения массива используется следующий шаблон:
‹тип› ‹идентификатор›[‹размер›];
Здесь тип – как и ранее, любой из определенных типов, обо-
значающий тип каждого элемента массива, идентификатор – это
собственно имя переменной-массива, а размер (который может и
отсутствовать) – это константа, ограничивающая количество эле-
ментов массива.
Тогда извиняюсь, читал в материале из вложения, а указатель да, для 10 и char за глаза, эт я маханул
|
|
|
|
27.01.2012, 23:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от roma9112
|
набор нескольких
«пронумерованных» переменных одинакового типа
|
Кто и где их "нумеровал"? Ряд последовательно расположенных в памяти ячеек. Как и зачем их "нумеровать", каким методом к ним обращаться - это уже на усмотрение программиста. С методами адресации уже к классикам Си не отсылаю - это к способам адресации данного МК. Для понимания. Потому что в Си все это более упрощенно. Пишем имя массива, индекс элемента, а уж как оно там компилятор это разрулит - скрыто за занавеской. А понимать-то надо... Еще раз напоследок. Перед началом программирования подучите основы.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
28.01.2012, 17:30
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 181
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от roma9112
|
Переименовал, и интеррупт подключил, ни черта, так эта ошибка и остается...
|
Я бы предположил, что это ошибка относится к чему то другому.
Такое иногда встречается если выше обнаруживаются неправильности кода.
Выложите вашу прогу.
А код, что я привел, компилируется без проблем.
(volatile необходимо применять, но к этому вопросу отношения не имеет)
proba.rar
|
|
|
|
28.01.2012, 22:16
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от CodeNameHawk
|
Я бы предположил, что это ошибка относится к чему то другому.
Такое иногда встречается если выше обнаруживаются неправильности кода.
Выложите вашу прогу.
А код, что я привел, компилируется без проблем.
(volatile необходимо применять, но к этому вопросу отношения не имеет)
Вложение 31016
|
Первый раз, но с такой необходимой функцией, как захват входящих данных, столкнулся. Именно с Вами согласен, что ошибка кроется не в именовании констант, где-то в смысле проги не то, писал вместо idx - index тож идет. Полный текст завтра попробую дописать, сами понимаете, для начинающего не так просто и быстро. Те ошибки, которые пишет мне студия явно с именами не связаны. По ходу где-то механизм заполнения массива я ошибочно делаю не правильно. А вообще хочется на Си попробовать сделать захват данных с АЦП, например, и нарисовать красивый(в моем случае не очень) график...
|
|
|
|
04.02.2012, 21:20
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Получилось-таки у меня делить частоту тактового генератора в Тини2313, калибровать генератор, но вот потребление в ждущем режиме все равно желает быть лучшим, т.к. питание от батареек. Почитал про спящие режимы - заинтересовал PowerDown, при этом как я понял пробуждение возможно по низкому уровню на INT0. Вот часть кода:
// External Interrupt(s) initialization
MCUCR=0x00;
GIMSK=0x40;
PCMSK=0x00;
while(1)
{
cli();
if(start==0)
{
sleep_enable();
sei();
set_sleep_mode(SLEEP_MODE_PWR_DOWN );
}
while(start==1 && (PIND&(1‹‹PD2))!=0)
{
****здесь исполняемые блоки****
}
}
// External Interrupt 0 service routine
ISR(INT0_vect)
{
sleep_disable();
start=1;
GIMSK=0;
MCUCR=0;
}
Так вот когда запускаю симуляцию в AVRStudio спящий режим вроде как включается, устанавливается бит SE, затем биты SM0 и SM1, хотя в панели процессора слева так ничего и не останавливается. А когда имитирую нажатие кнопки, то эти установившиеся биты могут сброситься, а могут сброситься, а потом почти сразу опять установиться. Сколько на Си не искал примеров, пока не нашел. Никто с таким не сталкивался? Может подскажите где посмотреть примерчик или какой покажете? Пожалуйста!
|
|
|
|
05.02.2012, 03:35
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от roma9112
|
sleep_enable();
sei();
set_sleep_mode(SLEEP_MODE_PWR_DOWN );
|
Этого недостаточно.
Для входа в sleep нужно добавить:
sleep_cpu();
Это первое что бросается в глаза.
|
|
|
|
05.02.2012, 07:11
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от _Артём_
|
Этого недостаточно.
Для входа в sleep нужно добавить:
sleep_cpu();
Это первое что бросается в глаза.
|
Добавил после строки set_sleep_mode(SLEEP_MODE_PWR_DOWN ); команду
sleep_cpu(); и действительно, процессор засыпает, но такое ощущение, что и сама AVRStudio тоже вся засыпает. Пытаюсь в окошке портов нажать кнопку на PIND.2, там и вход INT0, а Студия даже не дает этого сделать, блин! Может Студия гребет, а может еще что-то не так...
Последний раз редактировалось roma9112; 05.02.2012 в 07:18.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:55.
|
|