Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не запускается С-шная программа
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Azat
Hex файл который скомпилирован на ассемблере без проблем шьет микро-лер, а hex файл скомпилированный на С не хочет. При попытке стартовать пишет:
the contents of the HEX file does not fit in the selected device

Может в коде надо какой нибудь файл сделать include ?
tazik
Цитата(Azat @ Apr 30 2008, 22:31) *
Hex файл который скомпилирован на ассемблере без проблем шьет микро-лер, а hex файл скомпилированный на С не хочет. При попытке стартовать пишет:
the contents of the HEX file does not fit in the selected device

Может в коде надо какой нибудь файл сделать include ?


В опциях компилятора или в make-файле необходимо задать соответствующий тип контроллера.
У Вас какой компилятор?
Azat
Цитата(tazik @ Apr 30 2008, 18:40) *
В опциях компилятора или в make-файле необходимо задать соответствующий тип контроллера.
У Вас какой компилятор?


Компилятор WinAvr. А МК ATmega8515. А как задать эти опции не подскажите?!
tazik
Цитата(Azat @ Apr 30 2008, 22:45) *
Компилятор WinAvr. А МК ATmega8515. А как задать эти опции не подскажите?!


Утилита MFile меню Makefile->MCU type
Или ручками в самом make-файле - секция # MCU name

Прошу прощения, возможно, немного Вам наврал и программа просто "не влазит" в МК.
Но сначала, желательно, убедиться, что тип соответствует

Поправьте, если что не так...

А что за попытка "стартовать"? Что именно стартует?
Azat
Все исправил. Спасибо!:) Теперь возникла другая проблема, программа которую я написал не работает. Не работает даже банальная программа - перемигивание светодиодов. А шить надо во флеш или в eeprom? В eeprom шью ноль эмоций (два светодиода постоянно горят). Во флеш шью программа странно работает. В чем разница зашить во флеш и зашить в eeprom, можно ли одновременно в оба?
tazik
Цитата(Azat @ Apr 30 2008, 23:55) *
Все исправил. Спасибо!:) Теперь возникла другая проблема, программа которую я написал не работает. Не работает даже банальная программа - перемигивание светодиодов. А шить надо во флеш или в eeprom? В eeprom шью ноль эмоций (два светодиода постоянно горят). Во флеш шью программа странно работает. В чем разница зашить во флеш и зашить в eeprom, можно ли одновременно в оба?


Пожалуйста smile.gif

Flash - память программ. Т.е. шить нужно в нее
Eeprom - энергонезависимая память для пользовательских данных (для каких-нибудь Ваших калибровочных констант, переменных счетчиков и т.п.)
SRAM - энергозависимая память для пользовательских данных.

сразу в оба не надо ))

Приведите текст программы, плиз
Azat
Пробовал только во флеш, все равно не работает...
Ну вот например такая программка:

#include <avr/io.h>
#include <avr/delay.h>

int main(void)
{
DDRB = 0;
DDRD = 0xFF;
int i;
i = 0x1;
PORTD = i;
while(1)
{
i = i*2;
if (i>255) i=0x1;
PORTD = i;
_delay_loop_2(1000);
}
}

или из книжки к STK500:

;программка должна при нажатии на кнопку высветить соответствующий светодиод
.include "m16def.inc"
.def Temp =r16 ; Регистр хранения временных данных
.def Delay =r17 ; Переменная 1 для генерации задержки
.def Delay2 =r18 ; Переменная 2 для генерации задержки
;***** Инициализация
RESET:
ser temp
out DDRB, temp ; Настройка порта В (PORTB) на вывод
;**** Тестирование ввода/вывода
LOOP:
out PORTB,temp ; Обновление состояния светодиодов
sbis PIND,0x00 ; Если PortD.0 = 0,
inc temp ; то уменьшение на 1 двоичного кода, формируемого свечением светодиодов
sbis PIND,0x01 ; Если PortD.1 = 0,
dec Temp ; то увеличение на 1 двоичного кода, формируемого свечением светодиодов
sbis PIND,0x02 ; Если PortD.2 = 0,
ror Temp ; то циклический сдвиг состояния светодиодов на 1 вправо
sbis PIND,0x03 ; Если PortD.3 = 0,
rol Temp ; то циклический сдвиг состояния светодиодов на 1 влево
sbis PIND,0x04 ; Если PortD.4 = 0,
com Temp ; то инверсия состояния всех светодиодов
sbis PIND,0x05 ; Если PortD.5 = 0,
neg Temp ; то инверсия состояния и прибавление 1
sbis PIND,0x06 ; Если PortD.6 = 0,
swap Temp ; то обмен тетрадами светодиодов
;**** Далее необходима задержка, чтобы сделать проделанные изменения видимыми
DLY:
dec Delay
brne DLY
dec Delay2
brne DLY
rjmp LOOP ; Повторение цикла заново
tazik
Код
#include <avr/io.h>  
#include <avr/delay.h>    

