Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как проект в WinAVR переделать под CodeVision?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
virtuality
В аттаче проект для WinAVR. Я же пишу в CodeVision.
Как переделать - даже не знаю с чего начать.

Если не трудно, гляньте одним глазком и подскажите хоть что нибудь.
beer_warrior
Хм,
там же все на асме....
virtuality
Ну основной то файл на C.
Там интересно сделано - куча асмовых файлов+Сишный - компилируется в библиотеку libglcd.a

А далее тестовый файл написанный на чистом С, который может быть и запустился бы в CV - просто использует эту библиотеку, которая исключительно для WinAVR.
beer_warrior
Просмотрел еще раз.
Куча асмовских файлов и один сишный хидер с внешними декларациями.Ничего специфичного для конкретного компилятора я не вмжу. Делайте проект в CV, собирайте в нем библиотеку потом включайте хидер в тестовую программу, а линкеру скомандуйте подключить библиотеку.
Как колхозный способ, если проблема со сборкой библиотеки, просто включите ассемблерные файлы в проект.
virtuality
А вот комплятор видит.
Для начала я попытался включить некоторые хидеры:

Код
#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...
beer_warrior
Вот это уже дело.
функции из avr_libc:
strncasecmp_P - сравнить строку с флешом с учетом регистра
strncmp_P - без учета регистра
меняйте на родные для CV не забывая об extern.

PS Что-то я в архиве этого не нашел - в каком они файле?
virtuality
Цитата
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 ()
beer_warrior
[quote] А насчет родных функций для CV - будьте любезны, подскажите, вам из вашей памяти извлечь наверное проще. [/quote]
Никогда серьезно не работал с CV, так посмотрел что к чему. В основном живу с gcc и IAR. Так, что придеться таки читать документацию.
io.h - описание битов портов
pgmspace.h - описание функций работы с флэшом [
quote] И САМОЕ ИНТЕРЕСНОЕ - компилятор пишет что у меня нет функции main () [/quote]
Значит проект сконфигурирован неправильно.
Тут ничем не могу помочь, это фичи самого CV.
vet
Инклудить asm бессмысленно, т.к. этим Вы заставляете компилятор Си транслировать совершенно не сишный код.
Почти уверен, что main не находится как раз по этой причине.
Проект нуждается в оформлении по правилам CV (см. встроенный хелп и примеры в examples\).
virtuality
хм... вот я о том и говорил. В противовес утверждениям, что нет ничего специфичного для CV в этой библиотеке. Будем разбираться.
Просто хотелось помощи людей, у которых это быстрее получилось бы.
beer_warrior
Цитата
В противовес утверждениям, что нет ничего специфичного для CV в этой библиотеке.

Недосмотрел, включать надо заголовочник glcd.h - это объявление асмовских функций в С коде. Кстати совершенно стандартный прием.

Оставьте пустой main, вставьте в проект асм файлы и собирайте.
Ошбки можете запостить.
Цитата
В противовес утверждениям, что нет ничего специфичного для CV в этой библиотеке.


Кстати есть еще один прием достаточно быстрой переделки
Код

void foo(void)
{
asm {
        ...
       }
}
virtuality
glcd.h у меня включен.
Через него включаются пресловутые IO.h и pgmspace.h, вследстве чего выдаются те же ошибки, что указаны выше.

В общем сложности в структуре кода. Постепенно вчитыаясь в него я уже начинаю представлять всю его архитектуру. По-моему все-таки нужно отследить все что это код берет из стандартных библиотек и попытаться заменить на CV-функции.

Кстати, в glcd.h напротив каждой функции стоит extern. Это признак того, что заголовок написан для создания библиотеки, не так ли? Может быть в этом причина?

к вопросу о специфичности кода:

typedef uint16_t glcdColor_t; - это codeVision не понимает.
vet
Только потому, что uint16_t сам получен в результате typedef'а. Которого в тексте и include'нных файлах нет.
Смысл простой - 16-разрядное беззнаковое число.
virtuality
эээ... напрягаем ламерские мозги.... unsigned long?
Непонятно, зачем тогда этот typedef нужен?

Блин, надоело мне... Буду выдирать код по кускам и поэтапно проверять. Вопрос только в том стоит ли? А посему скажите мне, верны ли утверждения, что CodeVision генерит более громоздкий и глючный код по сравнению с WinAvr? И так ли это ужасно? Может лучше перейти на WinAVR?
Petka
ОФФТОП: как-то переделывал програмку из CV в WinAVR. для автоматизации написал скрипт на PERL, который делает некоторую рутиную работу. Если кому надо могу поделиться. Может кто-нибудь и до ума доведёт....
virtuality
Код
// macro to enter a stack with gcc


