Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » RA » Повышающий преобразователь. stm8s.


Повышающий преобразователь. stm8s.

Сообщений 1 страница 30 из 43

1

http://s3.uploads.ru/t/BVxSw.png
питание от аккумулятора литий-ион. от 2,5 В до 4,2 В. Шим подается на Q6. без драйверов. Прекрасно работает. Еще бы выход осцилом глянуть. Но нема.
Вопрос касабельно выхода преобразователя. Что -там? Вольтметр показывает 5,05 ну и скачет чуть на сотых вольта. Временами и десятые скакнут. Чуть чуть...
ШИМ в лоб.

Код:
  for(;;)
  {
    PIN_PWM = 1;
    asm("NOP");
    PIN_PWM = 0;
    asm("NOP");
    asm("NOP");
    asm("NOP");
  }

Отредактировано RA (2018-05-06 00:35:33)

2

Перевел ШИМ из "в лоб" на таймер. Работает. Мк не дохнет. Буду считать, что на выходе то, что вижу вольтметром... Шучу... Буду мониторить ацп и Analog Watchdog. Аккумулятору будет ограничение... 3,0 - 4,2 вольта... 1мкС выборка.... Целый МегаГерщище. :) ШИМ 1,5Мгц. Иголки не увижу увидел, и заряд разряд ак. будет как на ладони... + время надо... мля...

Отредактировано RA (2018-05-08 01:05:18)

3

Возникли трудности в отладке. Опрашиваю ацп по нескольким каналам. по одному из каналов бред. результат в регистрах ацп один, а забираю другой.  :angry: http://s5.uploads.ru/t/gZVJn.png
где в iar посмотреть как компилятор расположил union?

Отредактировано RA (2018-05-08 15:20:55)

4

Ни к чему мои потуги с union не привели. В регистрах одно значение, забирается другое. Сделал проще. Классически так сказать.

Код:
/*..............................................................................*/
/*..............................................................................*/
/*..............................................................................*/
#pragma vector = ADC1_EOC_vector
/*..............................................................................*/
/*..............................................................................*/
/*..............................................................................*/
__interrupt void ADC1_EOC_handler(void)
{
  if (( ADC_CSR_bit.EOC == 1 ) && ( ADC_CSR_bit.EOCIE == 1 ))//если преобразование завршено и прерывание разрешенно
  {
    ADC_CSR_bit.EOC = 0;
    switch( ADC_CSR_bit.CH )
    {
    case channal_2:
      vdd = ADC_DRH<<8;
      vdd = ADC_DRL;
      vdd = vdd*2;
      ADC_CSR_bit.CH = channal_5;
      break;
      case channal_5:
        vhodnoe = ADC_DRH<<8;
        vhodnoe = ADC_DRL;
        vhodnoe = vhodnoe*2;
        ADC_CSR_bit.CH = channal_6;
        break;
        case channal_6:
          opornoe = ADC_DRH<<8;
          opornoe = ADC_DRL;
          ADC_CSR_bit.CH = channal_2;
          break;
    }
  ADC_CR1_bit.ADON = 1;//запускаю преобразование
  }
}

Ошибочка есть в этом коде. Для тех "шарит" она видна сразу. |=

Отредактировано RA (2018-05-09 21:42:48)

5

Зная опорное( в вольтах ) и имея замер( показания ацп ) опорного, можно получить напряжение питания мк, один канал освобождается. а с учетом аппаратного деления можно хоть float-ми считать.

Код:
Vdd=(1023*1.2)/(float)(read_ad());

Отредактировано RA (2018-05-14 00:14:07)

6

есть вот такое...

Код:
unsigned int read_ad(){
  unsigned int buff=0;
  unsigned int buf0=0;
  unsigned int buf1=0;
  unsigned int buf2=0;
  unsigned int buf3=0;
  unsigned int buf4=0;
  unsigned int buf5=0;
  unsigned int buf6=0;
  unsigned int buf7=0;
  unsigned int buf8=0;
  unsigned int buf9=0;
  buf0 = ADC_DB0RH<<8;
  buf0 = buf0 + ADC_DB0RL;
  buf1 = ADC_DB1RH<<8;
  buf1 = buf1 + ADC_DB1RL;
  buf2 = ADC_DB2RH<<8;
  buf2 = buf2 + ADC_DB2RL;
  buf3 = ADC_DB3RH<<8;
  buf3 = buf3 + ADC_DB3RL;
  buf4 = ADC_DB4RH<<8;
  buf4 = buf4 + ADC_DB4RL;
  buf5 = ADC_DB5RH<<8;
  buf5 = buf5 + ADC_DB5RL;
  buf6 = ADC_DB6RH<<8;
  buf6 = buf6 + ADC_DB6RL;
  buf7 = ADC_DB7RH<<8;
  buf7 = buf7 + ADC_DB7RL;
  buf8 = ADC_DB8RH<<8;
  buf8 = buf8 + ADC_DB8RL;
  buf9 = ADC_DB9RH<<8;
  buf9 = buf9 + ADC_DB9RL;
  buff = (buf0+buf1+buf2+buf3+buf4+buf5+buf6+buf7+buf8+buf9)/10;
  return buff;
}

как поизящней забрать сумму 10-ти буферов и разделить на 10? знаю можно с двумя переменными, но это - все не то.

7

Выравнивание результата ацп сделал левым, откинул два младших бита. получил ...

Код:
unsigned int read_ad(){
  unsigned int buff;
  buff = ADC_DB0RH;
  buff = buff+ADC_DB1RH;
  buff = buff+ADC_DB2RH;
  buff = buff+ADC_DB3RH;
  buff = buff+ADC_DB4RH;
  buff = buff+ADC_DB5RH;
  buff = buff+ADC_DB6RH;
  buff = buff+ADC_DB7RH;
  buff = buff+ADC_DB8RH;
  buff = buff+ADC_DB9RH;
  buff = buff/10;
  return buff;
}

пока лучше и быстрее не получилось.
обнаружение подключенного усб и контроль заряда весь ушел прерывание.

Код:
#define Vop 1.2 // ОПОРНОЕ НАПРИЖЕНИЕ ПО 6 КАНАЛУ В ВОЛЬТАХ 
#define channal_2 2    ///выход преобразователя. (при не активном режиме работы ШИМ - входное минус падение на катушке и диоде.)
#define channal_3 3 //переменник. 4,7 кОм.
#define channal_5 5 //входное
#define channal_6 6    /// опорник 
#define max_l 100 // максимальное значение в см.
#define w_ad 255 // разрядность ацп 8бит 255 10бит 1023
#define V_lion_h 4.1
#define V_lion_nom 3.9
/*..............................................................................*/
/*..............................................................................*/
/*..............................................................................*/
#pragma vector = ADC1_EOC_vector
/*..............................................................................*/
/*..............................................................................*/
/*..............................................................................*/
__interrupt void ADC1_EOC_handler(void)
{
  if (( ADC_CSR_bit.EOC == 1 ) && ( ADC_CSR_bit.EOCIE == 1 ))//если преобразование завршено и прерывание разрешенно
  {
    ADC_CR1_bit.ADON = 0;
    switch( ADC_CSR_bit.CH ){
    case channal_2:
      out=(Vdd/w_ad)*(float)(read_ad())*2;
      ADC_CSR_bit.CH = channal_3;
      break;
    case channal_3:
      res = read_ad();
      l=(float)(res)*max_l/w_ad;
      ADC_CSR_bit.CH = channal_5;
      break;
    case channal_5:
      in=(Vdd/w_ad)*(float)(read_ad())*2;
      if( PIN_USB == 1 ){
        if( in < V_lion_nom ){
          led_green = 1;
          led_blue = 0;
          USB_SWITCH = 0;//заряд идет
        } 
        if( in > V_lion_h ){ 
          led_green = 0;
          led_blue = 0;
          USB_SWITCH = 1;//заряд выкл
        }
      }
      if( PIN_USB == 0 ){
        if( in > V_lion_nom ){
          led_green = 0;
          led_blue = 0;
        }
        else{
          led_green = 0;
          led_blue = 1;
        }
      }
      ADC_CSR_bit.CH = channal_6;
      break;
    case channal_6:
      Vdd=(w_ad*Vop)/(float)(read_ad());
      ADC_CSR_bit.CH = channal_2;
      break; 
    }
    ADC_CSR_bit.EOC = 0;
    ADC_CR1_bit.ADON = 1;
    ADC_CR1_bit.ADON = 1;
  }
}

теперь переезд на КАЗ, придется  буферизацию выключать.

Отредактировано RA (2018-05-16 21:37:07)

8

КАЗ это интересно... но на него можно повесить только уход в ожидающий режим, либо полный стоп при разряде аккумулятора ниже 3 вольт.
Горит транзюк шима. Скорее всего драйвера не хватает мозгов не хватает, а его на питание 3-5В нет доступных. Попробую другой транзюк подобрать, что-то типо IRLML6244. Может он будет нормально открываться закрываться при питании от 3-5В. + попробовать резюк небольшой поставить последовательно с индуктивностью, а на диод забирать с индуктивности. КПД упадет, да и ... с ним.
float-ми считать на нем нет резона, при опросе трех каналов на максимальной частоте ацп, в цикл мэйна не попадаю, естественно после запуска ацп.

Отредактировано RA (2018-05-27 18:04:15)

9

RA написал(а):

Горит транзюк шима.

Отредактировано RA (Сегодня 16:04:15)

ПАтамушто :)  логический ноль - это не ноль вольт.  :tomato: У меня на этом пине  o.O  Лог 0 = 3В при питании 4,8В(по документации макс. 2В). Это нормально?(использую переопределение пинов таймера, но это не должно влиять на гпио. но даже при не запущеном таймере с инициализацией пина, лог ноль равен 3В. на других пинах лог 0 ~ 0.2В)
Как же долго доходило... жираф, мля. Пострадали 6 мосфитов. Хорошо, что по-мАщнее не поставил.
Без переделки платы не обойтись.
Подскажите какие биполярники использовать для драйвера при питании от 3 вольт. Или драйвер с низковольтным питанием? Может биполярник использовать в ключевом режиме. Какой?

Отредактировано RA (2018-05-29 15:32:33)

10