int main(void)  {  
DDRB = 0;  
DDRD = 0xFF;  
int i;  
i = 0x1;  
PORTD = i;  
while(1)  {  
   i = i*2;  
   if (i>255) i=0x1;  
   PORTD = i;  
   _delay_loop_2(1000);  
   }  
}


Ну так а какая именно программа работает "не так"? В чем именно заключается эта "нетаковость"?

Проверьте, соответствует ли частота работы МК, указанная в make-файле, реальному кварцу.

Бегущий огонь? Ничего не перепутал? Все светодиоды светятся?
Azat
Не работают обе программы! После включения платы постоянно горят два правых светодиода. И все! А что частоты должны обязательно совпадать? Какую частоту нужно ставить?

Вы правильно заметили это бегущий огонь.. должен был быть smile.gif
tazik
Цитата(Azat @ May 1 2008, 00:50) *
Не работают обе программы! После включения платы постоянно горят два правых светодиода. И все! А что частоты должны обязательно совпадать? Какую частоту нужно ставить?

Вы правильно заметили это бегущий огонь.. должен был быть smile.gif


Частота, для которой компилируется программа (указанная в makefile) должна соответствовать частоте кварца, установленного на Вашей плате. Т.к. она используется, например, при "расчете" компилятором необходимого времени задержки.

В общем, есть подозрение, что 1-ая программа-то у Вас работает. Только слишком быстро - и на глаз этого не видно.

По поводу второй программы. У Вас применяется контроллер mega16?
fpmoleg
По умолчанию winAVR ставит частоту кварца 8 МГц (F_CPU = 8000000 - это в makefile-e).
Есть вариант что у тебя программа "виснет" - не инициализирован сторожевой таймер.

DDRB = 0;
DDRD = 0xFF;
int i;

Если пишешь на С то в начале инициализация переменных, а потом операции с ними.

Какой у тебя кварц стоит ?
mdmitry
Проверьте FUSE, правильно ли они стоят?
Azat
Цитата(fpmoleg @ Apr 30 2008, 21:51) *
По умолчанию winAVR ставит частоту кварца 8 МГц (F_CPU = 8000000 - это в makefile-e).
Есть вариант что у тебя программа "виснет" - не инициализирован сторожевой таймер.

DDRB = 0;
DDRD = 0xFF;
int i;

Если пишешь на С то в начале инициализация переменных, а потом операции с ними.

Какой у тебя кварц стоит ?


А как инициализировать сторожевой таймер? Я объявляю i а потом использую ее, что не так? Кварц вижу а частоту нет. Написано 737*8 звездочка это непонятный символ я не разобрал )

Цитата(mdmitry @ May 1 2008, 01:39) *
Проверьте FUSE, правильно ли они стоят?


Не подскажите как должно быть правильно
tazik
Цитата(Azat @ May 1 2008, 20:34) *
А как инициализировать сторожевой таймер? Я объявляю i а потом использую ее, что не так? Кварц вижу а частоту нет. Написано 737*8 звездочка это непонятный символ я не разобрал )
Не подскажите как должно быть правильно


Так а железо у Вас какое? STK500? Может быть не 737*8, а 32768?
Azat
Цитата(tazik @ May 1 2008, 16:51) *
Так а железо у Вас какое? STK500? Может быть не 737*8, а 32768?


Нет. Точно начинается с этих цифр. Но возможно то что я имел ввиду под кварцем вовсе не кварц. Просто других похожих нет
tazik
Цитата(Azat @ May 3 2008, 00:37) *
Нет. Точно начинается с этих цифр. Но возможно то что я имел ввиду под кварцем вовсе не кварц. Просто других похожих нет


Ну так а можно же по ногам контроллера посмотреть, к чему именно они подключены...
altlogic
Вообще можно использовать несколько источников тактовой частоты:
внутренний генератор,
внешний кварц малой/высокой частоты,
внешняя RC-цепочка,
внешний генератор.
Используемый источник тактовой частоты определяется комбинацией фьюзов CKSEL.
А если у вас STK500, то на сколько я знаю там используемый источник частоты определяется ещё положением джамперов.
И в стандартной поставке кварца для отлаживаемого устройства нет, а тот кварц, что с цифрами 7,37 МГц используется для тактирования микросхемы AT90S8535-8AC(можете посмотреть в авр-студии принципиальную схему STK-500).
И вернувшись к баранамsmile.gif выберете в утилите программированию определённый источник частоты(для начала подойдёт внутренний генератор - Internal) и частоту, а потом задайте её в проекте.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.