Jump to content

    

Димон Безпарольный

Участник
  • Content Count

    815
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Димон Безпарольный

  • Rank
    Знающий

Recent Profile Visitors

3300 profile views
  1. Кажется все старые счетчики считают U * I - это полная мощность. Для подсчета активной мощности нужно вычислить угол сдвига между напряжением и током. Кажется так. Не думаю что простые счетчики это делают. PS. Может я и не прав - на шунте выделяется только активная часть? А в случае с трансформатором тока также?
  2. Резистор есть. 360 Ом. Я для упрощения про него не писал. Спасибо, прояснили.
  3. Подскажите - активной мощности здесь получается меньше ватта? Остальная мощность ведь счетчик не крутит? Так?
  4. Речь пойдет об исполнительном модуле MRS516. Модуль питается от сети через конденсатор 0.47мкФ. После конденсатора идет диодный мост и шунтовой стабилизатор 24В. Замеренный мной ток составляет 0.034А. В паспорте на прибор указано меньше одного Ватта. Так и есть если считать 24В * 0.034А. Но если считать 220В * 0.034А, то получается примерно 6Вт. Подозреваю что часть мощности является реактивной и счетчик не крутит. Как считать правильно активную часть мощности?
  5. Подскажите по буферу LCD. Закипел.

    Еще круче. Но этот вариант не работает - часть пикселей другого цвета и сдвинуто по оси Х. void drawPixel(unsigned char x, unsigned char y, unsigned char color) { // #define N 2 //N = 0, 1, 2, 3 => 1, 2, 4, 8 bpp unsigned int idx = (x + y * width); unsigned char mask = (1 << (1 << N)) - 1; unsigned int shift = (idx & ((1 << (3-N))-1)); LCDBUF[idx >> (3-N)] = (LCDBUF[idx >> (3-N)] & (mask << shift)) | ((color & mask) << shift); } Для 4-х битового режима. Чтение буфера не менял. Только запись. Строка LCDBUF[(x+y*160)/2] = (LCDBUF[(x+y*160)/2] & (0xF0 >> (4*(x&1)))) | ((color & 0x0F) << (4*(x&1))); исправно работает. Понять в чем причина не смог пока.
  6. Подскажите по буферу LCD. Закипел.

    Два бита цвета тоже получилось, но коряво. void drawPixel(unsigned char x, unsigned char y, unsigned char color) { // if((x&3) == 0) { LCDBUF[(x+y*160)/4] = ((LCDBUF[(x+y*160)/4] & 0xfc) | (color & 0x03)); } if((x&3) == 1) { LCDBUF[(x+y*160)/4] = ((LCDBUF[(x+y*160)/4] & 0xf3) | ((color & 0x03) << 2)); } if((x&3) == 2) { LCDBUF[(x+y*160)/4] = ((LCDBUF[(x+y*160)/4] & 0xcf) | ((color & 0x03) << 4)); } if((x&3) == 3) { LCDBUF[(x+y*160)/4] = ((LCDBUF[(x+y*160)/4] & 0x3f) | ((color & 0x03) << 6)); } } // Передача в буфер еще хуже void Display(void) //Функция передает содержимое буферов цветов в дисплей LCD { // setAddrWindow(0, 0, width, height);//Диаппазон, в котором действует автоинкремент Set_Pin_DC; // int h = width * height/4; //Число точек int ADR = 0, i; //Индекс массива while (h--) //Цикл передачи массивов цветов в дисплей { // unsigned char LCDByte; LCDByte = LCDBUF[ADR]; if(LCDByte & 0x03) //Foreground { // unsigned int short color = Colors[LCDByte & 0x03]; ST7735_write(color >> 8); //Старший байт цвета ST7735_write(color);//Младший байт цвет } // else //BackGround { // ST7735_write(0); //Старший байт цвета ST7735_write(0); //Младший байт цвета } // LCDByte = LCDByte >> 2; // if(LCDByte & 0x03) //Foreground { // unsigned int short color = Colors[LCDByte & 0x03]; ST7735_write(color >> 8); //Старший байт цвета ST7735_write(color);//Младший байт цвет } // else //BackGround { // ST7735_write(0); //Старший байт цвета ST7735_write(0); //Младший байт цвета } // LCDByte = LCDByte >> 2; // if(LCDByte & 0x03) //Foreground { // unsigned int short color = Colors[LCDByte & 0x03]; ST7735_write(color >> 8); //Старший байт цвета ST7735_write(color);//Младший байт цвет } // else //BackGround { // ST7735_write(0); //Старший байт цвета ST7735_write(0); //Младший байт цвета } // LCDByte = LCDByte >> 2; // if(LCDByte) //Foreground { // unsigned int short color = Colors[LCDByte & 0x03]; ST7735_write(color >> 8); //Старший байт цвета ST7735_write(color);//Младший байт цвет } // else //BackGround { // ST7735_write(0); //Старший байт цвета ST7735_write(0); //Младший байт цвета } // ADR++; // } // for(int i=0; i < width * height/2; i++) { //Очистка видеобуфера LCDBUF[i] = 0; // } // } // Почему - то не получилось запихнуть в цикл. Так не работает: for(i = 0; i > 4; i++) { if(LCDByte & 0x03) //Foreground { // unsigned int short color = Colors[LCDByte & 0x03]; ST7735_write(color >> 8); //Старший байт цвета ST7735_write(color);//Младший байт цвет } // else //BackGround { // ST7735_write(0);//Старший байт цвета ST7735_write(0);//Младший байт цвета } // LCDByte = LCDByte >> 2; // }
  7. Подскажите по буферу LCD. Закипел.

    Монохром получился. void drawPixel(unsigned char x, unsigned char y, unsigned char color) { // if (color) LCDBUF[(x+y*160)/8] |= (1 << (x & 7)); else LCDBUF[(x+y*160)/8] &= ~(1 << (x & 7)); } // Вывод в дисплей: void Display(void) //Функция передает содержимое буферов цветов в дисплей LCD { // setAddrWindow(0, 0, width, height);//Диаппазон, в котором действует автоинкремент Set_Pin_DC; // int h = width * height / 8; //Число точек int ADR = 0, i; //Индекс массива while (h--) //Цикл передачи массивов цветов в дисплей { // unsigned char LCDByte; // LCDByte = LCDBUF[ADR]; // for(i = 0; i < 8; i++) // { // if(LCDByte & (1 << i))//Foreground { // ST7735_write(Colors[PixelColor] >> 8); //Старший байт цвета ST7735_write(Colors[PixelColor]); //Младший байт цвет } // else //BackGround { // ST7735_write(0);//Старший байт цвета ST7735_write(0);//Младший байт цвета } // } // ADR++; // } // for(int i=0; i < width * height / 8; i++) { //Очистка видеобуфера LCDBUF[i] = 0; // } // } //
  8. Подскажите по буферу LCD. Закипел.

    Круто. Спасибо. Вот что получилось: void drawPixel(unsigned char x, unsigned char y, unsigned char color) { // LCDBUF[(x+y*160)/2] = (LCDBUF[(x+y*160)/2] & (0xF0 >> (4*(x&1)))) | ((color & 0x0F) << (4*(x&1))); } // И отправляем в дисплей: void Display(void) //Функция передает содержимое буферов цветов в дисплей LCD { // setAddrWindow(0, 0, width, height);//Диаппазон, в котором действует автоинкремент Set_Pin_DC; // int h = width * height/2; //Число точек int ADR = 0; //Индекс массива while (h--) //Цикл передачи массивов цветов в дисплей { // unsigned char LCDByte; LCDByte = LCDBUF[ADR]; if(LCDByte & 0x0F) //Foreground { // unsigned int short color = Colors[LCDByte & 0x0F]; ST7735_write(color >> 8); //Старший байт цвета ST7735_write(color);//Младший байт цвет } // else //BackGround { // ST7735_write(0); //Старший байт цвета ST7735_write(0); //Младший байт цвета } // LCDByte = LCDByte >> 4; // if(LCDByte) //Foreground { // unsigned int short color = Colors[LCDByte]; ST7735_write(color >> 8); //Старший байт цвета ST7735_write(color);//Младший байт цвет } // else //BackGround { // ST7735_write(0); //Старший байт цвета ST7735_write(0); //Младший байт цвета } // ADR++; // } // for(int i=0; i < width * height/2; i++) { //Очистка видеобуфера LCDBUF[i] = 0; // } // } // Теперь проще. Попробую еще монохром сделать.
  9. Подскажите по буферу LCD. Закипел.

    Для LCD размером 160х128 при глубине цвета требуется 40КБ RAM. При этом буфер делаю unsigned short int размером 128х160. Можно взять глубину цвета 8 бит. Т.е. буфер будет unsigned char и потребуется 20кб. Это тоже работает. Но на малых контроллерах (L151) есть необходимость тоже запускать подобные LCD (других нет). При этом хотелось бы сделать буфер размером 4 бита и самому выбирать одно из 16 значений цветов. И 1 бит. И вот тут я на трансляции адресов закипел. Может кто подскажет литературу или пример где можно посмотреть как это делается? В SSD1309 делается так: if (color == WHITE) buffer[x+ (y/8)*SSD1306_LCDWIDTH] |= (1 << (y&7)); else buffer[x+ (y/8)*SSD1306_LCDWIDTH] &= ~(1 << (y&7)); Но здесь сложнее. Здесь приходится еще и разгребать буфер перед записью в LCD. Заранее спасибо.
  10. Подскажите по распределению памяти в STM32L476

    Только в MAP файле не нашел куда куча кладется. А она используется. Точно.
  11. Подскажите по распределению памяти в STM32L476

    Нашел очень доступно на картинках здесь: http://www.stmcu.org.cn/module/forum/thread-604814-1-1.html Весьма удобно. Из MAP переносим название объектных файлов в scr в разные секции IRAM по желанию. И код даже работает.
  12. Подскажите по распределению памяти в STM32L476

    Это в скаттере *.sct?
  13. Подскажите по распределению памяти в STM32L476

    В процессоре есть память CCM(IRAM2), с нулевым циклом ожидания. Хотелось бы туда запихнуть стек и некоторые переменные. Собственно, это с успехом делает линкер когда я ставлю галочку разрешения IRAM2. Но. Линкер пихает туда в частности и буфер, с которым работает DMA. Но доступа у DMA туда нет и код разумеется не работает. Нашел атрибут __attribute__((at(0x10000000))); для размещения в IRAM2. Это тоже работает. Но нужно указать что определенные буфера надо размещать в IRAM1. Попробовал поменять на __attribute__((at(0x20000000)));, но ругается линкер: Как все - таки указать явное размещение в IRAM1 линкеру ?
  14. FatFS и прерывания

    Что - то проясняется. Информации под STM я пока не нашел, но для LPC вот что написано: The extra bit is called HWFC_EN (Hardware Flow Control Enable).The description is"The HW flow control functionality is used to avoid FIFO underrun (TXmode) and overrun (RX mode) errors.The behavior is to stop SDIO_CK and freeze SDIO state machines. The datatransfer is stalled while the FIFO is unable to transmit or receivedata. Only state machines clocked by SDIOCLK are frozen, the AHBinterface is still alive. The FIFO can thus be filled or emptied even ifflow control is activated." Именно это скорее всего и происходит - не успевают передаваться / приниматься данные из / в FIFO При установке этого бита, машина состояния карты просто останавливается если FiFo заполнен доверху за 2 байта до конца. При сброшенном бите процессор обязан читать весь поток.
  15. FatFS и прерывания

    Вот что говорит документация по этой настройке: Bit 18 TXFIFOE: Transmit FIFO empty When HW Flow Control is enabled, TXFIFOE signals becomes activated when the FIFO contains 2 words. Bit 17 RXFIFOF: Receive FIFO full When HW Flow Control is enabled, RXFIFOF signals becomes activated 2 words before the FIFO is full. Может быть проблема связана с чтением из FiFo и переполнением данных при включенных прерываниях.