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

Помогите скомпилировать исходник


Рекомендуемые сообщения

Добрый день. Возникла такая проблема. Есть иходники написанные в AVRstudio, я их подправил как мне нужно. Но вот скомпилировать неполучаеться, не соображу как, да и правил .с файл, а как открыть сам проект невкурсе. Обычно пользуюсь CVAVR. Пожалуйста помогите скомпилировать файл, и если нетяжело проверьте на ошибку исправленное. Исправлял только функцию keyPressed(void) и добавил таймер TC1 по переполнению.

 

HIDKeys.2006_02_07.zip

Это исходный файл, схема клавиатуры.

 

Key.rar

Это исходник с поправленным файлом main.

 

Схемы находяться в архивах. В первом, просто клавиатура на Atmega8. Во втором эта клавиатура рас в секунду по кругу эмулирует нажатие 5 клавиш.

 

Заранее спасибо.

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

После долгих мучений я выяснил, что исходники писались не в AVRstudio а в GCC. Попытался скомпилировать, но он начал ругаться на все мои изменения, начиная с обработчика прерываний. Помогите пожалуйста :smile:

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

ошибка номер раз: в операторе сравнения делаете присваивание вместо сравнения (это конечно не нарушение, но в данном случае, по моему, должно быть именно сравнение), и нужны дополнительные скобочки для оператора IF

в итоге должно быть так:

