st7735 160 на 128 подсветка барахлит

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lilik пишет:

Для примера схему можно?

Цитата:

... Если просто здраво - нахрен кому то прибор (и теория под него) который а) существенно изменяет токи и напряжения в цепи б) безбожно врёт в показаниях?

Во первых, не следует путать между собой две принципиально различные ситуации:

- прибор безбожно врет,

- кто-то не умеет пользоваться прибором.

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

Ну а по поводу "существенно изменяет токи и напряжения" - это вопрос не ко мне, а к разработчикам прибора. От себя могу высказать лишь предположение, что это сделано для того, чтобы при перегрузке прибора сгорела не головка, а один и резисторов, которые гораздо дешевле.

Ну и от себя встречный риторический вопрос: нахрен покупать прибор, если не умеешь им пользоваться!

lilik
Offline
Зарегистрирован: 19.10.2017

andriano пишет:

lilik пишет:

Для примера схему можно?

Цитата:

... Если просто здраво - нахрен кому то прибор (и теория под него) который а) существенно изменяет токи и напряжения в цепи б) безбожно врёт в показаниях?

Во первых, не следует путать между собой две принципиально различные ситуации:

- прибор безбожно врет,

- кто-то не умеет пользоваться прибором.

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

Ну а по поводу "существенно изменяет токи и напряжения" - это вопрос не ко мне, а к разработчикам прибора. От себя могу высказать лишь предположение, что это сделано для того, чтобы при перегрузке прибора сгорела не головка, а один и резисторов, которые гораздо дешевле.

Ну и от себя встречный риторический вопрос: нахрен покупать прибор, если не умеешь им пользоваться!

Это всё ерунда, кто измерит получит те же 30мА на подсветке экранчика любым адекватным прибором с любой правильной схемой измерения, не будет у одного 20 мА, а у другого 200 мА, у третьего 2мА. 

lilik
Offline
Зарегистрирован: 19.10.2017

Да и подумали бы, разве заработает схема, если в цепь питания шарахнуть амперметр с шунтом в 100 Ом? Ладно, это всё пустая болтовня. Мне интересен был другой аспект, аккумулятор 3,7 В, дальше первый стабилизатор на 3,3 В, следом ещё один на 3,3 В. А экран работает хоть бы что.

lilik
Offline
Зарегистрирован: 19.10.2017

Да, и про схему прибора. Ну сделали вместо тока полного отклонения в 40 мкА каких нибудь 500 для красоты счёта :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lilik пишет:

Это всё ерунда, кто измерит получит те же 30мА на подсветке экранчика любым адекватным прибором с любой правильной схемой измерения, не будет у одного 20 мА, а у другого 200 мА, у третьего 2мА. 

Ключевые слова: "с правильной схемой измерения".

И с этим трудно не согласиться.

А вот если схема измерения неправильная, то получится именно "Это все ерунда".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ты бы еще древнее прибор нашел, даже у Ц43101 на токе 100ма внутреннее порядка 1.5 ома, а у него класс точности не 0,5...
измерение с точностью 5% устроит большинство хоббистов, давай для примера посмотрим любой современный цифровой прибор 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

измерение с точностью 5% устроит большинство хоббистов,

Уверен?

Я еще раз напомню, что сейчас обсуждается поведение цепи, имеющей эквивалентную схему, состоящую из идеального стабилитрона/стабистора и резистора, причем бОльшая часть напряжения (существенно большая) падает именно на стабисторе.

Ну, скажем, стабистор на 2.9 В, а на схему подается напряжение, которое оказывается равным 3 В с точностью до 5%. 

Достаточно нам такой точности?

Цитата:

давай для примера посмотрим любой современный цифровой прибор 

Так разве я против?

Я лишь указал "до 2 В" и привел пример прибора, в котором именно эти два вольта и реализуются. Лично я понимаю "до 2 В" как "2 В - максимальное значение". А ты понимаешь как-то иначе?

