Решено Программисты C нужна помощь...

  • Автор темы Васисуалий
В

Васисуалий

Команда форума
  • 19 Янв 2013
Только не пинайте сильно, в Си я не силен, точнее ваАще никак. Все, что писАл раньше исключительно на голом асме, но тут надо.

Короче есть проблема: подключил устройство к разным портам проца (разводка ног портов просто убийственная - выкручиваюсь) Инициализировал порты, все гут. Теперь надо отправлять на ноги сигнал, т.е. надо байт раскидать по битам разных портов по возможности не трогая остальные данные. Думаю вопрос банальный и давно решенный и есть красивые решения, но я запутался...
 
O

o_l_e_g

  • 20 Янв 2013
Васисуалий, А конкретней? Подозреваю городишь аналогию PLC на МК, так?
 

Информация Неисправность Прошивки Схемы Справочники Маркировка Корпуса Сокращения и аббревиатуры Частые вопросы Полезные ссылки

  • Справочная информация

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

    • Диагностика
    • Определение неисправности
    • Выбор метода ремонта
    • Поиск запчастей
    • Устранение дефекта
    • Настройка

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

  • Неисправности

    Все неисправности по их проявлению можно разделить на два вида - стабильные и периодические. Наиболее часто рассматриваются следующие:

    • не включается
    • не корректно работает какой-то узел (блок)
    • периодически (иногда) что-то происходит

    Если у Вас есть свой вопрос по определению дефекта, способу его устранения, либо поиску и замене запчастей, Вы должны создать свою, новую тему в соответствующем разделе.
  • О прошивках

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

    На сайте существуют разделы с прошивками (дампами памяти) для микросхем, либо для обновления ПО через интерфейсы типа USB.


    По вопросам прошивки Вы должны выбрать раздел для вашего типа аппарата, иначе ответ и сам файл Вы не получите, а тема будет удалена.
  • Схемы аппаратуры

    Начинающие ремонтники часто ищут принципиальные схемы, схемы соединений, пользовательские и сервисные инструкции. Это могут быть как отдельные платы (блоки питания, основные платы, панели), так и полные Service Manual-ы. На сайте они размещены в специально отведенных разделах и доступны к скачиванию гостям, либо после создания аккаунта:


    Внимательно читайте описание. Перед запросом схемы или прошивки произведите поиск по форуму, возможно она уже есть в архивах. Поиск доступен после создания аккаунта.
  • Справочники

    На сайте Вы можете скачать справочную литературу по электронным компонентам (справочники, таблицу аналогов, SMD-кодировку элементов, и тд.).


    Информация размещена в каталогах, файловых архивах, и отдельных темах, в зависимости от типов элементов.

  • Marking (маркировка) - обозначение на электронных компонентах

    Современная элементная база стремится к миниатюрным размерам. Места на корпусе для нанесения маркировки не хватает. Поэтому, производители их маркируют СМД-кодами.


  • Package (корпус) - вид корпуса электронного компонента

    При создании запросов в определении точного названия (партномера) компонента, необходимо указывать не только его маркировку, но и тип корпуса. Наиболее распостранены:

    • DIP (Dual In Package) – корпус с двухрядным расположением контактов для монтажа в отверстия
    • SOT-89 - пластковый корпус для поверхностного монтажа
    • SOT-23 - миниатюрный пластиковый корпус для поверхностного монтажа
    • TO-220 - тип корпуса для монтажа (пайки) в отверстия
    • SOP (SOIC, SO) - миниатюрные корпуса для поверхностного монтажа (SMD)
    • TSOP (Thin Small Outline Package) – тонкий корпус с уменьшенным расстоянием между выводами
    • BGA (Ball Grid Array) - корпус для монтажа выводов на шарики из припоя

  • Краткие сокращения

    При подаче информации, на форуме принято использование сокращений и аббревиатур, например:

      Сокращение   Краткое описание
    LEDLight Emitting Diode - Светодиод (Светоизлучающий диод)
    MOSFETMetal Oxide Semiconductor Field Effect Transistor - Полевой транзистор с МОП структурой затвора
    EEPROMElectrically Erasable Programmable Read-Only Memory - Электрически стираемая память
    eMMCembedded Multimedia Memory Card - Встроенная мультимедийная карта памяти
    LCDLiquid Crystal Display - Жидкокристаллический дисплей (экран)
    SCLSerial Clock - Шина интерфейса I2C для передачи тактового сигнала
    SDASerial Data - Шина интерфейса I2C для обмена данными
    ICSPIn-Circuit Serial Programming – Протокол для внутрисхемного последовательного программирования
    IIC, I2CInter-Integrated Circuit - Двухпроводный интерфейс обмена данными между микросхемами
    PCBPrinted Circuit Board - Печатная плата
    PWMPulse Width Modulation - Широтно-импульсная модуляция
    SPISerial Peripheral Interface Protocol - Протокол последовательного периферийного интерфейса
    USBUniversal Serial Bus - Универсальная последовательная шина
    DMADirect Memory Access - Модуль для считывания и записи RAM без задействования процессора
    ACAlternating Current - Переменный ток
    DCDirect Current - Постоянный ток
    FMFrequency Modulation - Частотная модуляция (ЧМ)
    AFCAutomatic Frequency Control - Автоматическое управление частотой

  • Частые вопросы

    Как мне дополнить свой вопрос по теме Программисты C нужна помощь...?

    После регистрации аккаунта на сайте Вы сможете опубликовать свой вопрос или отвечать в существующих темах. Участие абсолютно бесплатное.

    Кто отвечает в форуме на вопросы ?

    Ответ в тему Программисты C нужна помощь... как и все другие советы публикуются всем сообществом. Большинство участников это профессиональные мастера по ремонту и специалисты в области электроники.

    Как найти нужную информацию по форуму ?

    Возможность поиска по всему сайту и файловому архиву появится после регистрации. В верхнем правом углу будет отображаться форма поиска по сайту.

    По каким еще маркам можно спросить ?

    По любым. Наиболее частые ответы по популярным брэндам - LG, Samsung, Philips, Toshiba, Sony, Panasonic, Xiaomi, Sharp, JVC, DEXP, TCL, Hisense, и многие другие в том числе китайские модели.

    Какие еще файлы я смогу здесь скачать ?

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


  • Здесь просто полезные ссылки для мастеров. Ссылки периодически обновляемые, в зависимости от востребованности тем.



