Перейти к содержанию
    

Проблема с функцией delay

Всем привет.

 

У меня следующая проблема:

 

Контроллет ATmega128. Установки заводские.

CKSEL=0001 SUT=10

К ножке 7 порта B и шине питания подключен светодиод.

Конструкция питаеться от 3,3 В.

 

 

В CodeVision в опциях выставлен кристал 1.000 МГц

 

#include <mega128.h>

#include <delay.h>

 

void main(void){

PORTB=0x80;

DDRB=0x80;

 

PORTB.7=0;

delay_us(10000);

// delay_us(10000); //<-------------------- Вот проблема !!!!

// delay_us(10000);

// delay_us(10000);

PORTB.7=1;

}

 

При включени питания светодиод загораеться и гаснет. Вроде всё как должно быть. Затем я убираю коментарий со строки delay_us(10000); и задержка увеличиваеться в двое. Диод также при включении мигает, но заметно дольше. Если же я убираю коментарий с третьей строки, то диод при подаче питания зажигаеться и больше не гаснет. Т.е. контроллер зависает.

delay_ms(10); - задержка в милисикунды также вешает контроллер.

 

Пробовал на BascomAVR

 

$regfile = "m128def.dat"

$crystal = 1000000

$baud = 19200

$baud1 = 19200

$hwstack = 32

$swstack = 10

$framesize = 40

 

Ddrb = &HFF

Portb = 0

Waitus 10

Portb = 255

 

End

 

Работает до тех пор пока задержка меньше 15 микросекунд.

 

В чем проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А нет ли у Вас проблем с питанием и фильтрацией. Может быть, светодиод включается и сжирает питание. Пока конденсатор фильтра не разрядился - все работает. Программно так быть не может.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К ножке 7 порта B и шине питания подключен светодиод. Конструкция питается от 3,3 В

У вас светодиод подключен без балластного резистора?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так и должно быть, зажигаем --- пауза---- тушим---- и тутже зажигаем

 

может так попробовать

 

PORTB.7=0;

delay_us(10000);

// delay_us(10000); //<-------------------- Вот проблема !!!!

// delay_us(10000);

// delay_us(10000);

PORTB.7=1;

delay_us(10000);

// delay_us(10000); //<-------------------- Вот проблема !!!!

// delay_us(10000);

// delay_us(10000);

Изменено пользователем psw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо, кто откликнулся.

Проблема неожиданно снялась после снятия фьюза совместимости М103 и М128. (Хотя я понять почему не могу).

Эксперемены я провожу на плате AVR-SAVVY128.

1.Проблем с питанием нет. На плате есть регулятор.

2.Светодиод включен с баластным резистором.

3.ВатчДог выключен.

4.Перестановка функции delay_us не интересна, т.к. контроллер виснет, если задержки идут одна за одной или время задержки больше 20000 микросекунд.

 

Похоже этот глюк необьясним! Бывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема неожиданно снялась после снятия фьюза совместимости М103 и М128. (Хотя я понять почему не могу).

Потому что m103 и m128 это разные МК. Программа для m103 не будет работать на m128, также как и программа для m128 на m103 - разное распределение памяти.

 

при вызове функции используется стек, а значит - память. Т.е. у вас стек мог располагаться по адресам, где нет памяти физически. Отсюда и глюк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, несовсем так.

ATmega128 полностью совместим по расположению выводов с ATmega103 и может быть установлен на существующую плату для ATmega103.

Если запрограммировать конфигурационный бит M103C, то ATmega128 будет функционировать в режиме совместимости с ATmega103, настраивая ОЗУ, линии ввода-вывода и векторы прерываний как описано выше. Однако, некоторые новые функции ATmega128 в этом режиме станут недоступными. Данные функции перечислены ниже:

 

Т.е. при запрограмированном бите M103C (заводская учтановка) неиспользуемая память будет недоступна для стека.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. при запрограмированном бите M103C (заводская учтановка) неиспользуемая память будет недоступна для стека.

Cмотря как его CV распределяет.

Если стек расположен внизу, то он может пересечся с периферией.

 

настраивая ОЗУ, линии ввода-вывода и векторы прерываний.

Вы код в CV компилировали под m103 или под m128 с запрограммированным M103C?

Если под m128 то чему удивляться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...