Кстати, в приведенной мною схеме стрелочного прибора максимальное напряжение на нем в режиме амперметра 0.5 В. Что более чем на порядок превышает падение напряжения на самой головке (о чем я тоже писал).

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Кстати, в приведенной мною схеме стрелочного прибора максимальное напряжение на нем в режиме амперметра 0.5 В. Что более чем на порядок превышает падение напряжения на самой головке (о чем я тоже писал).

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

ЗЫ был у нас в конторе пикоамперметр, вот ни разу даже не включал...по разнарядке видно попал, осциллограф наше всё )))
 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

комплект контрольных приборов рассчитан на шунты в 75 милливольт, 75 милливольт Карл, ни о каких иных напряжениях и речи не может быть, ...всё остальное от лукавого...

А для кого я в посте №602 схему привел?

Не поверю, что ты схемы читать разучился.

Цитата:

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

Собственно я на большее и не претендую.

Ну, точнее, получить все-таки можно, просто это нужно уметь, и для этого в некоторых случаях может оказаться необходимым два авометра.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

разогнал дисплей до ~87 fps заливкой сплошного цвета

STM32F103C8T6 + ST7735

SPI1 36Mhz

STM32CubeIDE

Программирование STM32. Часть 6: SPI — DiMoon Electronics

STM32F103C8 без HAL и SPL: Работа с SPI дисплеями Nokia_5110 и ST7735 (count-zero.ru)

 

/*
 * f103st7735.h
 *
 *  Created on: 6 июн. 2023 г.
 *      Author: seleznev_a
 *
 *      ST7735 pins ->  STM32F103C8T6 pins
 *      1 GND -> GND
 *      2 VCC -> 3.3 V
 *      3 SCK -> PA5 SCK SPI1
 *      4 SDA -> PA7 MOSI SPI1
 *      5 RES -> PB1
 *      6 RS(A0) -> PB10
 *      7 CS -> PB11
 *      8 LEDA -> 3.3 V
 *
 */

#ifndef F103ST7735_H_
#define F103ST7735_H_

/*
 * https://count-zero.ru/2022/display/#10
 */

#define st7735sizeX 128
#define st7735sizeY 160

// some flags for initR() :(
#define INITR_GREENTAB 0x00
#define INITR_REDTAB 0x01
#define INITR_BLACKTAB 0x02
#define INITR_18GREENTAB INITR_GREENTAB
#define INITR_18REDTAB INITR_REDTAB
#define INITR_18BLACKTAB INITR_BLACKTAB
#define INITR_144GREENTAB 0x01
#define INITR_MINI160x80 0x04
#define INITR_HALLOWING 0x05

// Some register settings
#define ST7735_MADCTL_BGR 0x08
#define ST7735_MADCTL_MH 0x04

#define ST7735_FRMCTR1 0xB1
#define ST7735_FRMCTR2 0xB2
#define ST7735_FRMCTR3 0xB3
#define ST7735_INVCTR 0xB4
#define ST7735_DISSET5 0xB6

#define ST7735_PWCTR1 0xC0
#define ST7735_PWCTR2 0xC1
#define ST7735_PWCTR3 0xC2
#define ST7735_PWCTR4 0xC3
#define ST7735_PWCTR5 0xC4
#define ST7735_VMCTR1 0xC5

#define ST7735_PWCTR6 0xFC

#define ST7735_GMCTRP1 0xE0
#define ST7735_GMCTRN1 0xE1

// Some ready-made 16-bit ('565') color settings:
#define ST7735_BLACK ST77XX_BLACK
#define ST7735_WHITE ST77XX_WHITE
#define ST7735_RED ST77XX_RED
#define ST7735_GREEN ST77XX_GREEN
#define ST7735_BLUE ST77XX_BLUE
#define ST7735_CYAN ST77XX_CYAN
#define ST7735_MAGENTA ST77XX_MAGENTA
#define ST7735_YELLOW ST77XX_YELLOW
#define ST7735_ORANGE ST77XX_ORANGE

