4ubaika 0 23 февраля, 2007 Опубликовано 23 февраля, 2007 · Жалоба HELP ME?! Есть Atmega 128 и программатор (без внешнего резонатора). Среда разработки CVAVR. Не могу ни как заставить диод мигнуть два раза с интервалом в 2сек. Перебрал уже кучу решений, все-равно толку 0. Есть два варианта кода, которые должны ЯВНО работать корректно, но нет. Вариант 1. #include <mega128.h> #include <delay.h> void main(void) { PORTA=0x00; DDRA=0xF0; PORTA.2 = 1; PORTA.7 = 1; PORTA.6 = 1; while (1) { //PORTA.2 = 0; if(PINA.2 == 0) { PORTA.7 = 0; delay_ms(2000); if(PINA.7 == 1) { PORTA.6 = 0; delay_ms(2000); if(PINA.6 == 1) { PORTA.7 = 0; delay_ms(2000); } } } } } Вариант 2. #include <mega128.h> #include <io.h> #include <m8_128.h> void main(void) { unsigned int pause = 0; PORTA=0xFF; DDRA |= PA6; DDRA |= PA7; ACSR=0x80; SFIOR=0x00; while (1) { PORTA |= PA6; PORTA &=~PA7; while(++pause < 1500); PORTA &=~PA6; PORTA |= PA7; while(--pause >0); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 23 февраля, 2007 Опубликовано 23 февраля, 2007 · Жалоба Если нет внешнего кристала, видать работает он у вас с частотой 1Mhz (заводские настройки). Чтобы работали цацки типа delay_ms необходимо точно задать в настройках проекта частоту на которой работает чип. Иначе они работать не будут. В общем. Определите на какой частоте у вас завелся чип, а потом делайте мигания. по коду: while(++pause < 1500); while(--pause >0); эти строчки могут быть выкинуты оптимизатором, чтобы этого не произошло необходимо pause объявить как volatile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kada 0 23 февраля, 2007 Опубликовано 23 февраля, 2007 · Жалоба Для начала покажите Вашу схему подключения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Abakt 0 23 февраля, 2007 Опубликовано 23 февраля, 2007 (изменено) · Жалоба Не могу ни как заставить диод мигнуть два раза с интервалом в 2сек. Наверно кроме мигания у вас там еще что-то делается раз опрашиваются PIN. Начните с описания нужного алгоритма псевдокодом - т.е. просто русским языком. А потом запишите алгоритм на Си. например: 0. Бесконечный цикл 1. Ждать на PA2 появления "0" 2. При появлении на PA2 появления "0" включить светодиод на на PA3 (сделать "0" на PA3) и так далее ... // настройка МК while(1){ // бесконечный цикл программы while(PINA.2); // тут пока на PA2 есть "1" - т.е. ждем появления "0" на PA2 // тут будем при появлении "0" на PA2 // включить светодиод на на PA3 (сделать "0" на PA3) PORTA.3 = 0; /* далее напишите паузу - сколько будет гореть диод, выключите диод, опять паузу - не горит диод, включите второй раз диод, пауза, выключите диод */ while(! (PINA.2)); // если на PA2 до сих пор "0" подождем пока он исчезнет. } возможно код ошибочный, так как написан наскоро. Простейшее тех задание, алгоритм и мигание светодиодами на [bANNED] проверить работу программы удобно в симуляторе VMLAB. Изменено 28 февраля, 2007 пользователем IgorKossak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Algol 0 23 февраля, 2007 Опубликовано 23 февраля, 2007 · Жалоба В общем. Определите на какой частоте у вас завелся чип, а потом делайте мигания. Проще всего наверное будет вычислить частоту по осциллограммам и делать соответствующие выводы. Да, и потом, проверить настройки фузов CKSEL, по умолчанию вроде как работает от внутренней рс-цепочки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Abakt 0 23 февраля, 2007 Опубликовано 23 февраля, 2007 · Жалоба для определения частоты тактовой удобно вывести на ножку ШИМ (пример - [bANNED]) и измерить его частоту мальтиметром или еще как. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 23 февраля, 2007 Опубликовано 23 февраля, 2007 · Жалоба HELP ME?! Есть Atmega 128 и программатор (без внешнего резонатора). Среда разработки CVAVR. Не могу ни как заставить диод мигнуть два раза с интервалом в 2сек. Перебрал уже кучу решений, все-равно толку 0. Есть два варианта кода, которые должны ЯВНО работать корректно, но нет. По-моему, в первом варианте у вас логическая ошибка, устанавливаете PA7 на вывод, выставляете в него 0, а потом ждёте, когда этот пин станет 1. Но он же никогда не станет 1. Будете ждать до посинения(:-). Второй вариант должен работать, зависит от PA6 и PA7. Что это? Дайте определения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
codenamehawk 0 23 февраля, 2007 Опубликовано 23 февраля, 2007 · Жалоба У меня была похожая проблема. Оказалось, что небыли запрещены прерывания сторожевого таймера и когда он срабатывал, программа запускалась с начала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Abakt 0 24 февраля, 2007 Опубликовано 24 февраля, 2007 · Жалоба ИМХО сторожевик выключен по дефолту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cutter 0 28 февраля, 2007 Опубликовано 28 февраля, 2007 · Жалоба ... if(PINA.2 == 0) ... } У вас наверно на pina.2 кнопка висит? Тогда после ее нажатия во время опроса ножки может быть хоть 0 хоть 1. Надо учитывать дребезг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bloodden 0 5 мая, 2007 Опубликовано 5 мая, 2007 · Жалоба ИМХО сторожевик выключен по дефолту. А вот и нет. По-моему во всех мегах он включен, причём на 16мС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 6 мая, 2007 Опубликовано 6 мая, 2007 · Жалоба А вот и нет. По-моему во всех мегах он включен, причём на 16мС. в некоторых мегах есть специальный фуз - WDTON (Watchdog Timer Always On), но он выключен по дефолту, а в m128 его даже нет. Так что WDT по-умолчанию выключен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Igor26 0 7 мая, 2007 Опубликовано 7 мая, 2007 · Жалоба а в m128 его даже нет Здрасьте! Если посмотрите Fuses для Меги128 из Студии AVRISPом или JTAGICE - он второй сверху. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
codenamehawk 0 7 мая, 2007 Опубликовано 7 мая, 2007 · Жалоба в некоторых мегах есть специальный фуз - WDTON (Watchdog Timer Always On), но он выключен по дефолту, а в m128 его даже нет. Так что WDT по-умолчанию выключен. WDTON в Atmega128 есть, только по умалчанию он выключен. А насчет программы, то там надо смотреть опрос кнопок. В файле видны Fuse Bites для 128. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 7 мая, 2007 Опубликовано 7 мая, 2007 · Жалоба Здрасьте! Если посмотрите Fuses для Меги128 из Студии AVRISPом или JTAGICE - он второй сверху. пардон, проглядел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться