Здравствуйте!
Такая проблема: собрал схему из статьи "Простой робот на микроконтроллере (Часть 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 ). От чего такое может быть? Что я делал неправильно?
1. kurt84 - 20 Июля, 2008 - 12:11:17 - перейти к сообщению
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-биты командами вида
где 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
Содержание битов каждого из байтов (для 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.
Для 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
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
Содержание битов каждого из байтов (для 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
CODE:-U lfuse:w:xx -U hfuse:w:xx
Это в мейкфайле писать?
(Добавление)
ЗЫ есть avrdude-gui
11. digger - 24 Мая, 2009 - 22:19:02 - перейти к сообщению
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