|
Как проект в WinAVR переделать под CodeVision? |
|
|
|
Jul 4 2006, 15:34
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
В аттаче проект для WinAVR. Я же пишу в CodeVision. Как переделать - даже не знаю с чего начать. Если не трудно, гляньте одним глазком и подскажите хоть что нибудь.
Прикрепленные файлы
glcd.rar ( 45.07 килобайт )
Кол-во скачиваний: 99
|
|
|
|
|
Jul 5 2006, 03:25
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
А вот комплятор видит. Для начала я попытался включить некоторые хидеры: Код #include <io.h> #include <pgmspace.h> Выдается куча ошибок. Например для строки extern int strncasecmp_P(const char *, PGM_P, size_t) __ATTR_PURE__; комплятор пишет - declaration syntax error для строки extern int strncmp_P(const char *, PGM_P, size_t) __ATTR_PURE__; комплятор пишет function must be return a value подскажите тогда, что ли как библиотеку собрать в codevision...
|
|
|
|
|
Jul 6 2006, 09:03
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
Цитата PS Что-то я в архиве этого не нашел - в каком они файле? В файле glcd.h есть ссылка на io.h и pgmspace.h - стандарты WinAvr естественно их нет в архиве. А насчет родных функций для CV - будьте любезны, подскажите, вам из вашей памяти извлечь наверное проще. Если вам не трудно, попробуйте сами скомпилировать эту библиотеку. Нет, я не прошу Вас сделать работу для меня. Тем более, вы говорите что все так просто. Иначе это будет долгий разговор "корифея" с "чайником", причем первый будет настоятельно рекомендовать читать мануал и все прочее. Почему я это говорю? Да потому что я сделал, как вы сказали и вот что вышло: Код #define __AVR_ATmega16__; #define SIG_SPI; #include <mega16.h> #include <delay.h> #include <glcd_line.asm>
void main() { int i=0x01; int t=1; DDRD=0xFF;
while (1) { glcdLine(0, 0, 10, 10); } } Я подключил АСМ файл - не знаю правильно или нет, но через оболочку CodeVision подключаются исключительно ".c" файлы. После этого компилятор выдает мне, что для вызова функции glcdLine недостаточно параметров. ЧТо за бред, эта прога прекрасно компилируется в WinAVR. И САМОЕ ИНТЕРЕСНОЕ - компилятор пишет что у меня нет функции main ()
|
|
|
|
|
Jul 6 2006, 11:16
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
[quote] А насчет родных функций для CV - будьте любезны, подскажите, вам из вашей памяти извлечь наверное проще. [/quote] Никогда серьезно не работал с CV, так посмотрел что к чему. В основном живу с gcc и IAR. Так, что придеться таки читать документацию. io.h - описание битов портов pgmspace.h - описание функций работы с флэшом [ quote] И САМОЕ ИНТЕРЕСНОЕ - компилятор пишет что у меня нет функции main () [/quote] Значит проект сконфигурирован неправильно. Тут ничем не могу помочь, это фичи самого CV.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 6 2006, 12:58
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата В противовес утверждениям, что нет ничего специфичного для CV в этой библиотеке. Недосмотрел, включать надо заголовочник glcd.h - это объявление асмовских функций в С коде. Кстати совершенно стандартный прием. Оставьте пустой main, вставьте в проект асм файлы и собирайте. Ошбки можете запостить. Цитата В противовес утверждениям, что нет ничего специфичного для CV в этой библиотеке. Кстати есть еще один прием достаточно быстрой переделки Код void foo(void) { asm { ... } }
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 6 2006, 18:16
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
Код // macro to enter a stack with gcc Вот такая строка есть в одном файле. Дает понять что программа заточена не только под специфичные для каждого компилятора хидеры, но и под сам компилятор...
|
|
|
|
|
Jul 6 2006, 18:33
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
Начинаю ковырять. Выяснил - вот это приводило к появлению ошибки "the program hs no void main() function" Код // macro to utilize lpm with inc
.macro rpm reg #if defined (__AVR_ENHANCED__) lpm \reg, Z+ #else lpm mov \reg, r0 adiw ZL, 1 #endif .endm
// macro to enter a stack with gcc
.macro ENTER unused_regs stack_locals
ENTER: clr XH ldi XL, \stack_locals ldi ZH, hi8(ENTRY) // there is no way to rescale an address by 0.5 ldi ZL, lo8(ENTRY) // thus we have to right shift the address with additional code lsr ZH ror ZL xjmp (__prologue_saves__ + 2 * \unused_regs) ENTRY: .endm
// macro to leave a stack entered with ENTER
.macro LEAVE unused_regs stack_locals ptr_changed
LEAVE: ldi ZL, 18 - \unused_regs .if (\ptr_changed) in YL, _SFR_IO_ADDR(SPL) in YH, _SFR_IO_ADDR(SPH) .endif .if (\stack_locals) adiw YL, \stack_locals .endif xjmp (__epilogue_restores__ + 2 * (\unused_regs)) .endm
// macro unsigned 8x8 multiplication
.macro MUL8x8 resH resL A B temp clr \resH ldi \temp, 8 lsr \A brcc .+2 add \resH, \B ror \resH ror \resL dec \temp brne .-14 .endm
// movw replacement, support words on odd addresses, overlapping, hardware dependend // and avoid dummy moves on same registers, to get this macro working we have to reassign // register defines, such as above
.macro _movw dst src .if (\src - \dst) .if ((\src | \dst) & 0x01) .if ((\src - \dst) & 0x80) mov \dst +1, \src +1 mov \dst , \src .else mov \dst , \src mov \dst +1, \src +1 .endif .else #if __AVR_ENHANCED__ movw \dst , \src #else mov \dst , \src mov \dst +1, \src +1 #endif .endif .endif .endm Что это, чем чревато удаление этого и если чревато плохими последствиями, как это сделать в CodeVision? P.S. этот код располагался в конце файла regs.inc
|
|
|
|
|
Jul 6 2006, 19:11
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
Код typedef union { uint8_t All; struct { uint8_t AutoLineFeed:1, FixedFont:1, Clipping:1; }; } glcdFlags_t; declaration syntax error. Как вышеприведенное выражение должно писаться в Codevision?
|
|
|
|
|
Jul 6 2006, 19:26
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
Цитата включать надо заголовочник glcd.h - это объявление асмовских функций в С коде. Кстати совершенно стандартный прием.
Оставьте пустой main, вставьте в проект асм файлы и собирайте. Более или менее разобрался с заголовочником. А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы.
|
|
|
|
|
Jul 6 2006, 20:05
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата // macro to enter a stack with gcc Набор всяких полезных макросов, пока можно закоментить, а потом разбираться, где и как используються и как это можно обойти. Цитата Как вышеприведенное выражение должно писаться в Codevision? Возможно проблема в битовых полях(попробуйте локализовать), включить их поддержку в CV. Цитата А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы. Если нельзя, вероятно стоит забыть про CV, ибо что это за среда, если не позволяет работать со смешанным кодом. Попробуйте спросить у клетчатого, он большой спец по CV.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 6 2006, 20:48
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Цитата(virtuality @ Jul 6 2006, 23:11)  Код typedef union { uint8_t All; struct { uint8_t AutoLineFeed:1, FixedFont:1, Clipping:1; }; } glcdFlags_t; declaration syntax error. Как вышеприведенное выражение должно писаться в Codevision? Код typedef union { uint8_t All; struct { uint8_t AutoLineFeed:1, FixedFont:1, Clipping:1; } s; } glcdFlags_t; потому что CV не позволяет делать безымянных полей. Ассемблерные файлы не добавляются, у CV другая организация проекта. Впрочем, в CV можно свободно мешать ассемблер с сишным кодом.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Jul 7 2006, 01:27
|
Участник

Группа: Новичок
Сообщений: 17
Регистрация: 24-05-06
Пользователь №: 17 392

|
Цитата(virtuality @ Jul 6 2006, 22:26)  А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы. Попробуйте так: #asm .include "file.asm" #endasm
|
|
|
|
|
Jul 7 2006, 16:30
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
Итак, поехали ковырять. Вот что у меня получилось с первой функцией: файл s65.c - главный Код #define __AVR_ATmega16__
#include <mega16.h> #include <stdio.h> #include <glcd.h>
void main ()
{ glcdWait(500); } Фрагмент файла glcd.h Код extern void glcdWait(uint16_t ms) { #asm glcdWait: sbiw P0, 1 // 2 brcc glcdWait1 // 2 ret // 2 -2 = 0 for no branch in both loops glcdWait1: nop ldi T0, lo8(DELAY_ONE_MILLISECOND -4) // 1 ldi T1, hi8(DELAY_ONE_MILLISECOND -4) // 1 glcdWait2: sbiw T0, 1 // 2 brne glcdWait2 // 2 = 4, = 3 for last loop rjmp glcdWait // 2 = 8
#endasm }
Как выгялдел этот фрагмент в glcd_init.asm:
[code]
// void glcdWait(uint16_t ms); // wait some milliseconds, XTAL must be correct defined
.global glcdWait // used T0,T1 stack 0 glcdWait: sbiw P0, 1 // 2 brcc glcdWait1 // 2 ret // 2 -2 = 0 for no branch in both loops glcdWait1: nop ldi T0, lo8(DELAY_ONE_MILLISECOND -4) // 1 ldi T1, hi8(DELAY_ONE_MILLISECOND -4) // 1 glcdWait2: sbiw T0, 1 // 2 brne glcdWait2 // 2 = 4, = 3 for last loop rjmp glcdWait // 2 = 8
;************************************************ Запускаем - на программу С компилятор не ругается, однако пишет ошибку при ассемблировании - выдает ассмблированную программу: Код ; 176 ret // 2 -2 = 0 for no branch in both loops ret // 2 -2 = 0 for no branch in both loops ; 177 glcdWait1: glcdWait1: ; 178 nop nop ; 179 ldi T0, lo8(DELAY_ONE_MILLISECOND -4) // 1 ldi T0, lo8(DELAY_ONE_MILLISECOND -4) // 1 // ------СТРОКА 1257---- ; 180 ldi T1, hi8(DELAY_ONE_MILLISECOND -4) // 1 ldi T1, hi8(DELAY_ONE_MILLISECOND -4) // 1 В строке 1257 : syntax error unexpect "(" файлы glcd.inc и regs.inc находятся в приаттаченом в анчале темы архиве. Что делать и кто виноват?
|
|
|
|
|
Jul 7 2006, 18:16
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата В строке 1257 : syntax error unexpect "(" Похоже не понимает hi8()/lo8(). Замените на стандартный ассемблер AVR или напишите эти макросы. Цитата но при компляции ругается на invalid directive .section, .global Да это специфично.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 9 2006, 14:10
|
Участник

Группа: Новичок
Сообщений: 50
Регистрация: 1-10-05
Пользователь №: 9 136

|
Существуют ли библиотеки для WinAVR для работы с 1-Wire ?
Да на avrfreaks.org
Перейти что ли на WinAVR? Блин, CodeVision удобен, больше похож на среду разработки, чем WinAVR.
Озадачен примерно темже, только в плане что выбрать для работы на С++ с AVR, правда я выбираю в большей степени между IAR и avr-gcc.
Как мне показалось IAR распространен больше, но WinAvr будет легче изучать (ибо ни gcc ни make для меня не новость, только с avrlibc разобраться)
--------------------
Мы не просто идем в будущее, мы его атакуем.
|
|
|
|
|
Jul 9 2006, 16:14
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
Я конечно понимаю, что переползать с одного комплятора на другой муторно и требует усидчивости, но все же - бесят элементарные проблемы. Как было просто в CodeVision Код #include <delay.h> //// void main () { delay_us(500); } в WinAVR вроде тоже есть такая библиотека, и функция так же обзывается, но Код #include <avr/delay.h> //// void main () { delay_us(500); } Выдает ошибку undefined refefrence delay_us Ну что с этим делать. P.S. У кого-нить есть рабочий пример для датчика DS18B20 для WinAVR
|
|
|
|
|
Jul 9 2006, 17:25
|
Участник

Группа: Новичок
Сообщений: 50
Регистрация: 1-10-05
Пользователь №: 9 136

|
Ну что с этим делать.
Загляните в delay.h, там все описано. Эта фунция обьявлена как: void _delay_us(double __us)
Она кстати и в документации на avr-libc также упоминаются.
--------------------
Мы не просто идем в будущее, мы его атакуем.
|
|
|
|
|
Jul 10 2006, 02:13
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата КОнсоль выдает Total 17900, хотя это не соответствует истине - файл заливается в Mega16 без проблем. Код m32sound.elf : section size addr .text 972 0 .data 8 8388704 .bss 69 8388712 .noinit 0 8388781 .eeprom 0 8454144 .stab 3672 0 .stabstr 3628 0 Total 8349 Код это .text, .data .bss .noinit - данные, .eeprom надеюсь понятно. Цитата Блин, CodeVision удобен, больше похож на среду разработки, По умолчанию WinAVR включает Programmers Notepad (под которым кстати пишу и под ARM и под РС и HTML).Нет особых сложностей прицепить его под любой другой редактор кода, хоть под Visual Studio. Главное, чтобы редактор позволял подключать внешние программы и захватывал их выход. Цитата в WinAVR вроде тоже есть такая библиотека В документе avr-libc-user-manual очень подробно рассмотрены все функции, а также фокусы с секциями, встраиванием ассемблера etc.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 10 2006, 07:19
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 9-06-05
Пользователь №: 5 868

|
Цитата(virtuality @ Jul 9 2006, 17:29)  Перейти что ли на WinAVR? Блин, CodeVision удобен, больше похож на среду разработки, чем WinAVR. Вот как например в WinAVR узнать размер получившейся программы? КОнсоль выдает Total 17900, хотя это не соответствует истине - файл заливается в Mega16 без проблем.
Существуют ли библиотеки для WinAVR для работы с 1-Wire ? После компиляции в окне Programmer Notepad text data bss dec hex filename 9412 0 405 9817 2659 dvdavtomat.elf По моему все ясно Для задержек изучите нижеуказанный хидер /include/util/delay.h заодно посмотрите как ассемблер юзать в WinAVR А библиотек столько написано что вы приятно удивитесь скачав и распаковав http://hubbard.engr.scu.edu/embedded/avr/avrlib #ifndef _UTIL_DELAY_H_ #define _UTIL_DELAY_H_ 1 #include <inttypes.h> /** \defgroup util_delay <util/delay.h>: Busy-wait delay loops \code #define F_CPU 1000000UL // 1 MHz //#define F_CPU 14.7456E6 #include <util/delay.h> \endcode \note As an alternative method, it is possible to pass the F_CPU macro down to the compiler from the Makefile. Obviously, in that case, no \c \#define statement should be used. The functions in this header file implement simple delay loops that perform a busy-waiting. They are typically used to facilitate short delays in the program execution. They are implemented as count-down loops with a well-known CPU cycle count per loop iteration. As such, no other processing can occur simultaneously. It should be kept in mind that the functions described here do not disable interrupts. In general, for long delays, the use of hardware timers is much preferrable, as they free the CPU, and allow for concurrent processing of other events while the timer is running. However, in particular for very short delays, the overhead of setting up a hardware timer is too much compared to the overall delay time. Two inline functions are provided for the actual delay algorithms. Two wrapper functions allow the specification of microsecond, and millisecond delays directly, using the application-supplied macro F_CPU as the CPU clock frequency (in Hertz). These functions operate on double typed arguments, however when optimization is turned on, the entire floating-point calculation will be done at compile-time. \note When using _delay_us() and _delay_ms(), the expressions passed as arguments to these functions shall be compile-time constants, otherwise the floating-point calculations to setup the loops will be done at run-time, thereby drastically increasing both the resulting code size, as well as the time required to setup the loops. */ #if !defined(__DOXYGEN__) static inline void _delay_loop_1(uint8_t __count) __attribute__((always_inline)); static inline void _delay_loop_2(uint16_t __count) __attribute__((always_inline)); static inline void _delay_us(double __us) __attribute__((always_inline)); static inline void _delay_ms(double __ms) __attribute__((always_inline)); #endif /** \ingroup util_delay Delay loop using an 8-bit counter \c __count, so up to 256 iterations are possible. (The value 256 would have to be passed as 0.) The loop executes three CPU cycles per iteration, not including the overhead the compiler needs to setup the counter register. Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds can be achieved. */ void _delay_loop_1(uint8_t __count) { __asm__ volatile ( "1: dec %0" "\n\t" "brne 1b" : "=r" (__count) : "0" (__count) ); } /** \ingroup util_delay Delay loop using a 16-bit counter \c __count, so up to 65536 iterations are possible. (The value 65536 would have to be passed as 0.) The loop executes four CPU cycles per iteration, not including the overhead the compiler requires to setup the counter register pair. Thus, at a CPU speed of 1 MHz, delays of up to about 262.1 milliseconds can be achieved. */ void _delay_loop_2(uint16_t __count) { __asm__ volatile ( "1: sbiw %0,1" "\n\t" "brne 1b" : "=w" (__count) : "0" (__count) ); } #ifndef F_CPU /* prevent compiler error by supplying a default */ # warning "F_CPU not defined for <util/delay.h>" # define F_CPU 1000000UL #endif /** \ingroup util_delay Perform a delay of \c __us microseconds, using _delay_loop_1(). The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz). The maximal possible delay is 768 us / F_CPU in MHz. */ void _delay_us(double __us) { uint8_t __ticks; double __tmp = ((F_CPU) / 3e6) * __us; if (__tmp < 1.0) __ticks = 1; else if (__tmp > 255) __ticks = 0; /* i.e. 256 */ else __ticks = (uint8_t)__tmp; _delay_loop_1(__ticks); } /** \ingroup util_delay Perform a delay of \c __ms milliseconds, using _delay_loop_2(). The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz). The maximal possible delay is 262.14 ms / F_CPU in MHz. */ void _delay_ms(double __ms) { uint16_t __ticks; double __tmp = ((F_CPU) / 4e3) * __ms; if (__tmp < 1.0) __ticks = 1; else if (__tmp > 65535) __ticks = 0; /* i.e. 65536 */ else __ticks = (uint16_t)__tmp; _delay_loop_2(__ticks); } #endif /* _UTIL_DELAY_H_ */
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|