Вот такая строка есть в одном файле. Дает понять что программа заточена не только под специфичные для каждого компилятора хидеры, но и под сам компилятор...
virtuality
Начинаю ковырять.

Выяснил - вот это приводило к появлению ошибки "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
virtuality
Код
typedef union {
    uint8_t All;
    struct {
    uint8_t AutoLineFeed:1,    
        FixedFont:1,
        Clipping:1;              
    };
} glcdFlags_t;


declaration syntax error.

Как вышеприведенное выражение должно писаться в Codevision?
virtuality
Цитата
включать надо заголовочник glcd.h - это объявление асмовских функций в С коде. Кстати совершенно стандартный прием.

Оставьте пустой main, вставьте в проект асм файлы и собирайте.



Более или менее разобрался с заголовочником. А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы.
beer_warrior
Цитата
// macro to enter a stack with gcc

Набор всяких полезных макросов, пока можно закоментить, а потом разбираться, где и как используються и как это можно обойти.
Цитата
Как вышеприведенное выражение должно писаться в Codevision?

Возможно проблема в битовых полях(попробуйте локализовать), включить их поддержку в CV.
Цитата
А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы.

Если нельзя, вероятно стоит забыть про CV, ибо что это за среда, если не позволяет работать со смешанным кодом.
Попробуйте спросить у клетчатого, он большой спец по CV.
virtuality
Кто такой клетчатый? Киньте пожалуйста ссылочку на его профиль, поиск в форуме имен начинающихся с "клетчат" результатов не дал.
beer_warrior
Наш общий друг [banned]123.
vet
Цитата(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 можно свободно мешать ассемблер с сишным кодом.
tiasur
Цитата(virtuality @ Jul 6 2006, 22:26) *
А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы.


Попробуйте так:

#asm
.include "file.asm"
#endasm
IgorKossak
Цитата(virtuality @ Jul 6 2006, 23:18) *
Кто такой клетчатый? Киньте пожалуйста ссылочку на его профиль, поиск в форуме имен начинающихся с "клетчат" результатов не дал.

Не берите дурного в голову wink.gif
Клетчатый Вам не только не поможет, а и вовсе заведёт в болото своего больного подсознания.
virtuality
Итак, поехали ковырять.

Вот что у меня получилось с первой функцией:

файл 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 находятся в приаттаченом в анчале темы архиве.

Что делать и кто виноват?
virtuality
Так разобрался я как включать асмы в проект, но при компляции ругается на invalid directive .section, .global

Это тоже специфика WinAVR?
beer_warrior
Цитата
В строке 1257 : syntax error unexpect "("

Похоже не понимает hi8()/lo8(). Замените на стандартный ассемблер AVR или напишите эти макросы.
Цитата
но при компляции ругается на invalid directive .section, .global

Да это специфично.
virtuality
оххх...

Наивный вопрос, но нельзя ли как-нить в WinAVR скомпилить унифицированную библиотеку, чтобы можно было использовать с CodeVision?
vet
Нет. CV работает только с исходниками.
virtuality
Перейти что ли на WinAVR? Блин, CodeVision удобен, больше похож на среду разработки, чем WinAVR. Вот как например в WinAVR узнать размер получившейся программы? КОнсоль выдает Total 17900, хотя это не соответствует истине - файл заливается в Mega16 без проблем.

Существуют ли библиотеки для WinAVR для работы с 1-Wire ?
shevek
Существуют ли библиотеки для WinAVR для работы с 1-Wire ?

Да на avrfreaks.org

Перейти что ли на WinAVR? Блин, CodeVision удобен, больше похож на среду разработки, чем WinAVR.

Озадачен примерно темже, только в плане что выбрать для работы на С++ с AVR, правда я выбираю в большей степени между IAR и avr-gcc.


Как мне показалось IAR распространен больше, но WinAvr будет легче изучать (ибо ни gcc ни make для меня не новость, только с avrlibc разобраться)
virtuality
Я конечно понимаю, что переползать с одного комплятора на другой муторно и требует усидчивости, но все же - бесят элементарные проблемы. Как было просто в 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
shevek
Ну что с этим делать.

Загляните в delay.h, там все описано. Эта фунция обьявлена как:
void
_delay_us(double __us)

Она кстати и в документации на avr-libc также упоминаются.
beer_warrior
Цитата
КОнсоль выдает 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.
niccom
Цитата(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_ */
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.