Очередная дискавери. Уже хачу!

ARM7, ARM9, ARM11 etc.

Re: Очередная дискавери. Уже хачу!

Сообщение Dmitry__ » 05 дек 2012, 00:35

elmot писал(а):а если оптимизацию включить?

Все, меньше чем привел выше - нельзя, это из-за того что арм не умеет работать с битами...
elmot писал(а):В то же время - рассматриваемый код - это все-таки Std Periph Lib.

Да, некорректно сослался :oops:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Очередная дискавери. Уже хачу!

Сообщение dccharacter » 05 дек 2012, 00:38

GPIOB->BSRR |= 0x00000001;

А зачем |= ?????
Просто = !!!!

Там первые 16 бит - сетят, вторые ресетят!
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Очередная дискавери. Уже хачу!

Сообщение Dmitry__ » 05 дек 2012, 00:49

dccharacter писал(а):А тут (я не понимаю):

фигасссе, это кто так компилит?
Вообще, система команд ARM слишком хитрая для компиляторов, IAR жестко это делает. Скорее всего, компилятором еще предстоит научиться нормально кодить.
Вот супер-пупер красивый пример на асм , что может система команд ARM:
Код: Выделить всё
;Cortex-M3/M4F Instruction Set

CMP R0, #9              ; Convert R0 hex value (0 to 15) into ASCII
                        ; ('0'-'9', 'A'-'F').
ITE GT                  ; Next 2 instructions are conditional.
ADDGT R1, R0, #55       ; Convert 0xA -> 'A'.
ADDLE R1, R0, #48       ; Convert 0x0 -> '0'.
Последний раз редактировалось Dmitry__ 05 дек 2012, 00:52, всего редактировалось 1 раз.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Очередная дискавери. Уже хачу!

Сообщение dccharacter » 05 дек 2012, 00:51

CoIDE

Добавлено спустя 26 секунд:
т.е. GNU ARM 4.6

Добавлено спустя 1 минуту 2 секунды:
Ты объясни, нафига ты |= делаешь? BSRR и ODR - спец регистры. Один битбангит, второй тогглит. Не нужно там |=
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Очередная дискавери. Уже хачу!

Сообщение elmot » 05 дек 2012, 01:03

есть у меня легкое подозрение, что битбанг - это деятельность stm поверх ядра арм. Поэтому компилер этого напрочь не умеет.
dccharacter, оптимизацию включи
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Очередная дискавери. Уже хачу!

Сообщение dccharacter » 05 дек 2012, 01:09

23 GPIO_SetBits(GPIOC, GPIO_Pin_9);
08000a8c: mov.w r0, #4096 ; 0x1000
08000a92: movt r0, #16385 ; 0x4001
08000a96: mov.w r1, #512 ; 0x200
08000a9a: bl 0x8000a44 <GPIO_SetBits>
08000a9e: ldr r6, [pc, #172] ; (0x8000b4c <main+256>)
08000aa0: ldr.w r8, [pc, #176] ; 0x8000b54 <main+264>
08000aa4: ldrb r3, [r4, #0]
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Очередная дискавери. Уже хачу!

Сообщение Dmitry__ » 05 дек 2012, 01:17

dccharacter писал(а):Ты объясни, нафига ты |= делаешь? BSRR и ODR - спец регистры.

Лаханулси, работал как с выходным регистром, |= -чтоб не трогать другие биты.

Сухой остаток:
Код: Выделить всё
GPIOB->BSRR = 0x00000001;
    0x80001e6: 0x4827         LDR.N     R0, ??DataTable3_3      ; GPIOB_BSRR.BR0
    0x80001e8: 0x2101         MOVS      R1, #1
    0x80001ea: 0x6001         STR       R1, [R0]
??DataTable3_3:
    DC32     0x48000418

arm: 10 байт 4 такта, на 72 мгц 55 нс.
PIC33 3 байта 1 такт, на 40 мгц 50 нс. :)

Добавлено спустя 2 минуты 9 секунд:
elmot писал(а):есть у меня легкое подозрение, что битбанг - это деятельность stm поверх ядра арм. Поэтому компилер этого напрочь не умеет.

Не, это ядро, arm так пытается допилить свой проц до ембеддед приложений :)
http://www.gaw.ru/html.cgi/txt/doc/micr ... /2_3_7.htm
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Очередная дискавери. Уже хачу!

Сообщение dccharacter » 05 дек 2012, 01:19

На PIC33 наверное тоже лоханулся :-))) Если посидишь еще - до четырех тактов доведешь и все будет ОК. Я думаю, я могу тактов 20 с первой попытки сделать, у меня талант
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Очередная дискавери. Уже хачу!

Сообщение Dmitry__ » 05 дек 2012, 01:46

Ага, щазз

BSET f,#bit4 1 слово, 1 такт :)

