Добавлено через 1мин.:
я написал макросыm16, 20 Апр. 18, 23:06так то да, мало совсем не решаемых вопросов.
но костыли - это же некрасиво)))
я написал макросыm16, 20 Апр. 18, 23:06так то да, мало совсем не решаемых вопросов.
Если предположить что были бы асм инструкции для работы с битами, разве это не был бы тот же аппаратный |=?Mnz, 20 Апр. 18, 22:59Есть у STM очень извращенный регистр. В нем есть обычные биты, есть биты только сброс нулем (на 1 не реагируют) и в нем же тогл биты (сложение по модулю 2 или инверт при записи 1). Допустим все тогл биты установлены и вам надо записать в обычный бит регистра 1. bit banding тут вроде просится, дешево и сердито, а хрен там. Он перевернет все тоглы в которые ничего писать не собирался.
Bit-banding maps a complete word of memory onto a single bit in the bit-band region. For example, writing to one of the alias words will set or clear the corresponding bit in the bitband region.Возможно действительно аппаратный доступ к битам без чтения-модификация-запись.
Возможно действительно аппаратный доступ к битам без чтения-модификация-запись.К сожалению нет. Слишком сложная была бы организация памяти, вернее надо было бы шину адреса в 8 раз ширее, а наверное в 32 даже.
1. Запускается очень долго.Z_h_e, 20 Апр. 18, 22:49эклипс он да, такой. Ничего не поделаешь, это ява(с).
...
typedef struct {
uint32_t addr:3;
} addr_tmp_t;
#define adrSPI (((addr_tmp_t *)(&(GPIOB->ODR)))->addr)
...
void SysTick_Handler(void)
{
//------7сегментный4позиции индикатор отображение развертка начало------//
if ( tickwait == tickuwTick ) { tickwait = tickuwTick + DynamicScan; //осчёт интервала в мс
adrSPI = adrLed74; //сбросить бит на LOW - начало обмена, защелкнули входные данные в 589 - передача, 595 - прием
SPI1->DR = Data2ToSend[pos7Segment]; //загружаем данные для передачи
SPI1->CR2 |= SPI_CR2_RXNEIE; //разрешить прерывание по заполнении приемного буфера
SPI1->CR1 |= SPI_CR1_SPE; //включаем SPI
if ( pos7Segment++ == 4 ) {
pos7Segment = 0;
}
}
}
void SPI1_IRQHandler(void)
{
uint16_t tmp1 = 0;
//причина прерывания - принят байт данных
if(SPI1->SR & SPI_SR_RXNE) {
adrSPI = adrAT25; //установить бит, защелкнули выходные данные в 595->вывод HIGH, устанавливаем значения на выходах
tmp1 = SPI1->DR; //прочитать принятые данные (опрос клавиатуры)
SPI1->CR2 &= ~SPI_CR2_RXNEIE; //запретить прерывание
SPI1->CR1 &= ~SPI_CR1_SPE; //выключаем SPI
//выполняем какие-то действия
return;//
}
// //причина прерывания - окончание передачи байта
// if(SPI1->SR & SPI_SR_TXE) {
// //выполняем какие-то действия
// return;//
// }
}
if(SPI1->SR &= SPI_SR_RXNE)SedoY, 22 Апр. 18, 07:40нене, это всегда будет истинно. Просто &, без =
____________________________________________________________________________________________
| Команда | Параметр (1 байт) | Данные |
|__________________________________________________________________________________________|
| SetPower (w) | № канала (0 - 3) (w) | Младший байт данных (w) | Старший байт данных (w) |
|------------------------------------------------------------------------------------------|
| GetPower (w) | № канала (0 - 3) (w) | Младший байт данных (r) | Старший байт данных (r) |
|------------------------------------------------------------------------------------------|
| GetHz001 (w) | ---- | Младший байт данных (r) | Старший байт данных (r) |
--------------------------------------------------------------------------------------------
Сокращения в таблице.
(w) - запись мастером. (r) - чтение мастером.
CMD_SetPower = 1 // Задание процента открытия симистора (0-10000) что равно 0 - 100.00%.
CMD_GetPower = 2 // Чтение процента открытия симистора.
CMD_GetHz001 = 3 // Чтение частоты сети в Гц * 100. Частота 50.2 Гц будет прочитана как 5020.
I2C_Addr = 0x10; // Адрес I2C.
позволяющий изменять время открытого состояния симистора от 0 до 100% с разрешающей способностью 0.01%Mnz, 03 Мая 18, 21:35задавать мощность в процентах от максимального угла открытия симистора путь тупиковый поскольку нет прямой зависимости между углом открытия и напряжением на тэне. а выглядит это так:
частоту сети измерять - совсем бессмысленные телодвижения. зачем?m16, 03 Мая 18, 22:47Допустим задали время открытого состояния симистора 50%. При частоте полупериода 100 Гц это равно 5 миллисекунд. Допустим что частота изменилась и стала 90 Гц (маловероятно, но всякое возможно). Чтобы получить те же 50%, нужно время открытого состояния увеличить до 5.555 миллисекунд.
Допустим задали время открытого состояния симистора 50%.Mnz, 03 Мая 18, 23:02опять ты за своё. ОК.
Допустим задали время открытого состояния симистора 50%Mnz, 03 Мая 18, 23:02имхо сначала вопрос в том, что, поелику уж се отдельное устройство, куда удобнее ему со стороны управляющего контроллера для удержания задавать несколько более абстрактное значение - RMS ток/напряжение или мощность. А там уж конем оно прелюбодействуй, пусть сам разгребается с частотами и процентами.
Первый канал (50.00%).Mnz, 03 Мая 18, 21:35
Второй канал (1.00%).Mnz, 03 Мая 18, 21:35здесь у тебя косяки. моську рекомендуется открывать импульсом t_gate длительностью не менее 200мкс и снимать импульс не менее чем за 250мкс до прихода ноля сети.
куда удобнее ему со стороны управляющего контроллера для удержания задавать несколько более абстрактное значениеarkhnchul, 03 Мая 18, 23:47а нахрена управляющему контроллеру заниматься этой ерундой, F030 сам справится и rms посчитать и угол выдать.
а нахрена управляющему контроллеру заниматься этой ерундой, F030 сам справится и rms посчитать и угол выдать.m16, 03 Мая 18, 23:52я об этом, да. Если в основных мозгах заморачиваться процентами и частотой (напряжение или ток, кстати, где?), то зачем второй контролер - ногой дрыгать?