#define ST_CMD_DELAY 0x80 // special signifier for command lists

#define ST77XX_NOP 0x00
#define ST77XX_SWRESET 0x01
#define ST77XX_RDDID 0x04
#define ST77XX_RDDST 0x09

#define ST77XX_SLPIN 0x10
#define ST77XX_SLPOUT 0x11
#define ST77XX_PTLON 0x12
#define ST77XX_NORON 0x13

#define ST77XX_INVOFF 0x20
#define ST77XX_INVON 0x21
#define ST77XX_DISPOFF 0x28
#define ST77XX_DISPON 0x29
#define ST77XX_CASET 0x2A
#define ST77XX_RASET 0x2B
#define ST77XX_RAMWR 0x2C
#define ST77XX_RAMRD 0x2E

#define ST77XX_PTLAR 0x30
#define ST77XX_TEOFF 0x34
#define ST77XX_TEON 0x35
#define ST77XX_MADCTL 0x36
#define ST77XX_COLMOD 0x3A

#define ST77XX_MADCTL_MY 0x80
#define ST77XX_MADCTL_MX 0x40
#define ST77XX_MADCTL_MV 0x20
#define ST77XX_MADCTL_ML 0x10
#define ST77XX_MADCTL_RGB 0x00

#define ST77XX_RDID1 0xDA
#define ST77XX_RDID2 0xDB
#define ST77XX_RDID3 0xDC
#define ST77XX_RDID4 0xDD

// Some ready-made 16-bit ('565') color settings:
#define ST77XX_BLACK 0x0000
#define ST77XX_WHITE 0xFFFF
#define ST77XX_RED 0xF800
#define ST77XX_GREEN 0x07E0
#define ST77XX_BLUE 0x001F
#define ST77XX_CYAN 0x07FF
#define ST77XX_MAGENTA 0xF81F
#define ST77XX_YELLOW 0xFFE0
#define ST77XX_ORANGE 0xFC00

void f103st7735init(void);
void f103st7735fillScreen(uint16_t value);
void f103st7735fillRect(uint16_t value, unsigned short x0, unsigned short y0, unsigned short x1, unsigned short y1);

#endif /* F103ST7735_H_ */



/*
 * f103st7735.c
 *
 *  Created on: 6 июн. 2023 г.
 *      Author: seleznev_a
 *
 *      ST7735 pins ->  STM32F103C8T6 pins
 *      1 GND -> GND
 *      2 VCC -> 3.3 V
 *      3 SCK -> PA5 SCK SPI1
 *      4 SDA -> PA7 MOSI SPI1
 *      5 RES -> PB1
 *      6 RS(A0) -> PB10
 *      7 CS -> PB11
 *      8 LEDA -> 3.3 V
 *
 */

#include "stm32f10x.h"
#include "f103c8t6.h"
#include "f103st7735.h"

void tftCSenable(void) {GPIOB->BSRR |= GPIO_BSRR_BR11;} // PB11 LOW // говорим slave устройству что начинаем работать

void tftCSdisable(void) {GPIOB->BSRR |= GPIO_BSRR_BS11;} // PB11 HIGH // закончили передачу SPI устройству

/*
 * http://dimoon.ru/obuchalka/stm32f1/programmirovanie-stm32-chast-6-spi.ht...
 */
