|
Мигание диода, Возникли непонятки с алгоритмом работы программы Atmega128 |
|
|
|
Feb 23 2007, 12:09
|
Группа: Новичок
Сообщений: 6
Регистрация: 23-02-07
Пользователь №: 25 610

|
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); } }
|
|
|
|
|
Feb 23 2007, 14:35
|
Участник

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292

|
Цитата(N_A @ Feb 23 2007, 12:09)  Не могу ни как заставить диод мигнуть два раза с интервалом в 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.
Сообщение отредактировал IgorKossak - Feb 28 2007, 18:26
|
|
|
|
|
Feb 23 2007, 14:37
|
Частый гость
 
Группа: Свой
Сообщений: 140
Регистрация: 7-04-05
Из: Россия, Владимир
Пользователь №: 3 941

|
Цитата В общем. Определите на какой частоте у вас завелся чип, а потом делайте мигания. Проще всего наверное будет вычислить частоту по осциллограммам и делать соответствующие выводы. Да, и потом, проверить настройки фузов CKSEL, по умолчанию вроде как работает от внутренней рс-цепочки.
|
|
|
|
|
Feb 23 2007, 15:23
|
Участник

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292

|
для определения частоты тактовой удобно вывести на ножку ШИМ (пример - [BANNED]) и измерить его частоту мальтиметром или еще как.
|
|
|
|
|
Feb 23 2007, 15:37
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(N_A @ Feb 23 2007, 09:09)  HELP ME?! Есть Atmega 128 и программатор (без внешнего резонатора). Среда разработки CVAVR. Не могу ни как заставить диод мигнуть два раза с интервалом в 2сек. Перебрал уже кучу решений, все-равно толку 0. Есть два варианта кода, которые должны ЯВНО работать корректно, но нет. По-моему, в первом варианте у вас логическая ошибка, устанавливаете PA7 на вывод, выставляете в него 0, а потом ждёте, когда этот пин станет 1. Но он же никогда не станет 1. Будете ждать до посинения(:-). Второй вариант должен работать, зависит от PA6 и PA7. Что это? Дайте определения.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Feb 24 2007, 00:32
|
Участник

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292

|
ИМХО сторожевик выключен по дефолту.
|
|
|
|
|
Feb 28 2007, 10:30
|
Участник

Группа: Новичок
Сообщений: 30
Регистрация: 28-11-06
Из: Набережные Челны
Пользователь №: 22 856

|
Цитата(N_A @ Feb 23 2007, 12:09)  ... if(PINA.2 == 0) ... } У вас наверно на pina.2 кнопка висит? Тогда после ее нажатия во время опроса ножки может быть хоть 0 хоть 1. Надо учитывать дребезг.
--------------------
начинающий программист
|
|
|
|
|
May 7 2007, 05:22
|

Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544

|
Цитата а в m128 его даже нет Здрасьте! Если посмотрите Fuses для Меги128 из Студии AVRISPом или JTAGICE - он второй сверху.
|
|
|
|
|
May 7 2007, 11:21
|

Частый гость
 
Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618

|
Цитата(defunct @ May 6 2007, 04:30)  в некоторых мегах есть специальный фуз - WDTON (Watchdog Timer Always On), но он выключен по дефолту, а в m128 его даже нет. Так что WDT по-умолчанию выключен. WDTON в Atmega128 есть, только по умалчанию он выключен. А насчет программы, то там надо смотреть опрос кнопок. В файле видны Fuse Bites для 128.
Эскизы прикрепленных изображений
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|