Полный улет. Моя не внимательность. Продали другие транзисторы. irlml6244 имеет код начинающийся с S http://sg.uploads.ru/t/YHKpB.png
А то, что мне продали, под видом 6244, имеет код BLD что-то там. Что это не знаю.(возможно http://www.el-component.com/bipolar-tra … ktc8550s-d) Указал бы продована, да смысла нет... Буду теперь все проверять прямо в магазине.

Отредактировано RA (2018-05-29 18:26:35)

11

Поменял мосфит. И...
Ура товарищи! Заработало! Как наглядны теперь зависимости заполнения ШИМ от нагрузки, от используемой индуктивности, и т.д. и т.п.
Теперь с float надо перейти на целочисленный тип. Чтобы циклу в main-е дать выполнить 10-ок команд.

12

Код:
#include "iostm8s103f3.h"
/*..............................................................................*/
/*..............................ПИНЫ СВЕТИКОВ...................................*/
/*..............................................................................*/
#define led_blue   PA_ODR_bit.ODR1
/*..............................................................................*/
#define led_green  PA_ODR_bit.ODR3 
/*..............................................................................*/
/*............................ПИН ДЕТЕКТОР USB...................................*/
/*..............................................................................*/
#define PIN_USB  PA_IDR_bit.IDR2
/*..............................................................................*/
/*............................ПИН ВКЛ/ВЫКЛ USB..................................*/
/*..............................................................................*/
#define USB_SWITCH  PC_ODR_bit.ODR3
/*..............................................................................*/
/*............................ПИН ШИМ КАНАЛА....................................*/
/*..............................................................................*/
#define PIN_PWM  PC_ODR_bit.ODR6
/*..............................................................................*/
/*..............                                  ..............................*/
/*..............................................................................*/
#define Vop 120  // ОПОРНОЕ НАПРИЖЕНИЕ ПО 6 КАНАЛУ В ВОЛЬТАХ (1.2V*10)
#define channal_out 2    ///выход преобразователя. (при не активном режиме работы ШИМ - входное минус падение на катушке и диоде.)
#define channal_res 3 //переменник. 4,7 кОм.
#define channal_in 5 //входное
#define channal_op 6    /// опорник 
#define max_l 100 // максимальное значение в см.
#define w_ad 256 // разрядность ацп 8бит 255 10бит 1024
#define V_lion_h 4200
#define V_lion_nom 3700
unsigned int Vdd;
unsigned int in;
unsigned int out;
unsigned int l;
unsigned char temp = 1;
volatile unsigned char flag_time = 0;
/*..............................................................................*/
/*................................СТАРТ.........................................*/
/*..............................................................................*/
int main( void )
{
  CLK_SWCR_bit.SWEN = 0;//ЗАПРЕЩАЕМ ПЕРЕКЛЮЧЕНИЕ ИСТОЧНИКА ТАКТОВОЙ           
  CLK_CKDIVR_HSIDIV = 0;//выбирают делитель для внутреннего генератора = 1.
  CLK_CKDIVR_CPUDIV = 0;//определяют делитель для ЦПУ = 1.
/*..............................................................................*/
/*....................... ПИН A.3 ГОЛУБОЙ СВЕТИК ...............................*/
/*..............................................................................*/
  PA_DDR_bit.DDR3 = 1; //ПИН НА ВЫХОД
  PA_CR1_bit.C13 = 1; //ПОРТ В РЕЖИМЕ ПОДТЯЖКИ К + ИЛИ - (PUSHPULL)
  PA_CR2_bit.C23 = 1; //СКОРОСТЬ 10МГц
/*..............................................................................*/
/*....................... ПИН A.1 ЗЕЛЕНЫЙ СВЕТИК ...............................*/
/*..............................................................................*/
  PA_DDR_bit.DDR1 = 1; //ПИН НА ВЫХОД
  PA_CR1_bit.C11 = 1; //ПОРТ В РЕЖИМЕ ПОДТЯЖКИ К + ИЛИ - (PUSHPULL)
  PA_CR2_bit.C21 = 1; //СКОРОСТЬ 10МГц
/*..............................................................................*/
/*....................... ПИН A.2 ДЕТЕКТОР USB .................................*/
/*..............................................................................*/
  PA_ODR_bit.ODR2 = 0; //ПИН ОЧИСТИТЬ
  PA_CR1_bit.C12 = 0; //ПЛВАВЮЩИЙ ВХОД
  PA_CR2_bit.C22 = 0; //ПРЕРЫВАНИе выкл
  PA_DDR_bit.DDR2 = 0; //ПИН НА ВХОД
/*..............................................................................*/
/*....................... ПИН C.3 ВКЛ/ВЫКЛ USB .................................*/
/*..............................................................................*/
  PC_DDR_bit.DDR3 = 1; //ПИН НА ВЫХОД
  PC_CR1_bit.C13 = 1; //ПОРТ В РЕЖИМЕ ПОДТЯЖКИ К + ИЛИ - (PUSHPULL)
  PC_CR2_bit.C23 = 1; //СКОРОСТЬ 10МГц  
/*..............................................................................*/
/*....................... ПИН С.6 ШИМ КАНАЛ ....................................*/
/*..............................................................................*/
  PC_DDR_bit.DDR6 = 1; //ПИН НА ВЫХОД
  PC_CR1_bit.C16 = 1; //ПОРТ В РЕЖИМЕ ПОДТЯЖКИ К + ИЛИ - (PUSHPULL)
  PC_CR2_bit.C26 = 1; //СКОРОСТЬ 10МГц  
  PIN_PWM = 0;
/*..............................................................................*/
/*.....НАСТРОЙКИ ТАЙМЕРА 1. .........*/
/*..............................................................................*/
  TIM1_ARRH = 0;
  TIM1_ARRL = 80; 
  TIM1_BKR_bit.MOE = 1;
  TIM1_CCMR1_OC1M = 6;
  TIM1_CCMR1_OC1PE = 1;
  TIM1_CCER1_CC1E = 1;
  TIM1_CCR1H = 0; 
  TIM1_CCR1L = temp;
  TIM1_CR1_CEN = 1;
/*..............................................................................*/
/*.......................НАСТРОЙКА АЦП .........................................*/
/*..............................................................................*/
  ADC_CSR_bit.CH = channal_op;//
  ADC_CR1_bit.CONT = 0;//  ИЗМЕРЕНИЕ БЕЗ ОСТАНОВА
  ADC_CR1_bit.SPSEL = 0;// ТАКТИРОВАНИЕ АЦП 4МГЦ
  ADC_CR2_bit.ALIGN =0;//ВЫРАВНИВАНИЕ ПО ЛЕВОМУ КРАЮ
  ADC_CR1_bit.ADON = 1;// ПОДАЕМ ПИТАНИЕ НА МОДУЛЬ АЦП
  ADC_CSR_bit.EOCIE = 1;// РАЗРЕШАЕМ ПРЕРЫВАНИЕ ПО ОКНЧАНИИ ПРЕОБРАЗОВАНИЯ
//МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ КАЗ
  ADC_HTRH = 62;
  ADC_HTRL = 0;
//МИНИМАЛЬНОЕ ЗНАЧЕНИЕ КАЗ
  ADC_LTRH = 50;
  ADC_LTRL = 0;
//РАЗРЕШАЕМ ПРЕРВАНИЕ ПО КАЗ
 // ADC_CSR_bit.AWDIE = 1;
//НАЧИНАЕМ ПРЕОБРАЗВАНИЕ
  ADC_CR1_bit.ADON = 1;
  asm("RIM"); //Разрешаем прерывания
  USB_SWITCH = 1;//заряд выкл так как нет потдяжки транзюка вкл заряд
/*..............................................................................*/
/*...........НАСТРОЙКА КОНТРОЛЯ АНАЛОГОВЫХ ЗНАЧЕНИЙ ............................*/
/*..............................................................................*/
  
/*..............................................................................*/
/*.............................ОСНОВНОЙ ЦИКЛ....................................*/
/*..............................................................................*/ 
  for(;;)
  {
  }
}
/*..............................................................................*/
/*..............................................................................*/
/*..............................................................................*/
#pragma vector = ADC1_EOC_vector
/*..............................................................................*/
/*..............................................................................*/
/*..............................................................................*/
__interrupt void ADC1_EOC_handler(void)
{
  if(( ADC_CSR_bit.EOC == 1 ) && ( ADC_CSR_bit.EOCIE == 1 )){
    ADC_CSR_bit.EOC = 0;
    switch( ADC_CSR_bit.CH ){
    case channal_out:
      out=(Vdd*10/w_ad)*ADC_DRH*2;
      if(out>5000){
        if(temp>1)TIM1_CCR1L = temp--;
      }
      else{
        if(temp<50)TIM1_CCR1L = temp++;//максимальное напряжение
      }
      ADC_CSR_bit.CH = channal_res;
      break;
    case channal_res:
      l=ADC_DRH*max_l/w_ad;
      ADC_CSR_bit.CH = channal_in;
      break;
    case channal_in:
      /* ИЗМЕРЯЕМ НАПРЯЖЕНИЕ НА АККУМУЛЯТОРЕ */
      in=(Vdd*10/w_ad)*ADC_DRH*2;  
      if( PIN_USB == 1 ){
        /* ЕСЛИ НАПРЯЖЕНИЕ НА АКУММЕ МЕНЬШЕ 4,2В И ФЛАГ ПЕРЕЗАРЯДА ОПУЩЕН
ЗАЖИГАЕМ СИНИЙ СВЕТИК И ЗАРЯЖАЕМ*/
        if(( in < V_lion_h )&&( flag_time == 0 )){
          led_blue = 1;
          USB_SWITCH = 0;//заряд вкл
        }
        /* ЕСЛИ НАПРЯЖЕНИЕ НА АККУМЕ БОЛЬШЕ 4,2В, ТО ЗАРЯД ПРЕКРАЩАЕМ И ГАСИМ 
СИНИЙ СВЕТИК. ПОДЫМАЕМ ФЛАГ ПЕРЕЗАРЯДА И НАЧИНАЕМ ЕГО ВЫЧЕТАТЬ(СОЗДАЕМ ПАУЗУ)
ТАК КАК УСЛОВИЕМ РАЗРЕШЕНИЯ ЗАРЯДА ЯВЛЯЕТСЯ ОПУЩЕННЫЙ ФЛАГ ПЕРЕЗАРЯДА, ТО ЗАРЯД 
НЕ НАЧНЕТСЯ ДО ТЕХ ПОРА ПОКА НАРЯЖЕНИЕ НА АККУМЕ НЕ УПАДЕТ НИЖЕ 4,2В И ФЛАГ 
ПЕРЕЗАРЯДА СТАНЕТ = 0. ТЕМ САМЫМ ОБЕСПЕЧИМ МИГАНИЕ СИНЕГО СВЕТИКА И УДЕРЖАНИЕ 
4,2 В */
        else{
          led_blue = 0;
          USB_SWITCH = 1;//заряд выкл
          flag_time--;
        }
      }
      /* ИНАЧЕ УСБ НЕПОДКЛЮЧЕН СИНИЙ ТУШИМ, ЗАКРЫВАЕМ КЛЮЧ ЗАРЯДКИ */
      else{
        led_blue = 0;
        USB_SWITCH = 1;//заряд выкл
        flag_time = 0;
      }     
      ADC_CSR_bit.CH = channal_op;
      break;
    case channal_op:
      Vdd=w_ad*Vop/ADC_DRH;
      ADC_CSR_bit.CH = channal_out;
      break; 
    }
    ADC_CR1_bit.ADON = 1;
  }
}

критика?

13

Да не прикалывайся... Чтобы критиковать... нужно вникать...

14

HHIMERA написал(а):

Да не прикалывайся... Чтобы критиковать... нужно вникать...

Я понимаю, что это не нужно никому. Может что-то сразу в глаза бросится?
Я вот до сих пор не могу решить главного. Что лучше - работать с усредненными значениями или мгновенными?
Здравый смысл подсказывает, чтоб пульсации меньше были, лучше с мгновенными. Но мой опыт подсказывает, что опыта нет.  :crazy:

Отредактировано RA (2018-05-31 18:21:08)

15

Раз уж все работает, давай тогда и схемотехнику в более хорошем качестве, работа ведь проделана не малая. Может кто возьмет схему, а кто схему и код.

16

Все выложу когда причешу до вменяемого вида. Как есть очень сыро, все же меняется, подгоняется на ходу. Одна печатка имеет уже 12-ый номер и тоже еще далека от идеала.

17

Столкнулся с такой вот проблемой, перевел прошивку в релиз. Отключаю свисток( +5 снимаю ) кЫтайский, включаю свой девайс и аля-улю. Подключаю свисток к плате своей(+5 втыкаю), включаю плату и работает. Отключаю свисток... и все тухнет. Плата явно на него(свисток) нагружается.
Что там в нем такого волшебного????

Отредактировано RA (2018-05-31 23:05:19)

18

Не понимаю, что за чудеса такие. Изучил схему свистка, ничего такого чудесного не увидел. НО, отключаю полностью схему от стлинка и все работает. Т.е. отключить только +5 не достаточно.

Отредактировано RA (2018-06-01 09:00:49)

19

RA А ты свисток не превращал в J-Link? А то мой не разбираеться (не хочу курочить чужое) в металлическом корпусе, взял попользоваться для платы, а то дискавери как программатор использовать неудобно. Боюсь испортить, через утилиту от СТ бновил прошивку нормально до последней.

20

Превращал. Возвращал назад, обновлялся.

21

Дошел до ручки, пульсации измеряю лог.анализ. .

Код:
__interrupt void ADC1_EOC_handler(void)
{
  if(( ADC_CSR_bit.EOC == 1 ) && ( ADC_CSR_bit.EOCIE == 1 )){
    ADC_CSR_bit.EOC = 0;
    buff = ADC_DB0RH;
    buff = buff+ADC_DB1RH;
    buff = buff+ADC_DB2RH;
    buff = buff+ADC_DB3RH;
    buff = buff+ADC_DB4RH;
    buff = buff+ADC_DB5RH;
    buff = buff+ADC_DB6RH;
    buff = buff+ADC_DB7RH;
    buff = buff+ADC_DB8RH;
    buff = buff+ADC_DB9RH;
    buff = buff/10;
    out=w_ad*Vop/buff;
    if((out<out_max)&&(out>out_min)){
      led_red = 1;// уложились в #define out_min 490
#define out_max 510
    }
    else{
      led_red = 0;//не уложились 
      if((out>out_max)&&(temp>1)){
        TIM1_CCR1L = temp--;
      }
      if((out<out_min)&&(temp<out_temp)){
        TIM1_CCR1L = temp++;
      }
    }
  }
}

http://sd.uploads.ru/t/EtAHV.png

Отредактировано RA (2018-06-04 17:51:48)

22

Кто как считает

Код:
TIM1_CCR1L = temp-1;

=

Код:
TIM1_CCR1L = temp--;

или нет?

Отредактировано RA (2018-06-06 21:16:27)

23

MasterElectric написал(а):

второе вообще не то

В первом из переменной вычитается 1, а во втором вычитается 1. Или я туплю на ровном месте?
Вот так точно равносильно.

Код:
temp=temp-1;
TIM1_CCR1L = temp;


=

Код:
TIM1_CCR1L = temp--;

Отредактировано RA (2018-06-06 22:21:55)

24

ну в первом случае, в регистр запишеться Темп - 1 как и положено, во втором вообще фигня написана. В регистр запишеться Темп, а потом от него отниметься диница И ЗНАЧЕНИЕ ЗАПИШЕТЬСЯ в перепенную Темп. Как-то так.

25

поменяй местами это равносильно

Код:
temp=temp-1;
TIM1_CCR1L = temp;

==

TIM1_CCR1L = --temp;

26

для 8 битников мне понравилось использовать union для доступа к байтам многобайтовых данных, ну или полусловам. не надо ничего сдвигать и прочее. Что на асме в итоге бестрее не понятно конечно, но удобно.

27

MasterElectric написал(а):

поменяй местами это равносильно

да, левая ассоциативность. туплю. в моем случае при втором прогоне в регистр уйдет темп-1.

Отредактировано RA (2018-06-06 22:59:03)

28

MasterElectric написал(а):

для 8 битников мне понравилось использовать union для доступа к байтам многобайтовых данных, ну или полусловам. не надо ничего сдвигать и прочее. Что на асме в итоге бестрее не понятно конечно, но удобно.

использовал http://uploads.ru/gZVJn.png
НО оно и не надо.

Отредактировано RA (2018-06-06 23:17:55)

29

для 8 битников мне понравилось использовать union для доступа к байтам многобайтовых данных, ну или полусловам. не надо ничего сдвигать и прочее.

В СТМ8 с этим аккуратнее нужно... там индейцы другие...

30

HHIMERA можно поподробней... разжевать для тех кто в танке? или ссылочку где уже разжевано. что такое индейцы знаю, понимаю, но как это влияет на union?

Отредактировано RA (2018-06-07 12:50:54)


Вы здесь » Микроконтроллеры » RA » Повышающий преобразователь. stm8s.