void initSPI(void) {
	//Включаем тактирование SPI1 и GPIOA
	RCC->APB2ENR |= RCC_APB2ENR_SPI1EN | RCC_APB2ENR_IOPAEN;
	//Для начала сбрасываем все конфигурационные биты в нули
	GPIOA->CRL &= ~(GPIO_CRL_CNF5 | GPIO_CRL_MODE5 | GPIO_CRL_CNF6 | GPIO_CRL_MODE6 | GPIO_CRL_CNF7 | GPIO_CRL_MODE7);
	//Настроаиваем
	//SCK: MODE5 = 0x03 (11b); CNF5 = 0x02 (10b)
	GPIOA->CRL |= GPIO_CRL_CNF5_1 | GPIO_CRL_MODE5;
	//MISO: MODE6 = 0x00 (00b); CNF6 = 0x01 (01b)
	GPIOA->CRL |= GPIO_CRL_CNF6_0;
	//MOSI: MODE7 = 0x03 (11b); CNF7 = 0x02 (10b)
	GPIOA->CRL |= GPIO_CRL_CNF7_1 | GPIO_CRL_MODE7;
	// Вывод NSS не трогаем, так как не будем его использовать. Далее, настройка SPI:
	SPI1->CR1 &= ~SPI_CR1_DFF; //Размер кадра 8 бит
	SPI1->CR1 &= ~SPI_CR1_LSBFIRST; //MSB first
	SPI1->CR1 |= SPI_CR1_SSM; //Программное управление SS
	SPI1->CR1 |= SPI_CR1_SSI; //SS в высоком состоянии
	SPI1->CR1 &= ~SPI_CR1_BR; // reset // 0x00 Скорость передачи: F_PCLK/2
	//SPI1->CR1 |= SPI_CR1_BR_2; // 0x04 Скорость передачи: F_PCLK/32
	SPI1->CR1 |= SPI_CR1_MSTR; //Режим Master (ведущий)
	SPI1->CR1 &= ~SPI_CR1_CPOL; //Режим работы SPI: 0
	SPI1->CR1 &= ~SPI_CR1_CPHA; //Режим работы SPI: 0
	SPI1->CR1 |= SPI_CR1_SPE; //Включаем SPI
}

void f1tftSendCommand(unsigned char cmd) {
	GPIOB->BSRR |= GPIO_BSRR_BR10; // PB10 LOW
	SPI1->DR = cmd;
	while (!(SPI1->SR & SPI_SR_TXE) || (SPI1->SR & SPI_SR_BSY));
}

void f1tftWriteData(unsigned char * buff, unsigned short buff_size) {
	GPIOB->BSRR |= GPIO_BSRR_BS10; // PB10 HIGH
	for(unsigned short i = 0; i < buff_size; ++i) {
		while (!(SPI1->SR & SPI_SR_TXE));
		SPI1->DR = *(buff+i);
	}
	while (!(SPI1->SR & SPI_SR_TXE) || (SPI1->SR & SPI_SR_BSY));
}

void f1tftSetAddrWindow(unsigned short x0, unsigned short y0, unsigned short x1, unsigned short y1) {
	static unsigned char pos_data[4];
	// column address set
	f1tftSendCommand(ST77XX_CASET); // CASET
	pos_data[0] = (x0 & 0xFF00) >> 8;
	pos_data[1] = x0 & 0x00FF;
	pos_data[2] = (x1 & 0xFF00) >> 8;
	pos_data[3] = x1 & 0x00FF;
	f1tftWriteData((unsigned char *)&pos_data, 4);
	// row address set
	f1tftSendCommand(ST77XX_RASET); // RASET
	pos_data[0] = (y0 & 0xFF00) >> 8;
	pos_data[1] = y0 & 0x00FF;
	pos_data[2] = (y1 & 0xFF00) >> 8;
	pos_data[3] = y1 & 0x00FF;
	f1tftWriteData((unsigned char *)&pos_data, 4);
	// write to RAM
	f1tftSendCommand(ST77XX_RAMWR); // RAMWR
}

