Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Мигание диода
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
N_A
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
Если нет внешнего кристала, видать работает он у вас с частотой 1Mhz (заводские настройки).

Чтобы работали цацки типа delay_ms необходимо точно задать в настройках проекта частоту на которой работает чип. Иначе они работать не будут.

В общем. Определите на какой частоте у вас завелся чип, а потом делайте мигания.

по коду:
while(++pause < 1500);
while(--pause >0);
эти строчки могут быть выкинуты оптимизатором, чтобы этого не произошло необходимо
pause объявить как volatile.
kada
Для начала покажите Вашу схему подключения.
Abakt
Цитата(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.
Algol
Цитата
В общем. Определите на какой частоте у вас завелся чип, а потом делайте мигания.


Проще всего наверное будет вычислить частоту по осциллограммам и делать соответствующие выводы.
Да, и потом, проверить настройки фузов CKSEL, по умолчанию вроде как работает от внутренней рс-цепочки.
Abakt
для определения частоты тактовой удобно вывести на ножку ШИМ (пример - [BANNED]) и измерить его частоту мальтиметром или еще как.
=GM=
Цитата(N_A @ Feb 23 2007, 09:09) *
HELP ME?!
Есть Atmega 128 и программатор (без внешнего резонатора). Среда разработки CVAVR.
Не могу ни как заставить диод мигнуть два раза с интервалом в 2сек. Перебрал уже кучу решений, все-равно толку 0. Есть два варианта кода, которые должны ЯВНО работать корректно, но нет.

По-моему, в первом варианте у вас логическая ошибка, устанавливаете PA7 на вывод, выставляете в него 0, а потом ждёте, когда этот пин станет 1. Но он же никогда не станет 1. Будете ждать до посинения(:-).

Второй вариант должен работать, зависит от PA6 и PA7. Что это? Дайте определения.
Marian
У меня была похожая проблема.
Оказалось, что небыли запрещены прерывания сторожевого таймера и когда он срабатывал, программа запускалась с начала.
Abakt
ИМХО сторожевик выключен по дефолту.
Artur Nikitin
Цитата(N_A @ Feb 23 2007, 12:09) *
...
if(PINA.2 == 0)
...
}

У вас наверно на pina.2 кнопка висит? Тогда после ее нажатия во время опроса ножки может быть хоть 0 хоть 1. Надо учитывать дребезг.
bloodden
Цитата(Abakt @ Feb 24 2007, 03:32) *
ИМХО сторожевик выключен по дефолту.

А вот и нет. По-моему во всех мегах он включен, причём на 16мС.
defunct
Цитата(bloodden @ May 5 2007, 21:16) *
А вот и нет. По-моему во всех мегах он включен, причём на 16мС.

в некоторых мегах есть специальный фуз - WDTON (Watchdog Timer Always On), но он выключен по дефолту, а в m128 его даже нет. Так что WDT по-умолчанию выключен.
Igor26
Цитата
а в m128 его даже нет


Здрасьте!
Если посмотрите Fuses для Меги128 из Студии AVRISPом или JTAGICE - он второй сверху.
Marian
Цитата(defunct @ May 6 2007, 04:30) *
в некоторых мегах есть специальный фуз - WDTON (Watchdog Timer Always On), но он выключен по дефолту, а в m128 его даже нет. Так что WDT по-умолчанию выключен.


WDTON в Atmega128 есть, только по умалчанию он выключен.
А насчет программы, то там надо смотреть опрос кнопок.

В файле видны Fuse Bites для 128.
defunct
Цитата(Igor26 @ May 7 2007, 07:22) *
Здрасьте!
Если посмотрите Fuses для Меги128 из Студии AVRISPом или JTAGICE - он второй сверху.

пардон, проглядел.
GDI
А может надо посмотреть не включен ли бит М103С? по умолчанию он включен...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.