В

Васисуалий

Команда форума
  • 20 Янв 2013
STM32F4xx на Discovery + классика WH1602. В принципе имеем целую кучу шестнадцатиразрядных портов, но эти разрабоДчеГи (я всегда недолюбливал схемотехников от Томсона) умудрились развести устройства на плате так, что не осталось ни одного чистого порта, плюс к этому сам чип разведен внутри против всякой логики. Если не лень, глянь шит, сильно удивишся как у него порты расположены :shocked: Короче я просто прилепил ноги индикатора туда, куда пришлось. Теперь есть задача - индикатору пофиг, он хочет видеть свои байты целиком, и ему пох, откуда они берутся. Мне тоже в конечном итоге все равно, через какие дыры в чипе они пролезут, значит надо взять один байт, и пропихать его через ноги нескольких портов не затронув установленные данные на остальных битах.

В принципе я могу наворотить всяких там дефов одного другому, но думаю, что проблема решалась миллионы раз и еще когда я пешком под стол ходил и на этот случай есть красивое решение...
 
O

o_l_e_g

  • 20 Янв 2013
Васисуалий, Вроде, в четырехбитном режиме можно засунуть на один GPIO, одним ниблом? Если что, смотри библиотеки Булевой алгебры.
 
В

Васисуалий

Команда форума
  • 20 Янв 2013
