Перейти к содержимому
Форум журнала практической электроники «Датагор»

Оригинал микро-ПК Raspberry Pi 3 Model B+ (Broadcom 1.4GHz quad-core 64 bit processor, Wifi, Bluetooth, USB)

Офигенная миниатюрная рация на литии BaoFeng UV-5R, 5W, 5-15 км! Охота, поход, торговый центр и т.п.

TrueRMS мультиметр UNI-T UT139A с автодиапазонами

Паяльнник 80W с терморегулятором и LCD-дисплеем, популярные жала серии 900M
Гость химик

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

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

Гость химик

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

 

HIDKeys.2006_02_07.zip

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

 

Key.rar

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

 

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

 

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

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


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

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

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


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

а как ругается? Что пишет?

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

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


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

ошибка номер раз: в операторе сравнения делаете присваивание вместо сравнения (это конечно не нарушение, но в данном случае, по моему, должно быть именно сравнение), и нужны дополнительные скобочки для оператора 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 пользователей

    Нет пользователей, просматривающих эту страницу

︽ Наверх страницы ︽
×
×
  • Создать...