if((count == 1) || (count == 2)) return 1;
 if((count == 3) || (count == 4)) return 2;
 if((count == 5) || (count == 6)) return 3;
 if((count == 7) || (count == 8)) return 4;
 if((count == 9) || (count == 10)) return 5;
 if((count == 11) || (count == 12)){

 

Добавлено после раздумий:

Ошибка номер два: в прерывании.

PORTB.0= ~PORTB.0; - вот это не катит.

 

Тут вроде нельзя работать с отдельными битами портов. Ну то есть тут надо использовать битовую логику и операторы сдвига.

 

Если мне не изменяет память то это будет выглядеть вот так

PORTB ^=  1;

 

ЗЫЖ то что было написано ранее на счет инвертирования бита - это я попутал :smile:

 

Добавлено после раздумий:

Соответствие кода поставленной задаче не проверял.

Только синтаксис...

Изменено пользователем teamoon
Ссылка на комментарий
Поделиться на другие сайты

Давайте разберем по порядку. Функцию keyPresed пока опустим, будем считать, что она постоянно возвращает 0.

1.Компилятор начинает ругаться с объявления глобальной переменной count, может быть я ее неправильно объявляю?

2.Обработчик прерываний оформлен как в winavr, как он должен писаться в gcc?

3.Помогите правильно записать тело обработчика прерываний, чтобы по заданному числу до переполнения (оно равно 0,5 секунды) происходил декремент переменной count и происходила инверсия на выводе PORTB.0

 

Пока нужно решить только ето.

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

Давайте разберем по порядку. Функцию keyPresed пока опустим, будем считать, что она постоянно возвращает 0.

1.Компилятор начинает ругаться с объявления глобальной переменной count, может быть я ее неправильно объявляю?

2.Обработчик прерываний оформлен как в winavr, как он должен писаться в gcc?

3.Помогите правильно записать тело обработчика прерываний, чтобы по заданному числу до переполнения (оно равно 0,5 секунды) происходил декремент переменной count и происходила инверсия на выводе PORTB.0

 

Пока нужно решить только ето.

 

Я тоже для компиляции вашего кода использовал winavr. Он помоему ставится вместе со студией... а может я сам когда-то поставил... не суть.

Значит как обстоит дело:

1. открываете блокнот программиста :smile: из пакета winAVR.

2. В самой проге открываете Ваш main.c

3. в меню Tools выбираете Make All и смотрите результат компилирования. Правильно?

 

Собственно как идет обращение к самому GCC - в комплекте винавра уже есть компилятор GCC, а запуск компиляции происходит через скрипт makefiles, в котором задаются опции компилятора и прочее прочее прочее.

Теперь давайте по Вашим вопросам:

1. у меня ничего не ругается на count, но ругается на строку в теле прерывания, а именно на то место где Вы инвертируете бит.

2. у вас все нормально написано.

3. Инвертирование бита я Вам написал в сообщении выше. Замените Вашу строчку моей и попробуйте откомпилировать.

 

Кстати, Вам нужен инкремент или декремент переменной count? Сейчас там инкремент (увеличение)

Изменено пользователем teamoon
Ссылка на комментарий
Поделиться на другие сайты

post-2789-1370524825_thumb.jpg

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

 

Инверсию бита исправил на знак хор. Присвоение вместо сравнения тоже исправил, невнимательность моя.

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

Вот исправленный исходник:key2.rar

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

не из AVRStudio, а из WinAVR

Посмотрите, есть у Вас нечто подобное: c:\WinAVR-20100110\

Далее, на мойвзгляд у вас осталась ошибка в операторе If, а именно - все условие должно стоять в скобках.

т.е. If (a) || (:smile: не правильно. должно быть If ((a) || (:smile:), где a и b - некоторые логические выражения.

 

Ниже выложу скриншот из WinAVR и результирующий хекс

 

 

Добавлено после раздумий:

Вот скрины и хекс.

Скомпилирован исходник из первого поста с учетом ранее оговоренных изменений.

post-8840-1370533669_thumb.jpg

post-8840-1370533681_thumb.jpg

post-8840-1370533690_thumb.jpg

post-8840-1370533699_thumb.jpg

main.rar

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

Опля... Большое спасибо за разъяснение, значит оказалось что AVRstudio и WINavr это разные продукты, а тот gcc который у меня ругался вабще оказался для с++.

Теперь все стало на свои места. Завтра скачаю компилятор и надеюсь дальше уже сам разберусь.

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

Угу. Но меня смущает тот факт, что я не помню чтобы ставил WinAVR :smile:

Есть подозрение, что он ставится вместе с каким-то продуктом... не то AVRStudio 6.0 не то с кодвиженом...

 

Добавлено после раздумий:

а нет... нашел у себя инсталятор... значит все таки ставил :smile:

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

Инсталировал winavr, скомпилировал и все практически сразу заработало (забыл активировать таймер TIFR). Функцию со сравнениями пришлось переделать в таблицу, так как 7 кнопка должна эмулироваться каждые 45 секунд.

Еще раз спасибо за помощ

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

В эмуляцию понаобилось ввести кнопку TAB, но в исходниках есть только кнопки A - Z, F1 - F12, 0 - 9. И там не скан коды, а просто перечисление

#define KEY_A       4
#define KEY_B       5
#define KEY_C       6
#define KEY_D       7
#define KEY_E       8
#define KEY_F       9
#define KEY_G       10
#define KEY_H       11
#define KEY_I       12
#define KEY_J       13
#define KEY_K       14
#define KEY_L       15
#define KEY_M       16
#define KEY_N       17
#define KEY_O       18
#define KEY_P       19
#define KEY_Q       20
#define KEY_R       21
#define KEY_S       22
#define KEY_T       23
#define KEY_U       24
#define KEY_V       25
#define KEY_W       26
#define KEY_X       27
#define KEY_Y       28
#define KEY_Z       29
#define KEY_1       30
#define KEY_2       31
#define KEY_3       32
#define KEY_4       33
#define KEY_5       34
#define KEY_6       35
#define KEY_7       36
#define KEY_8       37
#define KEY_9       38
#define KEY_0       39

#define KEY_F1      58
#define KEY_F2      59
#define KEY_F3      60
#define KEY_F4      61
#define KEY_F5      62
#define KEY_F6      63
#define KEY_F7      64
#define KEY_F8      65
#define KEY_F9      66
#define KEY_F10     67
#define KEY_F11     68
#define KEY_F12     69

Подозреваю, что кнопка TAB может быть числом от 39 до 57. А вот где храняться сами скан коды?

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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...