Гость химик Опубликовано 4 Июня, 2013 в 10:21 Жалоба Поделиться Опубликовано 4 Июня, 2013 в 10:21 Добрый день. Возникла такая проблема. Есть иходники написанные в AVRstudio, я их подправил как мне нужно. Но вот скомпилировать неполучаеться, не соображу как, да и правил .с файл, а как открыть сам проект невкурсе. Обычно пользуюсь CVAVR. Пожалуйста помогите скомпилировать файл, и если нетяжело проверьте на ошибку исправленное. Исправлял только функцию keyPressed(void) и добавил таймер TC1 по переполнению. HIDKeys.2006_02_07.zip Это исходный файл, схема клавиатуры. Key.rar Это исходник с поправленным файлом main. Схемы находяться в архивах. В первом, просто клавиатура на Atmega8. Во втором эта клавиатура рас в секунду по кругу эмулирует нажатие 5 клавиш. Заранее спасибо. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 5 Июня, 2013 в 14:08 Жалоба Поделиться Опубликовано 5 Июня, 2013 в 14:08 После долгих мучений я выяснил, что исходники писались не в AVRstudio а в GCC. Попытался скомпилировать, но он начал ругаться на все мои изменения, начиная с обработчика прерываний. Помогите пожалуйста :smile: Ссылка на комментарий Поделиться на другие сайты Поделиться
brat_vl Опубликовано 5 Июня, 2013 в 14:22 Жалоба Поделиться Опубликовано 5 Июня, 2013 в 14:22 (изменено) а как ругается? Что пишет? Изменено 5 Июня, 2013 в 14:23 пользователем brat_vl Ссылка на комментарий Поделиться на другие сайты Поделиться
teamoon Опубликовано 5 Июня, 2013 в 16:14 Жалоба Поделиться Опубликовано 5 Июня, 2013 в 16:14 (изменено) ошибка номер раз: в операторе сравнения делаете присваивание вместо сравнения (это конечно не нарушение, но в данном случае, по моему, должно быть именно сравнение), и нужны дополнительные скобочки для оператора 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: Добавлено после раздумий: Соответствие кода поставленной задаче не проверял. Только синтаксис... Изменено 5 Июня, 2013 в 16:12 пользователем teamoon Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 6 Июня, 2013 в 06:26 Жалоба Поделиться Опубликовано 6 Июня, 2013 в 06:26 Давайте разберем по порядку. Функцию keyPresed пока опустим, будем считать, что она постоянно возвращает 0. 1.Компилятор начинает ругаться с объявления глобальной переменной count, может быть я ее неправильно объявляю? 2.Обработчик прерываний оформлен как в winavr, как он должен писаться в gcc? 3.Помогите правильно записать тело обработчика прерываний, чтобы по заданному числу до переполнения (оно равно 0,5 секунды) происходил декремент переменной count и происходила инверсия на выводе PORTB.0 Пока нужно решить только ето. Ссылка на комментарий Поделиться на другие сайты Поделиться
teamoon Опубликовано 6 Июня, 2013 в 08:50 Жалоба Поделиться Опубликовано 6 Июня, 2013 в 08:50 (изменено) Давайте разберем по порядку. Функцию 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? Сейчас там инкремент (увеличение) Изменено 6 Июня, 2013 в 09:01 пользователем teamoon Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 6 Июня, 2013 в 13:28 Жалоба Поделиться Опубликовано 6 Июня, 2013 в 13:28 Вот так выглядит мой AVRstudio, что нажать ля компиляции, несоображжу. Инверсию бита исправил на знак хор. Присвоение вместо сравнения тоже исправил, невнимательность моя. Если нетяжело, скомпилируй файл и выложи здесь. Вот исправленный исходник:key2.rar Ссылка на комментарий Поделиться на другие сайты Поделиться
teamoon Опубликовано 6 Июня, 2013 в 15:51 Жалоба Поделиться Опубликовано 6 Июня, 2013 в 15:51 не из AVRStudio, а из WinAVR Посмотрите, есть у Вас нечто подобное: c:\WinAVR-20100110\ Далее, на мойвзгляд у вас осталась ошибка в операторе If, а именно - все условие должно стоять в скобках. т.е. If (a) || (:smile: не правильно. должно быть If ((a) || (:smile:), где a и b - некоторые логические выражения. Ниже выложу скриншот из WinAVR и результирующий хекс Добавлено после раздумий: Вот скрины и хекс. Скомпилирован исходник из первого поста с учетом ранее оговоренных изменений. main.rar Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 6 Июня, 2013 в 16:32 Жалоба Поделиться Опубликовано 6 Июня, 2013 в 16:32 Опля... Большое спасибо за разъяснение, значит оказалось что AVRstudio и WINavr это разные продукты, а тот gcc который у меня ругался вабще оказался для с++. Теперь все стало на свои места. Завтра скачаю компилятор и надеюсь дальше уже сам разберусь. Ссылка на комментарий Поделиться на другие сайты Поделиться
teamoon Опубликовано 6 Июня, 2013 в 16:52 Жалоба Поделиться Опубликовано 6 Июня, 2013 в 16:52 Угу. Но меня смущает тот факт, что я не помню чтобы ставил WinAVR :smile: Есть подозрение, что он ставится вместе с каким-то продуктом... не то AVRStudio 6.0 не то с кодвиженом... Добавлено после раздумий: а нет... нашел у себя инсталятор... значит все таки ставил :smile: Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 7 Июня, 2013 в 15:51 Жалоба Поделиться Опубликовано 7 Июня, 2013 в 15:51 Инсталировал winavr, скомпилировал и все практически сразу заработало (забыл активировать таймер TIFR). Функцию со сравнениями пришлось переделать в таблицу, так как 7 кнопка должна эмулироваться каждые 45 секунд. Еще раз спасибо за помощ Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 11 Июня, 2013 в 04:44 Жалоба Поделиться Опубликовано 11 Июня, 2013 в 04:44 В эмуляцию понаобилось ввести кнопку 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. А вот где храняться сами скан коды? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти