C AVR

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Hello everybody.

Вот блин...
Везде только и разговоров, что архитектура AVR под С оптимизирована...
Только я что-то ни в одном компиляторе не увидел внятного доступа к битам,
да и вообще битовые операции в ЯВУ игнорируются:-(
Или я что-то не вижу? Так ткните носом.

Вот пример того, что интересует:

PortB.1=1;
if(PinB.5==0){
TXEN=1;
}

... и в таком-же духе.
Подскажите, какой-либо из (условно)бесплатных
компиляторов это поддерживает?


Vital


C AVR
Hello, Vital!

(08 Июл 06 17:49), Vital Migunow писАл All:
 VM> Вот пример того, что интересует:
 VM> PortB.1=1;
 Я делаю это с помощью макросов. Для макроса понятное имя, например #define
led_power PB1
#define On_led_power() PORTB &=~(1<<led_power) // зажечь светодиод, в данном
случае пин в 0
#define Off_led_power() PORTB |= (1<<led_power) // потушить светодиод, пин в 1
 VM> if(PinB.5==0){
 Здесь я использую маску, но например в WinAVR можно использовать макросы
bit_is_set(PINB,PB5) и bit_is_clear(PINB,PB5).
 VM> TXEN=1;
UCSRB |= (1<<TXEN);

 Первоначально непривычно, но привыкаешь быстро.

With best regards, Igor.        Time: 20:48        Date: 08 Июл 06

Re: C AVR
Hello, Vital!
You wrote to All on Sat, 08 Jul 2006 16:49:24 +0400:

 VM> Hello everybody.

 VM> Вот блин...
 VM> Везде только и разговоров, что архитектура AVR под С
 VM> оптимизирована...
 VM> Только я что-то ни в одном компиляторе не увидел внятного доступа к
 VM> битам, да и вообще битовые операции в ЯВУ игнорируются:-(

Да ну?!

 VM> Или я что-то не вижу? Так ткните носом.

 VM> Вот пример того, что интересует:

 VM> PortB.1=1;
 VM> if(PinB.5==0){
 VM> TXEN=1;
 VM> }

 VM> ... и в таком-же духе.
 VM> Подскажите, какой-либо из (условно)бесплатных компиляторов это
 VM> поддерживает?

Все...

RB1 =1;
if (RB5==0){
  TXEN =1;
}



With best regards, Alexandr Torres.

[ Жамству бой ! ]

2:461/28, E-mail: snipped-for-privacy@yahoo.com
http://altor.sytes.net



Re: C AVR

X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Vital Migunow!
You wrote in conference fido7.ru.embedded to All on Sat, 08 Jul 2006 16:49:24
+0400:

 VM> Вот блин...
 VM> Везде только и разговоров, что архитектура AVR под С
 VM> оптимизирована...
 VM> Только я что-то ни в одном компиляторе не увидел внятного доступа к
 VM> битам, да и вообще битовые операции в ЯВУ игнорируются:-(
 VM> Или я что-то не вижу? Так ткните носом.

 VM> Вот пример того, что интересует:

 VM> PortB.1=1;
 VM> if(PinB.5==0){
 VM> TXEN=1;
 VM> }

 VM> ... и в таком-же духе.
 VM> Подскажите, какой-либо из (условно)бесплатных компиляторов это
 VM> поддерживает?

Любой. Было тут совсем недавно:

typedef struct {
    unsigned char bit0 : 1;
    unsigned char bit1 : 1;
    unsigned char bit2 : 1;
    unsigned char bit3 : 1;
    unsigned char bit4 : 1;
    unsigned char bit5 : 1;
    unsigned char bit6 : 1;
    unsigned char bit7 : 1;
} bits;

#define PORTB (*(bits*)0x06)
#define PB5 PORTB.bit5


dima
http://www.dorlov.no-ip.com
http://dimorlus.dynalias.com




Re: C AVR
Hello Vital.

08 Jul 06 17:49, you wrote to All:

 > Hello everybody.

 > Вот блин...
 > Везде только и разговоров, что архитектура AVR под С оптимизирована...
 > Только я что-то ни в одном компиляторе не увидел внятного доступа к битам,
 > да и вообще битовые операции в ЯВУ игнорируются:-(
 > Или я что-то не вижу? Так ткните носом.

 > Вот пример того, что интересует:

 > PortB.1=1;
 > if(PinB.5==0){
 > TXEN=1;
 > }

 > ... и в таком-же духе.
 > Подскажите, какой-либо из (условно)бесплатных
 > компиляторов это поддерживает?

Качать "условно бесплатное" мне лень, пользую WinAvr.
Для работы с битами когдато Harry Zurov мне тут присоветовал:
 #define SetBit(Reg, Bit)    (Reg |= (1 << Bit))
 #define ClearBit(Reg, Bit)  (Reg &= ~(1 << Bit))
 #define ToggleBit(Reg, Bit) (Reg ^= (1 << Bit))
 #define TestBit(Reg, Bit)   (Reg & (1 << Bit))
 #define InBit(Reg, Bit)    ((Bit)|=  )

Соответственно мигание диода на portb бит 0 выглядит так:
if (TestBit(PORTB, 0x00)) {ClearBit(PORTB, 0x00);} else {SetBit(PORTB, 0x00);};
Впрочем есть масса вариантов.

Nicolas


C AVR
Привет Vital!

08 Jul 06 17:49, Vital Migunow писал All:

 VM> Вот пример того, что интересует:

 VM> PortB.1=1;
 VM> if(PinB.5==0){
 VM> TXEN=1;
 VM> }

 VM> Подскажите, какой-либо из (условно)бесплатных
 VM> компиляторов это поддерживает?

    Твой пример как он есть (добуквенно) не удовлетворяет правилам языка C,
поэтому вряд ли кто его поддержит. Из бесплатных компиляторов рекомендую gcc.
Валидный код аналогичного назначения он компилирует вот в это:

        lds r24,PortB
        ori r24,lo8(2)
        sts PortB,r24
        lds r24,PinB
        sbrc r24,5
        rjmp .L4
        lds r24,UCR
        ori r24,lo8(8)
        sts UCR,r24
.L4:

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Даже лошадь Пржевальского может быть собакой Павлова.

Re: C AVR


Hello, Alex Mogilnikov!
You wrote in conference fido7.ru.embedded to Vital Migunow on Sat, 08 Jul
2006 22:00:53 +0400:

  VM>> Вот пример того, что интересует:

 VM>> PortB.1=1;
 VM>> if(PinB.5==0){
 VM>> TXEN=1;
 VM>> }

 VM>> Подскажите, какой-либо из (условно)бесплатных компиляторов это
 VM>> поддерживает?

 AM>     Твой пример как он есть (добуквенно) не удовлетворяет правилам
 AM> языка C, поэтому вряд ли кто его поддержит.

Его поддержат многие компиляторы для х51, это общепринятое для них
расширение синтаксиса.

dima
http://www.dorlov.no-ip.com
http://dimorlus.dynalias.com




Re: C AVR

Quoted text here. Click to load it

  sbi PORTB, 1

Quoted text here. Click to load it

  sbic PINB, 5
  rjmp .L4



C AVR
Hello Alex.

Sat Jul 08 2006 23:00, Alex Mogilnikov wrote to Vital Migunow:

 AM> Твой пример как он есть (добуквенно) не удовлетворяет правилам языка
 AM> C, поэтому вряд ли кто его поддержит. Из бесплатных компиляторов
 AM> рекомендую gcc. Валидный код аналогичного назначения он компилирует
 AM> вот в это:

 AM>         lds r24,PortB
 AM>         ori r24,lo8(2)
 AM>         sts PortB,r24
 AM>         lds r24,PinB
 AM>         sbrc r24,5
 AM>         rjmp .L4
 AM>         lds r24,UCR
 AM>         ori r24,lo8(8)
 AM>         sts UCR,r24
 AM> .L4:

М-да, сравнения с IAR-ом не выдерживает...


Dimmy.


C AVR
Привет Dimmy!

09 Jul 06 15:21, Dimmy Timchenko писал Alex Mogilnikov:

 DT> М-да, сравнения с IAR-ом не выдерживает...

    Вопрос был про бесплатные компиляторы.

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... О сколько нам открытий чудных готовит открывашки крюк!

C AVR
Hello Alex.

Mon Jul 10 2006 12:58, Alex Mogilnikov wrote to me:

 DT>> М-да, сравнения с IAR-ом не выдерживает...

 AM> Вопрос был про бесплатные компиляторы.

Бесплатные официально или фактически? :)


Dimmy.


C AVR
Привет Dimmy!

10 Jul 06 17:01, Dimmy Timchenko писал Alex Mogilnikov:

 AM>> Вопрос был про бесплатные компиляторы.

 DT> Бесплатные официально или фактически? :)

    Это ты лучше у Vital Migunow спрашивай...

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Чудо-йогурт Био. Чемпион среди какао.

C AVR
Hello Vital!
08.07.2006 16:49:24, Vital Migunow wrote to All:

 VM> Hello everybody.
 VM>
 VM> Вот блин...
 VM> Везде только и pазговоpов, что аpхитектуpа AVR под С оптимизиpована...
 VM> Только я что-то ни в одном компилятоpе не увидел внятного доступа к битам,
 VM> да и вообще битовые опеpации в ЯВУ игноpиpуются:-(
 VM> Или я что-то не вижу? Так ткните носом.
 VM>
 VM> Вот пpимеp того, что интеpесует:
 VM>
 VM> PortB.1=1;
 VM> if(PinB.5==0){
 VM> TXEN=1;
 VM> }
 VM>
 VM> ... и в таком-же духе.
 VM> Подскажите, какой-либо из (условно)бесплатных
 VM> компилятоpов это поддеpживает?

IAR AVR EWB 4.20A:

#include <iom8.h>
__C_task void main(void)
{

PORTB_Bit1 = 1;

if(PINB_Bit5 == 1)
   {
    UCSRB_Bit3 = 1;     //TXEN = 1;
   }
}

Компилиpуется в:

      3          __C_task void main(void)
   \                     main:
      4          {
      5
      6
      7          PORTB_Bit1 = 1;
   \   00000000   9AC1               SBI     0x18, 0x01
      8
      9          if(PINB_Bit5 == 1)
   \   00000002   99B5               SBIC    0x16, 0x05
     10          {
     11                  UCSRB_Bit3 = 1;//TXEN = 1;
   \   00000004   9A53               SBI     0x0A, 0x03
     12          }
     13
     14          }
   \                     ??main_0:
   \   00000006   9508               RET


Bye, Sergey.

Re: C AVR
Hello Sergey.

08 Июл 34 21:48, you wrote to me:

 VM>> TXEN=1;

 ST>     UCSRB_Bit3 = 1;     //TXEN = 1;
сравнил две строчки?
Если первую писать несколько секунд, то для второй еще нужно "горой макулатуры"
обложиться... А если еще в горячке комментарий потеряется?

Хорошо, когда пишешь постоянно и много.
В моем случае писать приходится редко, разовые устройства...
В основном AlgBuilder-ом обхожусь, но сейчас достаточно сложное устройство,
где и индикация, и массив данных с плавающей запятой придется обрабатывать...
А параллельно датчики, соленоиды, ключи, связь с PC...


Vital


C AVR
Hello Vital.

Sun Jul 09 2006 07:49, Vital Migunow wrote to Sergey Teterin:

 VM>>> TXEN=1;

 ST>>     UCSRB_Bit3 = 1;     //TXEN = 1;

 VM> сравнил две строчки?
 VM> Если первую писать несколько секунд, то для второй еще нужно "горой
 VM> макулатуры" обложиться...

Подправь файлы определения SFR/битов или напиши "маскирующие" макросы.  Делов
на час максимум.

 VM> А если еще в горячке комментарий потеряется?

Спасение утопающих - дело рук самих утопающих.  Hе нравится - пиши на
ассемблере.


Dimmy.


Re: C AVR

Quoted text here. Click to load it

Ну - типа того. А где ты в Си увидал биты (кроме странных битовых полей)?


Re: C AVR

Quoted text here. Click to load it

  PORTB|=1;

Quoted text here. Click to load it

  if (0==PINB&0x20)...

Quoted text here. Click to load it

  GCC не бесплатный. Он "свободныйй".


Re: C AVR
Привет Kirill!

09 Jul 06 01:43, Kirill Frolov писал Alex Mogilnikov:

 >>         lds r24,PortB
 >>         ori r24,lo8(2)
 >>         sts PortB,r24

 KF>   sbi PORTB, 1

 >>         lds r24,PinB
 >>         sbrc r24,5
 >>         rjmp .L4

 KF>   sbic PINB, 5
 KF>   rjmp .L4

    Без использования ассемблерных вставок? Покажи свой исходник. Мой исходник
вот:

========= test.c =============
typedef struct {
    unsigned char bit0:1;
    unsigned char bit1:1;
    unsigned char bit2:1;
    unsigned char bit3:1;
    unsigned char bit4:1;
    unsigned char bit5:1;
    unsigned char bit6:1;
    unsigned char bit7:1;
} T8bit;

extern T8bit PortB;
extern T8bit PinB;
extern T8bit UCR;

#define TXEN UCR.bit3

void f(void)
{
    PortB.bit1 = 1;
    if(PinB.bit5 == 0)
        TXEN = 1;
}
==============================

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Западно-уральское региональное общество добровольных учредителей.

C AVR
Sun Jul 09 2006 16:23, Alex Mogilnikov wrote to Kirill Frolov:

 AM> Привет Kirill!

 AM> 09 Jul 06 01:43, Kirill Frolov писал Alex Mogilnikov:

 >>>         lds r24,PortB
 >>>         ori r24,lo8(2)
 >>>         sts PortB,r24

 KF>>   sbi PORTB, 1

 >>>         lds r24,PinB
 >>>         sbrc r24,5
 >>>         rjmp .L4

 KF>>   sbic PINB, 5
 KF>>   rjmp .L4

 AM>     Без использования ассемблерных вставок? Покажи свой исходник. Мой
 AM> исходник вот:

 AM> ========= test.c =============
 AM> typedef struct {
 AM>     unsigned char bit0:1;
 AM>     unsigned char bit1:1;
 AM>     unsigned char bit2:1;
 AM>     unsigned char bit3:1;
 AM>     unsigned char bit4:1;
 AM>     unsigned char bit5:1;
 AM>     unsigned char bit6:1;
 AM>     unsigned char bit7:1;
 AM> } T8bit;

 AM> extern T8bit PortB;
 AM> extern T8bit PinB;
 AM> extern T8bit UCR;

 AM> #define TXEN UCR.bit3

 AM> void f(void)
 AM> {
 AM>     PortB.bit1 = 1;
 AM>     if(PinB.bit5 == 0)
 AM>         TXEN = 1;
 AM> }
 AM> ==============================

Где в твоем исходнике компилятору сказано, что у extern PortB и PinB
есть битовые операции?

==============================
#include <inavr.h>
#include <iom128.h>

void f(void);

void f(void)
{
    PORTB_PORTB7 = 1;
    if(PORTB_PORTB5 == 0)
        SPCR_Bit0 = 1;
}
==============================
      7          void f(void)
   \                     f:
      8          {
      9              PORTB_PORTB7 = 1;
   \   00000000   9AC7               SBI     0x18, 0x07
     10              if(PORTB_PORTB5 == 0)
   \   00000002   9BC5               SBIS    0x18, 0x05
     11                  SPCR_Bit0 = 1;
   \   00000004   9A68               SBI     0x0D, 0x00
     12          }
   \                     ??f_0:
   \   00000006   9508               RET
==============================
EWAVR 4.20A

"Resistance is futile"


C AVR
Привет Yuriy!

09 Jul 06 19:11, Yuriy K писал Alex Mogilnikov:

 AM>>     Без использования ассемблерных вставок? Покажи свой исходник.
 AM>> Мой исходник вот:

 AM>> ========= test.c =============
 AM>> typedef struct {
 AM>>     unsigned char bit0:1;
 AM>>     unsigned char bit1:1;
 AM>>     unsigned char bit2:1;
 AM>>     unsigned char bit3:1;
 AM>>     unsigned char bit4:1;
 AM>>     unsigned char bit5:1;
 AM>>     unsigned char bit6:1;
 AM>>     unsigned char bit7:1;
 AM>> } T8bit;

 AM>> extern T8bit PortB;
 AM>> extern T8bit PinB;
 AM>> extern T8bit UCR;
 AM>> ==============================

 YK> Где в твоем исходнике компилятору сказано, что у extern PortB и PinB
 YK> есть битовые операции?

    В декларации T8bit.

 YK> ==============================
 YK> #include <inavr.h>
 YK> #include <iom128.h>

 YK> void f(void);

 YK> void f(void)
 YK> {
 YK>     PORTB_PORTB7 = 1;
 YK>     if(PORTB_PORTB5 == 0)
 YK>         SPCR_Bit0 = 1;
 YK> }
 YK> ==============================

    Так не интересно. Ты весь исходник покажи, чтобы его можно было во-первых,
скомпилировать, а во-вторых, убедиться, что этот код компилятор сгенерил без
подскахок со стороны. А то с ассемблерными-то вставками я сколько угодно
оптимальный код сгенерить смогу... :)

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Если ты коп, почему я весь взмок?

Site Timeline