Форум myROBOT.ru » Шаг за шагом » Делаем роботов » Проблема с ATmega16-16

Страниц (2): [1] 2 »
 

1. kurt84 - 20 Июля, 2008 - 12:11:17 - перейти к сообщению
Здравствуйте!

Такая проблема: собрал схему из статьи "Простой робот на микроконтроллере (Часть 1). Управляем электромоторами.". Отличия только в том, что мк взял другой - ATmega16-16, и соответственно, кварц на 16MHz.

Залил на мк такую программу:
#include <avrio.h>
#include <avrinterrupt.h>
#include <avrsignal.h>
#include <utildelay.h>

#define F_CPU 16000000UL

void my_function(void)
{
PORTA |= _BV( PA3 );
PORTA |= _BV( PA2 );

_delay_ms( 1000 );

PORTA &= ~_BV(PA3);
PORTA &= ~_BV(PA2);

PORTA |= _BV( PA1 );
PORTA |= _BV( PA0 );

_delay_ms( 1000 );

PORTA &= ~_BV(PA1);
PORTA &= ~_BV(PA0);
}

int main(void) {
DDRA = 0xff;
PORTA = 0x00;

while( true )
{
my_function();
}
}

Все работает, за исключением одной проблемы: задержки _delay_ms( 1000 ), которые по идее должны давать задержку в 1 секунду - дают задержку в ~15-16 секунд. Я так подозреваю, что причиной может быть то, что контроллер работает не на той частоте ( около 1MHz ). От чего такое может быть? Что я делал неправильно?
2. VCOM - 21 Июля, 2008 - 11:58:41 - перейти к сообщению
А ты фузы та выставил чтоб он у тебя от внешнего карца работал? Чета мне подсказывает, что он у тя как с завода пришел с включенным внутренним РЦ генератором на 1 МГц. Так и шпарит Ж)))). Кури в сторону CKSEL0..CKSEL3.... Как там оно во всяких АврДудах ВинАврах выставляется, чесно гря не знаю....
3. kurt84 - 21 Июля, 2008 - 13:52:35 - перейти к сообщению
Да, судя по всему дело действительно именно во фьюзах. Хорошо было бы если кто-нибудь подсказал, как их выставить c помощью AVRDUDE на внешний кварц частотой 16MHz.
4. VCOM - 21 Июля, 2008 - 14:03:52 - перейти к сообщению
Ну вод чего нинаю, того нинаю. Ща тут народ который в АврДудах шарит, подскажет те Ж))))
5. digger - 21 Июля, 2008 - 20:53:40 - перейти к сообщению
Основные fuse-биты в AVR объединены в двух байтах: Fuse Low Byte и Fuse High Byte.

Содержание битов каждого из байтов (для ATmega16):

Fuse Low Byte

Bit 7 - BODLEVEL - Brown out detector trigger level

Bit 6 - BODEN - Brown out detector enable

Bit 5 - SUT1 - Select start-up time

Bit 4 - SUT0 - Select start-up time

Bit 3 - CKSEL3 - Select Clock source

Bit 2 - CKSEL2 - Select Clock source

Bit 1 - CKSEL1 - Select Clock source

Bit 0 - CKSEL0 - Select Clock source


Fuse High Byte

Bit 7 - OCDEN - Enable OCD

Bit 6 - JTAGEN - Enable JTAG

Bit 5 - SPIEN - Enable Serial Program and Data Downloading

Bit 4 - CKOPT - Oscillator options

Bit 3 - EESAVE - EEPROM memory is preserved through the Chip Erase

Bit 2 - BOOTSZ1 - Select Boot Size

Bit 1 - BOOTSZ0 Select Boot Size

Bit 0 - BOOTRST Select Reset Vector


Запрограммированный бит равен 0
Незапрограммированный - 1


Вам нужно приблизительно следующее: Fuse Calculator

для Low Byte
0xEF

для High Byte
0x89

AVRDUDE имеет замечательный интерфейс командной строки.

Программируют fuse-биты командами вида