Добавлено спустя 19 минут 2 секунды:
dccharacter писал(а): BSRR и ODR - спец регистры. Один битбангит, второй тогглит. Не нужно там |=

А где это ODR - спец регистр? Запаришься его тогглить :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Очередная дискавери. Уже хачу!

Сообщение dccharacter » 05 дек 2012, 02:21

ну теперь я глюканул...
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Очередная дискавери. Уже хачу!

Сообщение Duhas » 05 дек 2012, 10:54

я что-то упустил или хливар 8 бит против 16 и более давно закончился в виде - нужно дрыгать ногами - берем авр/пик/нек 8мибитку, нужно что то считать и неспешно опрашивать датчики и прочее - берем многобитный быстрый камень и быдлокодим ?

само страшное - между этими вариантами.
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Очередная дискавери. Уже хачу!

Сообщение GlassEagle » 05 дек 2012, 22:27

elmot писал(а):при правильно заданных опциях ассерт превращается в ничто.

Эх, списочек бы ещё правильных опций, ..., для начинающих с STM32 ... Или ссылку на то место, откуда их берут.
Когда я слышу слова "Первый закон робототехники", я вспоминаю анекдот про ноусэров.
GlassEagle
 
Сообщения: 160
Зарегистрирован: 14 окт 2009, 11:46
Откуда: Самара

Re: Очередная дискавери. Уже хачу!

Сообщение NeON79 » 16 дек 2012, 15:32

http://www.kosmodrom.ua/el.php?name=STM32F3DISCOVERY
УРА! Появилась на складе! Заказал.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили “Титаник“
2:5020/2140.1979@fidonet
Аватара пользователя
NeON79
 
Сообщения: 536
Зарегистрирован: 09 май 2011, 16:43
Откуда: Украина, Киев
прог. языки: Нецензурный
ФИО: Евгений НеОН

Re: Очередная дискавери. Уже хачу!

Сообщение Dmitry__ » 24 дек 2012, 23:47