void f103st7735fillRect(uint16_t value, unsigned short x0, unsigned short y0, unsigned short x1, unsigned short y1) {
	tftCSenable(); // chip select on
	f1tftSetAddrWindow(x0, y0, x1, y1);
    GPIOB->BSRR |= GPIO_BSRR_BS10; // PB10 HIGH
    // 8 bit transfer mode
    /*uint8_t c1=value>>8;
    uint8_t c2=(uint8_t)value;
    for (uint16_t i=0; i < (uint16_t)((x1-x0+1)*(y1-y0+1)); i++) {
		while (!(SPI1->SR & SPI_SR_TXE));
		SPI1->DR = c1;
		while (!(SPI1->SR & SPI_SR_TXE));
		SPI1->DR = c2;
    }*/
    // 16 bit transfer mode
	SPI1->CR1 &= ~SPI_CR1_SPE;
	SPI1->CR1 |= SPI_CR1_DFF;
	SPI1->CR1 |= SPI_CR1_SPE;
    for (uint16_t i=0; i < (uint16_t)((x1-x0+1)*(y1-y0+1)); i++) {
		while (!(SPI1->SR & SPI_SR_TXE));
		SPI1->DR = value;
    }
    // wait end transfer
	while (!(SPI1->SR & SPI_SR_TXE) || (SPI1->SR & SPI_SR_BSY));
    // return 8bit transfer mode
	SPI1->CR1 &= ~SPI_CR1_SPE;
	SPI1->CR1 &= ~SPI_CR1_DFF;
	SPI1->CR1 |= SPI_CR1_SPE;
	tftCSdisable(); // chip select off
}

void f103st7735fillScreen(uint16_t value) {
	f103st7735fillRect(value, 0, 0, st7735sizeX-1, st7735sizeY-1);
}

void initGpio(void) {
	// PB1 - RESET ST7735
	RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // GPIO port B
	GPIOB->CRL &= ~GPIO_CRL_MODE1; // 00: Input mode (reset state)
	GPIOB->CRL |= GPIO_CRL_MODE1_0; // 01: Output mode, max speed 10 MHz.
	GPIOB->CRL &= ~GPIO_CRL_CNF1; // 00: General purpose output push-pull
	// PB10 - RS(A0) ST7735 cmd/data select
	GPIOB->CRH &= ~GPIO_CRH_MODE10; // 00: Input mode (reset state)
	GPIOB->CRH |= GPIO_CRH_MODE10_0; // 01: Output mode, max speed 10 MHz.
	GPIOB->CRH &= ~GPIO_CRH_CNF10; // 00: General purpose output push-pull
	// PB11 - CS ST7735
	GPIOB->CRH &= ~GPIO_CRH_MODE11; // 00: Input mode (reset state)
	GPIOB->CRH |= GPIO_CRH_MODE11_0; // 01: Output mode, max speed 10 MHz.
	GPIOB->CRH &= ~GPIO_CRH_CNF11; // 00: General purpose output push-pull
}