CODE:
-U lfuse:w:xx -U hfuse:w:xx


где xx - двузначное шестнадцатиричное число, определяющее одно из 256 возможных состояний байта (именно эти числа мы и определили с помощью Fuse Calculator ).

Теперь нам понадобится командная строка, в которой мы напишем команду для AVRDUDE.

В Вашем случае она может выглядеть примерно вот так:

"C:\WinAVR\bin\avrdude.exe" -p m16 -c stk200 -P lpt1 -U hfuse:w:0x89:m -U lfuse:w:0xef:m


Не забудьте только указать правильный путь к avrdude.exe, который находится в папке с WinAVR в папке bin
6. kurt84 - 21 Июля, 2008 - 22:50:22 - перейти к сообщению
Спасибо!
Я так понимаю, что выставлять фьюзы можно отдельно от заливания программы в контроллер, и последующие заливки программ не сбросят эти настройки, так?
7. digger - 22 Июля, 2008 - 00:44:01 - перейти к сообщению
Да.

Для AVRDUDE существует удобная утилита avrdude-gui, предоставляющая графический интерфейс.

Эта утилита по не совсем понятным причинам была удалена из последних версий WinAVR.

Скачать ее можно здесь:
http://sourceforge.net/project/s...?group_id=125549

Файл avrdude-gui.exe лучше положить в папку bin в WinAVR.
8. kurt84 - 22 Июля, 2008 - 07:34:58 - перейти к сообщению
Спасибо. Буду пробовать Улыбка
9. JaRcom - 23 Июля, 2008 - 21:55:34 - перейти к сообщению
так и в PonyProg также есть возмо выставления, см. меню:
Command/Configuration and Security bits
10. ризюк - 24 Мая, 2009 - 21:50:21 - перейти к сообщению
digger пишет:
Основные fuse-биты в AVR объединены в двух байтах: Fuse Low Byte и Fuse High Byte.

Содержание битов каждого из байтов (для ATmega16):

Fuse Low Byte

Bit 7 - BODLEVEL - Brown out detector trigger level

Bit 6 - BODEN - Brown out detector enable

Bit 5 - SUT1 - Select start-up time

Bit 4 - SUT0 - Select start-up time

Bit 3 - CKSEL3 - Select Clock source

Bit 2 - CKSEL2 - Select Clock source

Bit 1 - CKSEL1 - Select Clock source

Bit 0 - CKSEL0 - Select Clock source


Fuse High Byte

Bit 7 - OCDEN - Enable OCD

Bit 6 - JTAGEN - Enable JTAG

Bit 5 - SPIEN - Enable Serial Program and Data Downloading

Bit 4 - CKOPT - Oscillator options

Bit 3 - EESAVE - EEPROM memory is preserved through the Chip Erase

Bit 2 - BOOTSZ1 - Select Boot Size

Bit 1 - BOOTSZ0 Select Boot Size

Bit 0 - BOOTRST Select Reset Vector



А что надо выбрать, если у меня кварц 8 МГц? (WinAvr)
(Добавление)
digger пишет:
Программируют fuse-биты командами вида


CODE:-U lfuse:w:xx -U hfuse:w:xx



Это в мейкфайле писать?
(Добавление)
ЗЫ есть avrdude-gui
11. digger - 24 Мая, 2009 - 22:19:02 - перейти к сообщению
Сначала смотреть здесь:
Fuse Calculator

а команду писать в командной строке.
12. ризюк - 24 Мая, 2009 - 23:21:59 - перейти к сообщению
Спасибо, а что тогда такое start up time ?
13. бот_м_16 - 25 Мая, 2009 - 01:01:43 - перейти к сообщению
Изучать документацию
14. ризюк - 25 Мая, 2009 - 03:51:56 - перейти к сообщению
бот_м_16 пишет:
Изучать документацию


А где её найти?
15. ОЛЕГ - 25 Мая, 2009 - 04:09:45 - перейти к сообщению
Форум => Полезное => Datasheets микроконтроллеров AVR в Atmel AVR Technical Library