Индикатор ожил, но код, мягко говоря полное гуано...

Короче вопрос в силе. Расскажите, кто знает, как это делают по взрослому... :pray:
 
O

o_l_e_g

  • 20 Янв 2013
Васисуалий,  ссылка скрыта от гостей  Может поможет?
 
K

Konstantin_18

  • 20 Янв 2013
Васисуалий, понятно что вы хотите "union" , но вот как записать сразу не скажу. Особенно если одинаковые (по весу) биты в разных портах. А что маленькая процедурка (ложим байт - дрыгаем битами ) - это не кошерно ?
ПС. Кстати даже если суперэлегантно записать получится, то совсем не факт, что потом компилятор это подпрограммой не оформит. Так стОит ли изобретать ?
 
В

Васисуалий

Команда форума
  • 20 Янв 2013
Блин, захекался искать! Перерыл весь тырнет, просмотрел кучу книг и интернет учебников по Си и нифига не нашел. :shocked: Неуже ли в таком замечательном и мощном языке как Си не нашлось места для конструкции аналога:

BTFSS (бит_тест_из_стейт)

или

BTFSC (из_клир)

Не верю! :shocked:
 
K

Konstantin_18

  • 20 Янв 2013
Васисуалий,
PORTA = PORTA & 0xFE - clear bit.
PORTA = PORTA I 0x01 - set bit.
if (PORTA & 0x01) - test bit
Я понимаю, что синтаксис скорее от БЭЙСИКА, но компилер сделает из него именно то о чем ты пишешь.

Более СИ-шно :p
PORTA &= 0xFE
PORTA |= 0x01
:)

Я думал ты хочешь описать переменную, типа слово-2-байта,
которая бы логически соответствовала 16 битному порту,
причем физические биты этого порта были бы разбросаны по РАЗНЫМ битам РАЗНЫХ физических портов.
Т.е. пишем IDEPORT = 0xABCD и оно САМО по 16 ногам нужные биты разбросало.
ПС. Размерность приведена для примера.
 
В

Васисуалий

Команда форума
  • 20 Янв 2013
Ну в принципе победил, индикатор работает. Правда накодил гору говнокода...

Вывод в порт для STM32 почему то выглядит так :

GPIOB->BSRRL = 0x30; // устанавливаем биты 4 и 5 порта GPIOB в 1
GPIOB->BSRRH = 0x30; // сбрасываем биты 4 и 5 порта GPIOB в 0

Это работает.

Дальше возникает проблема...

Я нигде не нашел простого теста стоячести бита в байте по типу комманды BTFSS или нестоячести BTFSC (асм для пиков)

Поэтому я сделал это по типу операции на гландах через опу...

Я прошелся по байту маской с одним установленным битом:
Код:
void Write_indicator(simbol)
{
 mask = 1;  // тест бита 0
  test_simbol = simbol & mask;
     if (test_simbol != 0)
         {
	         GPIOE->BSRRL = 0x08;
         }

     mask = 2;  // тест бита 1
       test_simbol = simbol & mask;
          if (test_simbol != 0)
              {
   	         GPIOE->BSRRL = 0x10;
              }
          mask = 4;  // тест бита 2
            test_simbol = simbol & mask;
               if (test_simbol != 0)
                   {
        	         GPIOB->BSRRL = 0x100;
                   }

               mask = 8;  // тест бита 3
                 test_simbol = simbol & mask;
                    if (test_simbol != 0)
                        {
             	         GPIOB->BSRRL = 0x80;
                        }
                    mask = 16;  // тест бита 4
                      test_simbol = simbol & mask;
                         if (test_simbol != 0)
                             {
                  	         GPIOB->BSRRL = 0x20;
                             }

                         mask = 32;  // тест бита 5
                           test_simbol = simbol & mask;
                              if (test_simbol != 0)
                                  {
                       	         GPIOB->BSRRL = 0x10;
                                  }
                              mask = 64;  // тест бита 6
                                test_simbol = simbol & mask;
                                   if (test_simbol != 0)
                                       {
                            	         GPIOD->BSRRL = 0x80;
                                       }

                                   mask = 128;  // тест бита 7
                                     test_simbol = simbol & mask;
                                        if (test_simbol != 0)
                                            {
                                 	         GPIOD->BSRRL = 0x40;
                                            }
GPIOC->BSRRL = 0x2000;       // переключаем индикатор на вывод инфы на экран
Enable_Pulse();              // записываем данные в индикатор
Clear_Ind_Port();            // убираем мусор (в смысле чистим порт в 0)
}
Получилось работоспособно но как то грубо и неприкольно...

Надо искать выход, думаю он есть! :stopud:
 
K

Konstantin_18

  • 20 Янв 2013
А если не плодить переменные и вместо:
"
{
mask = 1; // тест бита 0
test_simbol = simbol & mask;
if (test_simbol != 0)
{
"
написать
if (simbol & 1) {

???
 
В

Васисуалий

Команда форума
  • 20 Янв 2013
Да! Уже сообразил и исправил :gigi:

void Write_indicator(simbol)
{
mask = 1; // тест бита 0
if ((simbol & mask) != 0)
{
GPIOE->BSRRL = 0x08;
}
mask = 2; // тест бита 1
if ((simbol & mask) != 0)
{
GPIOE->BSRRL = 0x10;
}
mask = 4; // тест бита 2
if ((simbol & mask) != 0)

Добавлено 20-01-2013 22:47

Счас уберу и вторую переменную...
 
K

Konstantin_18

  • 20 Янв 2013
Переменная mask тоже не нужна,
как и запись "!=0"
условие if выполнится если значение в скобках ненулевое

т.е. пишем
if (simbol & 1)

Но это уже больше казуистика :)
 
В

Васисуалий

Команда форума
  • 20 Янв 2013
Ну вот теперь код выглядик как то логично...

Даже немного эротично :lol:

 
K

Konstantin_18

  • 20 Янв 2013
А вот у меня еще вопрос. Это биты в единичку ставятся, а в ноль что не надо ?

if (simbol & 1) { GPIOE->BSRRL = 0x08; } else { GPIOE->BSRRH = 0x08; }

??? :p

Программист ставит рядом собой всегда два стакана: один полный, второй пустой. :)

Чтобы движок пробелы не убирал есть тэг Code.
 
В

Васисуалий

Команда форума
  • 21 Янв 2013
Так прикол в том, что BSRRL ставит в единичку указанный бит, а BSRRН сбрасывает. Причем именно то, что мне и надо, т.е. прозрачно для других бит порта. А в лесинке я только устанавливаю биты, сбрасываются они в конце, после подачи сигнала En на индикатор. Я для этого сочинил отдельный Void

Вот эти строки:
Код:
void Write_indicator(simbol)
{
     if ((simbol & 1) != 0)
         {
	     GPIOE->BSRRL = 0x08;
         }
          if ((simbol & 2) != 0)
              {
   	          GPIOE->BSRRL = 0x10;
              }
               if ((simbol & 4) != 0)
                   {
        	       GPIOB->BSRRL = 0x100;
                   }
                    if ((simbol & 8) != 0)
                        {
             	        GPIOB->BSRRL = 0x80;
                        }
                         if ((simbol & 16) != 0)
                             {
                  	         GPIOB->BSRRL = 0x20;
                             }
                              if ((simbol & 32) != 0)
                                  {
                       	          GPIOB->BSRRL = 0x10;
                                  }
                                   if ((simbol & 64) != 0)
                                       {
                            	       GPIOD->BSRRL = 0x80;
                                       }
                                        if ((simbol & 128) != 0)
                                            {
                                 	        GPIOD->BSRRL = 0x40;
                                            }

GPIOC->BSRRL = 0x2000;       // переключаем индикатор на вывод инфы на экран
Enable_Pulse();              // записываем данные в индикатор
Clear_Ind_Port();            // убираем мусор (в смысле чистим порт в 0)
}

К стати в этих войдах тоже такой бардель, надо почистить... :)

Спасибо за тэг, никогда его не пользовал...
 
K

Konstantin_18

  • 21 Янв 2013
Васисуалий, При первом вызове твоей процедуры биты в ноли КТО посбрасывает :mad: ?
У тебя же они в ее КОНЦЕ сбрасываются.

Я ж пишу :

if (simbol & 1) { GPIOE->BSRRL = 0x08; } else { GPIOE->BSRRH = 0x08; }

и НИЧЕГО в конце сбрасывать не нужно!

Добавлено 20-01-2013 22:17

символы " !=0 " тоже не нужны, если это АНСИшный СИ.

Добавлено 20-01-2013 22:17

ПС. Ты как-бы через строку читаешь.
 
В

Васисуалий

Команда форума
  • 21 Янв 2013
Дык процедура инициализации индикатора там впереди есть! Она порт чистым оставит...

Вот продолжаю причесывать и дописывать управление индикатором...

 
K

Konstantin_18

  • 21 Янв 2013
Так борьба ж за краткость, и как следствие - надежность.
Больше кода - больше ошибок!
 
В

Васисуалий

Команда форума
  • 21 Янв 2013
Konstantin_18 сказал(а):
борьба за краткость, и как следствие - надежность!

Я еще бы сказал за понятность кода! Часто приходится вспоминать программки, которые писАл год и даже десять лет назад. Чем оно красивше написано, тем потом легче. Вот этот индикатор с этим STMом мне сегодня и нафиг не сдался - я просто балуюсь, но отлажу и положу себе готовый наборчик кодов для работы с индикатором, может оформлю в отдельный "инклюдик" и пусть будет... ;) :) :beer:

Добавлено 21-01-2013 00:08

А вот, к стати, как сам компилятор представил мое творение на асме:

Код:
 35            if (simbol & 1)
08000548:   ldr r3, [r7, #4]
0800054a:   and.w r3, r3, #1
0800054e:   uxtb r3, r3
08000550:   cmp r3, #0
08000552:   beq.n 0x8000562 <Write_indicator+34>
 37       	     GPIOE->BSRRL = 0x08;
08000554:   mov.w r3, #4096 ; 0x1000
08000558:   movt r3, #16386 ; 0x4002
0800055c:   mov.w r2, #8
08000560:   strh r2, [r3, #24]

для куска :

Код:
if (simbol & 1)
         {
	     GPIOE->BSRRL = 0x08;
         }
 
R

rommy

  • 21 Янв 2013
Может в МК перекинуть тему?Тут она быстро потеряется.
 
I

INT1

  • 21 Янв 2013
Есть док
 ссылка скрыта от гостей 
правда, он заточен под IAR AVR, но может что полезного найдешь.
 
В

Васисуалий

Команда форума
  • 21 Янв 2013
Ну в принципе вопрос решен. Код мне уже нравится.
 
R

Rаmil

  • 11 Сен 2014
Тема дааааавно решена, но я только что увидел
и могу предложить вот такой код, может кому и пригодится.

Код:
const short gpio_val[8] = {0x08,0x10,0x100,0x80,0x20,0x10,0x80,0x40};
short BSRRL;

void Write(char symbol)
{
   short tmp = 1;
   char i = 0;
   for(; i < 9; i++)
    {
      if(symbol&tmp)
       {
         BSRRL = gpio_val[i];
         break;
       }
     tmp = tmp<<1;
    }
}

поправил немного
 
S

slav0n

  • 11 Сен 2014
Код:
void Write(char symbol)
	{
		short *p = gpio_val;
		while(symbol)
		{
			if(symbol & 1)BSRRL = *p;
			p++;
			symbol  >>= 1;
		}
	}
 

Верх Низ