Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 27.01.2012, 18:00  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию 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
ut1wpr вне форума  
Непрочитано 27.01.2012, 18:27  
roma9112
Гражданин KAZUS.RU
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию 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.
roma9112 вне форума  
Непрочитано 27.01.2012, 18:56  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от roma9112 Посмотреть сообщение
что массив должен состоять из переменных того же типа, что и массив
Эк завернуто...
Тип объявленного масива УКАЗЫВАЕТ на типы элементов этого массива. Но никак не "ДОЛЖЕН состоять"...
char array[]
говорит о том, что вы объявили динамический массив, состоящий из переменных типа char.
Переменная, выполняющая роль индексатора массива может быть ЛЮБОЙ. По вкусу. Но вы должны помнить, что компилятор не проверяет на фазе сборки выход индексатора за границы размерности массива. Это целиком забота программиста. Нарушение границ приведет к затиранию друих областей памяти, где может располагаться что угодно.
Выбор типа переменной для индексатора базируется на определении РАЗМЕРА будущего массива. Хотя бы ориентировочно. А посему бессмысленно для массива из девяти значений (ваш пример) применять переменную, способную проиндексировать размерность в 65536 байтовых значений.
PS Рекомендовано перед повторением чужих фрагментов и введения в них своих модификаций обратиться к основоположникам языка. K&R - наше все!
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 27.01.2012, 20:50  
roma9112
Гражданин KAZUS.RU
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Может я неправильно растолковал эту фразу:
Массив – это последовательно хранимый набор нескольких
«пронумерованных» переменных одинакового типа, называемых
элементами массива.
Для определения массива используется следующий шаблон:
‹тип› ‹идентификатор›[‹размер›];
Здесь тип – как и ранее, любой из определенных типов, обо-
значающий тип каждого элемента массива, идентификатор – это
собственно имя переменной-массива, а размер (который может и
отсутствовать) – это константа, ограничивающая количество эле-
ментов массива.
Тогда извиняюсь, читал в материале из вложения, а указатель да, для 10 и char за глаза, эт я маханул
Вложения:
Тип файла: pdf AVR_01-2010.pdf (314.9 Кб, 630 просмотров)
roma9112 вне форума  
Непрочитано 27.01.2012, 23:54  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от roma9112 Посмотреть сообщение
набор нескольких
«пронумерованных» переменных одинакового типа
Кто и где их "нумеровал"? Ряд последовательно расположенных в памяти ячеек. Как и зачем их "нумеровать", каким методом к ним обращаться - это уже на усмотрение программиста. С методами адресации уже к классикам Си не отсылаю - это к способам адресации данного МК. Для понимания. Потому что в Си все это более упрощенно. Пишем имя массива, индекс элемента, а уж как оно там компилятор это разрулит - скрыто за занавеской. А понимать-то надо... Еще раз напоследок. Перед началом программирования подучите основы.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 28.01.2012, 17:30  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 181
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от roma9112 Посмотреть сообщение
Переименовал, и интеррупт подключил, ни черта, так эта ошибка и остается...
Я бы предположил, что это ошибка относится к чему то другому.
Такое иногда встречается если выше обнаруживаются неправильности кода.
Выложите вашу прогу.

А код, что я привел, компилируется без проблем.
(volatile необходимо применять, но к этому вопросу отношения не имеет)
proba.rar
CodeNameHawk вне форума  
Непрочитано 28.01.2012, 22:16  
roma9112
Гражданин KAZUS.RU
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от CodeNameHawk Посмотреть сообщение
Я бы предположил, что это ошибка относится к чему то другому.
Такое иногда встречается если выше обнаруживаются неправильности кода.
Выложите вашу прогу.

А код, что я привел, компилируется без проблем.
(volatile необходимо применять, но к этому вопросу отношения не имеет)
Вложение 31016
Первый раз, но с такой необходимой функцией, как захват входящих данных, столкнулся. Именно с Вами согласен, что ошибка кроется не в именовании констант, где-то в смысле проги не то, писал вместо idx - index тож идет. Полный текст завтра попробую дописать, сами понимаете, для начинающего не так просто и быстро. Те ошибки, которые пишет мне студия явно с именами не связаны. По ходу где-то механизм заполнения массива я ошибочно делаю не правильно. А вообще хочется на Си попробовать сделать захват данных с АЦП, например, и нарисовать красивый(в моем случае не очень) график...
roma9112 вне форума  
Непрочитано 04.02.2012, 21:20  
roma9112
Гражданин KAZUS.RU
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию 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, хотя в панели процессора слева так ничего и не останавливается. А когда имитирую нажатие кнопки, то эти установившиеся биты могут сброситься, а могут сброситься, а потом почти сразу опять установиться. Сколько на Си не искал примеров, пока не нашел. Никто с таким не сталкивался? Может подскажите где посмотреть примерчик или какой покажете? Пожалуйста!
roma9112 вне форума  
Непрочитано 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  
roma9112
Гражданин KAZUS.RU
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от _Артём_ Посмотреть сообщение
Этого недостаточно.
Для входа в sleep нужно добавить:
sleep_cpu();
Это первое что бросается в глаза.
Добавил после строки set_sleep_mode(SLEEP_MODE_PWR_DOWN ); команду
sleep_cpu(); и действительно, процессор засыпает, но такое ощущение, что и сама AVRStudio тоже вся засыпает. Пытаюсь в окошке портов нажать кнопку на PIND.2, там и вход INT0, а Студия даже не дает этого сделать, блин! Может Студия гребет, а может еще что-то не так...

Последний раз редактировалось roma9112; 05.02.2012 в 07:18.
roma9112 вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите начинающему (PIC16F84A). Slava-martyn Микроконтроллеры, АЦП, память и т.д 11 09.09.2010 21:55
помогите начинающему по WinAVR umkamaks Микроконтроллеры, АЦП, память и т.д 4 05.05.2010 21:01
Помогите начинающему! kolira Микроконтроллеры, АЦП, память и т.д 6 30.01.2010 15:22
Помогите советом начинающему eler Делимся опытом 64 11.09.2008 17:28
Помогите начинающему!!!! sma-etu Микроконтроллеры, АЦП, память и т.д 2 13.12.2006 18:31


Часовой пояс GMT +4, время: 19:55.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot