Значится по порядку.
Буквально пару дней назад начал свое знакомство с программированием микроконтроллеров.
Много чего прочитал и попробовал (например, [banned]).
Но осталась куча черных дыр (или белых пятен).
Что мне нужно:
В общем-то квалифицированный хелп и В ДОСТУПНОЙ ДЛЯ НОВИЧКА ФОРМЕ. Только большая просьба, не пишите как обычно "ну поройся на форуме". Ведь у каждого из вас наверняка есть ссылки на какие-то доки и т.п., которыми вы сами пользуетесь, не поленитесь помочь.
Конкретнее:
(Только не говорите, что это уже было на форуме, знаю, что было, читал.)
Хочу поморгать лампочками для начала.
Имеются:
ATmega16 в DIP корпусе, кроватка к ней и макетка.
Из софта есть:
CodeVision AVR 1.24.6
ImageCraft ICCAVR Pro v6.31a
AB490 (Algorithm Builder)
AVR Studio 4b460
AtmanAvr5.3
Proteus_6.7sp3
vmlab312
WinAVR-20050214
Первое: что лучше взять из софта? IAR не предлагать.
ГЛАВНОЕ для программирования на Си!!!
Потому что для меня намного понятнее конструкции Си (типа for или while), нежели то же самое на ASM.
Далее, где взять возможно используемые функции?
Где-то я читал, что в какой-то из приведенных сред разработки есть, к примеру, стандартная функция delay_ms()??? Это правда?
Если нет, значит придется разбираться с таймерами, так?
К слову, открываю в CVAVR пример LED.prj.
Там есть такая ф-я:
interrupt [TIM1_OVF] void timer1_overflow(void)
{
}
Я понимаю - эта ф-я должна по идее вызываться по прерыванию переполнения таймера 1, так?
Но я не понимаю ее синтаксис. Т.е. стандартно для Си:
void timer1_overflow(void)
{
}
Слово interrupt в принципе понятно далее в [] скобках TIM1_OVF это как раз и есть выбор прерывания?
Если так, значит имя ф-и timer1_overflow можно писать вообще любое и это не важно?
Ладно дальше пример этот в CVAVR компилится нормально.
Создаю cof файл и т.д. и пытаюсь открыть его в AVR studio для тестирования.
Открывается, и даже компилится и даже дебаг включается и программа запускается и выполняет секцию main, кста, вот вся LED.prj:
/* Moving LED example
CodeVisionAVR C Compiler
© 2000-2002 HP InfoTech S.R.L.
www.hpinfotech.ro
Chip: AT90S8515
Memory Model: SMALL
Data Stack Size: 128 bytes
8 LEDs are connected between the PORTC
outputs and +5V using 1K current
limiting resistors
The LEDs anodes are connected to +5V
On the STK500 it's only necessary to
connect the PORTC and LEDS headers
together with a 10-wire cable
*/
// I/O register definitions for AT90S8515
#include <90s8515.h>
// quartz crystal frquency [Hz]
#define xtal 3686400
// moving LED frequency [Hz]
#define fmove 2
// the LED on PORTC output 0 will be on
unsigned char led_status=0xfe;
// TIMER1 overflow interrupt service routine
// occurs every 0.5 seconds
interrupt [TIM1_OVF] void timer1_overflow(void)
{
// preset again TIMER1
TCNT1=0x10000-(xtal/1024/fmove);
// move the LED
led_status<<=1;
led_status|=1;
if (led_status==0xff) led_status=0xfe;
// turn on the LED
PORTC=led_status;
}
void main(void)
{
// set the I/O ports
// all PORTC pins are outputs
DDRC=0xff;
// turn on the first LED
PORTC=led_status;
// init TIMER1
// TIMER1 is disconnected from pin OC1
// no PWM
TCCR1A=0;
// TIMER1 clock is xtal/1024
TCCR1B=5;
// preset TIMER1
TCNT1=0x10000-(xtal/1024/fmove);
// clear TIMER1 interrupts flags
TIFR=0;
// enable TIMER1 overflow interrupt
TIMSK=0x80;
// all other interrupt sources are disabled
GIMSK=0;
// global enable interrupts
#asm
sei
#endasm
// the rest is done by TIMER1 overflow interrupts
while (1);
}
Но, на сколько я понял (ставил брейкпоинты), все работает но секция timer1_overflow не выполняется ни разу!!! Почему? (Проще говоря не вызывается прерывание...)
Зачем мне все это надо, да просто.
Первое требование, это подобрать для себя какую-то среду разработки чтобы можно было писать на Си и где-то по простому отлаживать!!! WMLab в принципе тоже хорошо, но перебор... По мне так стандартного отображения портов и др. ножек и регистров МК в AVR studio вполне достаточно.
Значит комплект CVAVR + AVR studio подходит, но тогда почему не сработало то, что я описал выше?
Т.е. одно из требований к среде - 100% работа, т.к. я новичек и чтобы что-то попробовать, я должен быть уверен в том, что если есть какая-то ошибка, то это моя ошибка, а не ошибка программы...
Далее, допустим я разобрался со средой программирования.
Следующая проблема - электроника.
А именно, что такое конденсатор и резистор я понимаю и как их подключить по схеме тоже разберусь, но для этого НУЖНА РАБОЧАЯ СХЕМА!!!
Я планирую ATmega16 разместить на устройстве и сделать на нем же разъем для подключения программатора.
На первых парах хочу использовать "5 проводков". (Дальше может быть куплю программатор.)
Так вот, где взять схему, на которой четко (СО ВСЕМИ НОМИНАЛАМИ И ПРОЧ.) показано, как собрать все начиная от LPT разъема и заканчивая разъемом из 5 проводков - папа.
Второе, где взять схему, на которой четко (СО ВСЕМИ НОМИНАЛАМИ И ПРОЧ.) показано, как собрать все начиная от разъема 5 проводков - мама и заканчива собственно ATmega16, т.е. стандартную обвязку (простейшую), с кнопкой Reset и проч.
О, что вспомнил!!! Важно!!! На схему будет подаваться напряжение 7.2 вольта с аккумулятора Ni-Cd 700mAh.
Это обязательное условие. Т.е. на схему надо поместить еще и какой-то преобразователь 7.2 в 5, так?
Какой и куда?
Когда будут у меня эти две схемы, пойду докупать нужные детали.
Программатор (т.е. программную его часть) для этих 5 проводков хочу использовать с сайта http://avr.nikolaew.org/, это правильно или есть другие решения?
Последняя необходимая мне схема - схема подключения 8 светодиодов к МК. Но тут вроде проблем нет, я все-таки понял, что они подключаются к ногам порта и к + питания через резистор 1кОм. Так?
Кнопку как подключить? Прочто через нее (кнопку) соединить одну из ног порта с + питания? Или с минусом?
Когда все это у меня будет, смогу сделать первые шаги.
А именно, написать программу, которая будет переключать лампочки, а по нажатию кнопки менять программу переключения.
Подключить "программатор", залить прошивку в МК, отключить "программатор", откинуться на спинку стула и наслаждаться мигалкой!
Пока вроде все, хотя конечно много пятен по теории...
Я понимаю, что такое регистры, как туда что-то записывать. Но к примеру не понимаю таких вещей, как использовать таймер, чтобы создать вункцию delay() (думаю, понятно зачем, по прерываниям не охота). Или как его же использовать, чтобы запустить ШИМ (нужен будет для изменения скорости двигателей, подключенных через дрйвер к МК).
Кстати, читал с gaw.ru аппнот про ШИМ - ничего не понял... Там все так пространно...
Не понимаю, как использовать АЦП.
Если честно я привык примерно к таким хелпам:
function_bla_bla_bla(a,b:int):int;
Сравнивает a и b и возвращает максимальное.
Вот такие хелпы я понимаю хорошо, когда написано, что нужно ввести, чтобы получить желаемый результат...
Эх, и так я много написал, но это все потому, что привык вопросы выяснять в процессе общения, а общаться тут не с кем, единомышленников нет, по кр. мере пока что...
Пытался выйти на канал #ru_embedded, но там никого нету...
Остается одна надежда на вас... Нервы уже сдают, от того, что ничего не могу понять...