void f103st7735init(void) {
	initGpio();
	tftCSdisable(); // chip select off
	initSPI();
	// hardware reset
	GPIOB->BSRR |= GPIO_BSRR_BR1; // PB1 LOW
	delay_ms(10);
	GPIOB->BSRR |= GPIO_BSRR_BS1; // PB1 HIGH
	delay_ms(10);
	// init routine
	tftCSenable();

	unsigned char dataSend[16];

	f1tftSendCommand(ST77XX_SWRESET); // 0x01
	delay_ms(150);
	f1tftSendCommand(ST77XX_SLPOUT); // 0x11
	delay_ms(150);

	f1tftSendCommand(ST7735_FRMCTR1); // 0xB1
	dataSend[0] = 0x01;
	dataSend[1] = 0x2C;
	dataSend[2] = 0x2D;
	f1tftWriteData((unsigned char *)&dataSend, 3);

	f1tftSendCommand(ST7735_FRMCTR2);
	dataSend[0] = 0x01;
	dataSend[1] = 0x2C;
	dataSend[2] = 0x2D;
	f1tftWriteData((unsigned char *)&dataSend, 3);

    f1tftSendCommand(ST7735_FRMCTR3);
	dataSend[0] = 0x01;
	dataSend[1] = 0x2C;
	dataSend[2] = 0x2D;
	dataSend[3] = 0x01;
	dataSend[4] = 0x2C;
	dataSend[5] = 0x2D;
	f1tftWriteData((unsigned char *)&dataSend, 6);

    f1tftSendCommand(ST7735_INVCTR);
	dataSend[0] = 0x07;
	f1tftWriteData((unsigned char *)&dataSend, 1);

    f1tftSendCommand(ST7735_PWCTR1);
	dataSend[0] = 0xA2;
	dataSend[1] = 0x02;
	dataSend[2] = 0x84;
	f1tftWriteData((unsigned char *)&dataSend, 3);

    f1tftSendCommand(ST7735_PWCTR2);
	dataSend[0] = 0xC5;
	f1tftWriteData((unsigned char *)&dataSend, 1);

	f1tftSendCommand(ST7735_PWCTR3);
	dataSend[0] = 0x0A;
	dataSend[1] = 0x00;
	f1tftWriteData((unsigned char *)&dataSend, 2);

    f1tftSendCommand(ST7735_PWCTR4);
	dataSend[0] = 0x8A;
	dataSend[1] = 0x2A;
	f1tftWriteData((unsigned char *)&dataSend, 2);

    f1tftSendCommand(ST7735_PWCTR5);
	dataSend[0] = 0x8A;
	dataSend[1] = 0xEE;
	f1tftWriteData((unsigned char *)&dataSend, 2);

    f1tftSendCommand(ST7735_VMCTR1);
	dataSend[0] = 0x0E;
	f1tftWriteData((unsigned char *)&dataSend, 1);

	f1tftSendCommand(ST77XX_INVOFF);

	f1tftSendCommand(ST77XX_MADCTL);
	dataSend[0] = 0xC0;
	f1tftWriteData((unsigned char *)&dataSend, 1);

    f1tftSendCommand(ST77XX_COLMOD);
	dataSend[0] = 0x05;
	f1tftWriteData((unsigned char *)&dataSend, 1);

    f1tftSendCommand(ST7735_GMCTRP1);
    dataSend[0] = 0x02;
    dataSend[1] = 0x1C;
    dataSend[2] = 0x07;
    dataSend[3] = 0x12;
    dataSend[4] = 0x37;
    dataSend[5] = 0x32;
    dataSend[6] = 0x29;
    dataSend[7] = 0x2D;
    dataSend[8] = 0x29;
    dataSend[9] = 0x25;
    dataSend[10] = 0x2B;
    dataSend[11] = 0x39;
    dataSend[12] = 0x00;
    dataSend[13] = 0x01;
    dataSend[14] = 0x03;
    dataSend[15] = 0x10;
	f1tftWriteData((unsigned char *)&dataSend, 16);

	f1tftSendCommand(ST7735_GMCTRN1);
	dataSend[0] = 0x03;
	dataSend[1] = 0x1D;
	dataSend[2] = 0x07;
	dataSend[3] = 0x06;
	dataSend[4] = 0x2E;
	dataSend[5] = 0x2C;
	dataSend[6] = 0x29;
	dataSend[7] = 0x2D;
	dataSend[8] = 0x2E;
	dataSend[9] = 0x2E;
	dataSend[10] = 0x37;
	dataSend[11] = 0x3F;
	dataSend[12] = 0x00;
	dataSend[13] = 0x00;
	dataSend[14] = 0x02;
	dataSend[15] = 0x10;
	f1tftWriteData((unsigned char *)&dataSend, 16);

	f1tftSendCommand(ST77XX_NORON);
	delay_ms(10);
    f1tftSendCommand(ST77XX_DISPON);
    delay_ms(100);

	tftCSdisable();
}




 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Можно ещё немного поднять скорость

 while (!(SPI1->SR & SPI_SR_TXE));

это убрать и подогнать NOPами так что бы писать сразу как поднимется флаг

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Komandir пишет:

Можно ещё немного поднять скорость

 while (!(SPI1->SR & SPI_SR_TXE));

это убрать и подогнать NOPами так что бы писать сразу как поднимется флаг

пробовал, на больших скоростях SPI появляются артефакты на дисплее, уж лучше пусть будет помедленнее, но стабильнее.