Кто-нибудь смог понять этот загибон?
Ни по формулам, ни по миганию светодиодов не понял, что стмовцы хотели написать.
Наверно должен был быть компас не зависящий от положения в горизонте...
Код: Выделить всё
      /* Read Compass data */
      Demo_CompassReadMag(MagBuffer);
      Demo_CompassReadAcc(AccBuffer);
     
      for(i=0;i<3;i++)
        AccBuffer[i] /= 100.0f;
     
      fNormAcc = sqrt((AccBuffer[0]*AccBuffer[0])+(AccBuffer[1]*AccBuffer[1])+(AccBuffer[2]*AccBuffer[2]));
     
      fSinRoll = -AccBuffer[1]/fNormAcc;
      fCosRoll = sqrt(1.0-(fSinRoll * fSinRoll));
      fSinPitch = AccBuffer[0]/fNormAcc;
      fCosPitch = sqrt(1.0-(fSinPitch * fSinPitch));
     if ( fSinRoll >0)
     {
       if (fCosRoll>0)
       {
         RollAng = acos(fCosRoll)*180/PI;
       }
       else
       {
         RollAng = acos(fCosRoll)*180/PI + 180;
       }
     }
     else
     {
       if (fCosRoll>0)
       {
         RollAng = acos(fCosRoll)*180/PI + 360;
       }
       else
       {
         RollAng = acos(fCosRoll)*180/PI + 180;
       }
     }
     
      if ( fSinPitch >0)
     {
       if (fCosPitch>0)
       {
            PitchAng = acos(fCosPitch)*180/PI;
       }
       else
       {
          PitchAng = acos(fCosPitch)*180/PI + 180;
       }
     }
     else
     {
       if (fCosPitch>0)
       {
            PitchAng = acos(fCosPitch)*180/PI + 360;
       }
       else
       {
          PitchAng = acos(fCosPitch)*180/PI + 180;
       }
     }

      if (RollAng >=360)
      {
        RollAng = RollAng - 360;
      }
     
      if (PitchAng >=360)
      {
        PitchAng = PitchAng - 360;
      }
     
      fTiltedX = MagBuffer[0]*fCosPitch+MagBuffer[2]*fSinPitch;
      fTiltedY = MagBuffer[0]*fSinRoll*fSinPitch+MagBuffer[1]*fCosRoll-MagBuffer[1]*fSinRoll*fCosPitch;
     
      HeadingValue = (float) ((atan2f((float)fTiltedY,(float)fTiltedX))*180)/PI;

      if (HeadingValue < 0)
      {
        HeadingValue = HeadingValue + 360;   
      }
     
      if ((RollAng <= 40.0f) && (PitchAng <= 40.0f))
      {
        if (((HeadingValue < 25.0f)&&(HeadingValue >= 0.0f))||((HeadingValue >=340.0f)&&(HeadingValue <= 360.0f)))
        {
          STM_EVAL_LEDOn(LED10);
          STM_EVAL_LEDOff(LED3);
          STM_EVAL_LEDOff(LED6);
          STM_EVAL_LEDOff(LED7);
          STM_EVAL_LEDOff(LED4);
          STM_EVAL_LEDOff(LED8);
          STM_EVAL_LEDOff(LED9);
          STM_EVAL_LEDOff(LED5);
        }
        else  if ((HeadingValue <70.0f)&&(HeadingValue >= 25.0f))
        {
          STM_EVAL_LEDOn(LED9);
          STM_EVAL_LEDOff(LED6);
          STM_EVAL_LEDOff(LED10);
          STM_EVAL_LEDOff(LED3);
          STM_EVAL_LEDOff(LED8);
          STM_EVAL_LEDOff(LED5);
          STM_EVAL_LEDOff(LED4);
          STM_EVAL_LEDOff(LED7);
        }
        else  if ((HeadingValue < 115.0f)&&(HeadingValue >= 70.0f))
        {
          STM_EVAL_LEDOn(LED7);
          STM_EVAL_LEDOff(LED3);
          STM_EVAL_LEDOff(LED4);
          STM_EVAL_LEDOff(LED9);
          STM_EVAL_LEDOff(LED10);
          STM_EVAL_LEDOff(LED8);
          STM_EVAL_LEDOff(LED6);
          STM_EVAL_LEDOff(LED5);
        }
        else  if ((HeadingValue <160.0f)&&(HeadingValue >= 115.0f))
        {
          STM_EVAL_LEDOn(LED5);
          STM_EVAL_LEDOff(LED6);
          STM_EVAL_LEDOff(LED10);
          STM_EVAL_LEDOff(LED8);
          STM_EVAL_LEDOff(LED9);
          STM_EVAL_LEDOff(LED7);
          STM_EVAL_LEDOff(LED4);
          STM_EVAL_LEDOff(LED3);
        }
        else  if ((HeadingValue <205.0f)&&(HeadingValue >= 160.0f))
        {
          STM_EVAL_LEDOn(LED3);
          STM_EVAL_LEDOff(LED6);
          STM_EVAL_LEDOff(LED4);
          STM_EVAL_LEDOff(LED8);
          STM_EVAL_LEDOff(LED9);
          STM_EVAL_LEDOff(LED5);
          STM_EVAL_LEDOff(LED10);
          STM_EVAL_LEDOff(LED7);
        }
        else  if ((HeadingValue <250.0f)&&(HeadingValue >= 205.0f))
        {
          STM_EVAL_LEDOn(LED4);
          STM_EVAL_LEDOff(LED6);
          STM_EVAL_LEDOff(LED10);
          STM_EVAL_LEDOff(LED8);
          STM_EVAL_LEDOff(LED9);
          STM_EVAL_LEDOff(LED5);
          STM_EVAL_LEDOff(LED3);
          STM_EVAL_LEDOff(LED7);
        }
        else  if ((HeadingValue < 295.0f)&&(HeadingValue >= 250.0f))
        {
          STM_EVAL_LEDOn(LED6);
          STM_EVAL_LEDOff(LED9);
          STM_EVAL_LEDOff(LED10);
          STM_EVAL_LEDOff(LED8);
          STM_EVAL_LEDOff(LED3);
          STM_EVAL_LEDOff(LED5);
          STM_EVAL_LEDOff(LED4);
          STM_EVAL_LEDOff(LED7);
        }       
        else  if ((HeadingValue < 340.0f)&&(HeadingValue >= 295.0f))
        {
          STM_EVAL_LEDOn(LED8);
          STM_EVAL_LEDOff(LED6);
          STM_EVAL_LEDOff(LED10);
          STM_EVAL_LEDOff(LED7);
          STM_EVAL_LEDOff(LED9);
          STM_EVAL_LEDOff(LED3);
          STM_EVAL_LEDOff(LED4);
          STM_EVAL_LEDOff(LED5);
        }
      }
      else
      {
        /* Toggle All LEDs */
        STM_EVAL_LEDToggle(LED7);
        STM_EVAL_LEDToggle(LED6);
        STM_EVAL_LEDToggle(LED10);
        STM_EVAL_LEDToggle(LED8);
        STM_EVAL_LEDToggle(LED9);
        STM_EVAL_LEDToggle(LED3);
        STM_EVAL_LEDToggle(LED4);
        STM_EVAL_LEDToggle(LED5);
        /* Delay 50ms */
        Delay(5);
      }



Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Очередная дискавери. Уже хачу!

Сообщение dccharacter » 24 дек 2012, 23:55

круто
код не читал, но идея такая: у тебя есть направление на север, но ты не знаешь, как ты спозиционирован по отношению к планете. Ты это пытаешься вычислить.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Пред.След.

Вернуться в ARM

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 10