Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av Klas-Kenny »

DanielM skrev: 2 juni 2021, 22:52:12 Här är första funktionen som programmet anropar.
Körs inte HAL_Init() först?

Tror att lite relevanta klockor mm aktiveras därifrån.
DanielM
Inlägg: 2165
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Den körs först, svar ja.

Men jag ska göra som TomasL säger. Jag får prova mig med olika kondensatorer och kristaller samt kolla med skåpet hur CMOS signalerna ser ut.

Såg nu att man använda HSE som klocka för RTC. Jaha? Varför har jag inte märkt detta? Jag har ju extern kristall för att köra RTC.
Användarvisningsbild
rvl
Inlägg: 5719
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av rvl »

Gissar nog mer på programstrul än kondensatorerna, men du kan ju försöka räkna strökapacitansen.
DanielM
Inlägg: 2165
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Alltså jag har gjort väldigt många beräkningar på just LSE och HSE och jag har aldrig misslyckats någon gång, förutom denna gång. Jag är väldigt noggrann när det kommer till beräkningar.
Men jag tror att jag har valt dåliga kondensatorer, eller så har JLCPCB valt 15nF istället för 15pF.

Tror inte CubeMX har klantat till sig på LSE. Detta skulle märkas direkt.
Användarvisningsbild
rvl
Inlägg: 5719
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av rvl »

Menade stökapcitancen mellan ledarna på just dit fysiska kort, baserat på areal, avstånd osv. Som du sen i sin tur använder i formlerna för lastkapacitansen.
Lät som om 5 pF var taget ur luften, men det är förmodligen "i rätt härad".
DanielM
Inlägg: 2165
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Faktiskt så stod det i STM32 manual att man kan anta att strökapacitansen kan vara 5pF. Jag vet inte varför. Men det stod det iallafall. Så jag följde bara rekommendationerna så gott som det gick.
DanielM
Inlägg: 2165
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Nu har jag ett annat känt problem som jag ej hittar en lösning på. Jag nu försökt i 2 dagar med att lösa detta problem.

Det är så att när jag får pinne PD3 att gå från hög->låg så aktiveras en interrupt.

Kod: Markera allt

/* Callbacks for external interrupt */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	/* We have pressed on the touch screen -> TS_IRQ falling edge */
	if(GPIO_Pin == TS_IRQ_Pin) {
		TSC2046_TS_IRQ();
	}
}
Denna function

Kod: Markera allt

TSC2046_TS_IRQ();
gör anropar SPI och skickar ett meddelande. Men när detta händer, så anropas interrupt igen och samma funktion körs om och om och om och om igen. Hela tiden.

Detta blir första #1 gången när interrupt körs.
Skärmklipp.PNG
Om jag kör vidare med koden utan att göra något. Då hamnar jag på samma ställe igen, fast nu så har den kört SPI-Transmit också. Varför blir det så här? Jag hade tanken att interupt ska bara köras en gång
Skärmklipp.PNG
Efter ett tag så kommer jag loss från interupt funktionen efter att ha klickat mig framåt. Stegat eller vad det nu heter.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av ToPNoTCH »

Den där koden kan knappast leda till hjälp.

Det är ju standard callback rutinen.

Vad gör du i "TSC2046_TS_IRQ();" ?
DanielM
Inlägg: 2165
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Så här ser hela koden ut.

Men det är här problemet kommer.

Kod: Markera allt

static uint16_t TSC2046_SendCommand(uint8_t cmd) {
	uint8_t lcdBuf[3] = { 0, 0, 0 };
	uint16_t return16 = 0;

	HAL_GPIO_WritePin(lcd.TOUCH_CS_PORT, lcd.TOUCH_CS_PIN, GPIO_PIN_RESET);
	lcdBuf[0] = cmd;
	HAL_SPI_Transmit(lcd.touchSpi, lcdBuf, 1, 10);   // <----- HÄR är problemet.
	//Wait for response (3 ms)
	//HAL_Delay(3);
	if (HAL_SPI_Receive(lcd.touchSpi, &lcdBuf[1], 2, 10) == HAL_OK) {
		return16 = (lcdBuf[1] << 4) + (lcdBuf[2] >> 4);
	} else {
		return16 = 0;
	}
	HAL_GPIO_WritePin(lcd.TOUCH_CS_PORT, lcd.TOUCH_CS_PIN, GPIO_PIN_SET);

	return return16;
}

Kod: Markera allt

// Send TSC2046 Command and wait for a response
static uint16_t TSC2046_SendCommand(uint8_t cmd) {
	uint8_t lcdBuf[3] = { 0, 0, 0 };
	uint16_t return16 = 0;

	HAL_GPIO_WritePin(lcd.TOUCH_CS_PORT, lcd.TOUCH_CS_PIN, GPIO_PIN_RESET);
	lcdBuf[0] = cmd;
	HAL_SPI_Transmit(lcd.touchSpi, lcdBuf, 1, 10);
	//Wait for response (3 ms)
	//HAL_Delay(3);
	if (HAL_SPI_Receive(lcd.touchSpi, &lcdBuf[1], 2, 10) == HAL_OK) {
		return16 = (lcdBuf[1] << 4) + (lcdBuf[2] >> 4);
	} else {
		return16 = 0;
	}
	HAL_GPIO_WritePin(lcd.TOUCH_CS_PORT, lcd.TOUCH_CS_PIN, GPIO_PIN_SET);

	return return16;
}

// Get x-axis raw touch 12-bit value
static uint16_t TSC2046_getRaw_X() {
	return TSC2046_SendCommand(CMD_X_AXIS | lcd.CMD_Default);
}
// Get y-axis raw touch 12-bit value
static uint16_t TSC2046_getRaw_Y() {
	return TSC2046_SendCommand(CMD_Y_AXIS | lcd.CMD_Default);
}
/* Get z-axis raw touch 12-bit value
static uint16_t TSC2046_getRaw_Z() {
	return TSC2046_SendCommand(CMD_Z_AXIS | lcd.CMD_Default);
}*/

// Print calibration points
// Top-Left corner point
static void TSC2046_TL_point() {
	ILI9341_fillCircle(1, 1, 3, COLOR_RED);
	ILI9341_printText("Press here", 20, 30, COLOR_RED, COLOR_RED, 1);
}
// Bottom-Right corner point
static void TSC2046_BR_point() {
	ILI9341_fillCircle(lcd.myTS_Calibrate.Width - 1, lcd.myTS_Calibrate.Height - 1, 3, COLOR_RED);
	ILI9341_printText("Press here", lcd.myTS_Calibrate.Width - 80, lcd.myTS_Calibrate.Height - 40, COLOR_RED, COLOR_RED, 1);
}

// Poll for touch status
static void TSC2046_GetRawTouch() {

	// Assign raw touch based on orientation
	switch (lcd.ScreenOrientation) {
	case 1:
		lcd.localRawTouch.x_touch = 4095 - TSC2046_getRaw_X();
		lcd.localRawTouch.y_touch = TSC2046_getRaw_Y(lcd);
		lcd.myTS_Calibrate.Width = 230;
		lcd.myTS_Calibrate.Height = 320;
		break;

	case 2:
		lcd.localRawTouch.x_touch = 4095 - TSC2046_getRaw_Y();
		lcd.localRawTouch.y_touch = 4095 - TSC2046_getRaw_X();
		lcd.myTS_Calibrate.Width = 320;
		lcd.myTS_Calibrate.Height = 240;
		break;

	case 3:
		lcd.localRawTouch.x_touch = TSC2046_getRaw_X();
		lcd.localRawTouch.y_touch = 4095 - TSC2046_getRaw_Y();
		lcd.myTS_Calibrate.Width = 230;
		lcd.myTS_Calibrate.Height = 320;
		break;

	case 4:
		lcd.localRawTouch.x_touch = TSC2046_getRaw_Y();
		lcd.localRawTouch.y_touch = TSC2046_getRaw_X();
		lcd.myTS_Calibrate.Width = 320;
		lcd.myTS_Calibrate.Height = 240;
		break;
	}
	// These are for the calibration
	lcd.myRawTouchDef.x_touch = lcd.localRawTouch.x_touch;
	lcd.myRawTouchDef.y_touch = lcd.localRawTouch.y_touch;
}

// Calibrate resistive touch panel
void TSC2046_Calibrate() {
	// Set rotation
	ILI9341_setRotation(2);

	// For every time we touch the LCD, then TS_IRQ pin falling edge . Interrupt is called
	lcd.calibration_mode = 1;
	lcd.myTS_Calibrate.TL_X = 0;
	lcd.myTS_Calibrate.TL_Y = 0;
	lcd.myTS_Calibrate.BR_X = 0;
	lcd.myTS_Calibrate.BR_Y = 0;
	lcd.myRawTouchDef.y_touch = 0;
	lcd.myRawTouchDef.x_touch = 0;

	// Get Top-Left corner calibration coordinate
	TSC2046_TL_point(lcd);
	lcd.myTsData.isPressed = 0;
	while (1) {
		if (lcd.myTsData.isPressed) {
			for (uint8_t i = 0; i < 10; i++) {
				TSC2046_GetRawTouch(lcd);
				lcd.myTS_Calibrate.TL_X += lcd.myRawTouchDef.x_touch;
				lcd.myTS_Calibrate.TL_Y += lcd.myRawTouchDef.y_touch;
			}
			break;
		}
		HAL_Delay(10);
	}
	HAL_Delay(1000);

	// Get Bottom-Right corner calibration coordinate
	TSC2046_BR_point(lcd);
	lcd.myTsData.isPressed = 0;
	while (1) {
		if (lcd.myTsData.isPressed) {
			for (uint8_t i = 0; i < 10; i++) {
				TSC2046_GetRawTouch(lcd);
				lcd.myTS_Calibrate.BR_X += lcd.myRawTouchDef.x_touch;
				lcd.myTS_Calibrate.BR_Y += lcd.myRawTouchDef.y_touch;
			}
			break;
		}
		HAL_Delay(10);
	}

	lcd.myTS_Calibrate.TL_X *= 0.1;
	lcd.myTS_Calibrate.TL_Y *= 0.1;

	lcd.myTS_Calibrate.BR_X *= 0.1;
	lcd.myTS_Calibrate.BR_Y *= 0.1;

	// Calculate scalar
	lcd.myTS_Calibrate.Scale_X = (lcd.myTS_Calibrate.Width + 0.0f) / (lcd.myTS_Calibrate.BR_X - lcd.myTS_Calibrate.TL_X + 0.0f);
	lcd.myTS_Calibrate.Scale_Y = (lcd.myTS_Calibrate.Height + 0.0f) / (lcd.myTS_Calibrate.BR_Y - lcd.myTS_Calibrate.TL_Y + 0.0f);

	// Calculate bias
	lcd.myTS_Calibrate.Bias_X = -1 - lcd.myTS_Calibrate.Scale_X * lcd.myTS_Calibrate.TL_X; // -1 is for bias. Change this so you have 100% accuracy at center of the LCD
	lcd.myTS_Calibrate.Bias_Y = -1 - lcd.myTS_Calibrate.Scale_Y * lcd.myTS_Calibrate.TL_Y; // -1 is for bias. Change this so you have 100% accuracy at center of the LCD

	// Calibration done
	lcd.calibration_mode = 0;
	lcd.myTsData.isPressed = 0;
}

// Get touch screen data when calibration is already made
void TSC2046_GetTouchData() {

	uint16_t temp16x = 0, temp16y = 0;
	lcd.calibration_mode = 0;
	// Read touch data
	for (uint8_t i = 0; i < 10; i++) {
		TSC2046_GetRawTouch(lcd);
		temp16x += lcd.localRawTouch.x_touch;
		temp16y += lcd.localRawTouch.y_touch;
	}
	lcd.localRawTouch.x_touch = temp16x * 0.1;
	lcd.localRawTouch.y_touch = temp16y * 0.1;

	// X-axis value
	lcd.myTsData.X = lcd.myTS_Calibrate.Scale_X * lcd.localRawTouch.x_touch + lcd.myTS_Calibrate.Bias_X;

	// Y-axis value
	lcd.myTsData.Y = lcd.myTS_Calibrate.Scale_Y * lcd.localRawTouch.y_touch + lcd.myTS_Calibrate.Bias_Y;
}

void TSC2046_TS_IRQ() {
	if (lcd.calibration_mode == 1) {
		lcd.myTsData.isPressed = 1; // Only call this because we want raw touch screen XY-positions
	} else {
		lcd.myTsData.isPressed = 1;
		TSC2046_GetTouchData(lcd); // In this case, we have already calibrated the LCD
	}
}
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av ToPNoTCH »

Det låter som ett klassiskt "för mycket pyssel i servicerutinen så det hinns inte med innan avbrottet kickar in igen" fel.

Aldrig massa kod i service rutinen. Sätt en flagga eller något och agera på den istället.

Sen låter det ju som att du vill avbrottshantera när man trycker på en touch skärm.

Då kommer ju allt sådant som debouncing och grejor in i bilden (man lär ju släppa fingret innan man vill ha en ny interrupt etc.)
DanielM
Inlägg: 2165
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Okej. Så det är dålig praktik att ha "många operationer" i en interrupt?
Jo, jag känner till att det studsar lite.

Orsaken varför jag valde en interrupt är för att det finns en pinne på min LCD som heter T_IRQ som är en interrupt-pinne som går från hög->låg när man tar på skärmen.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av sodjan »

Det är så klart inget "dåligt" med interupt rent generellt.
Det handlar om design, d.v.s. vad man "gör" med interuptet då det inträffar.
En balans mellan interupt frekvens och vad som sker vid varje tillfälle. o.s.v.
DanielM
Inlägg: 2165
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

I detta fall så vill jag läsa utav XY värden på min LCD när jag tar på den.
Normalt så mätte jag djupet på LCD och var djupet mer än 50 så indikerade det att jag har tagit på den. Men jag föredrar en interrupt istället då det känns mer professionellt.

Men kan man säga då att en interrupt ska inte göra något större logikkod, utan mest bara göra enkla saker t.ex. sätta flaggor?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av sodjan »

Ska och ska... Det beror på hur ofta det beräknas inträffa och hur länge som
du kan vara "borta" från den ordinarie koden. Det beror på, helt enkelt.

En annan metod för att kolla sådant som "human input" är att ha en rutin
på ett timer-interupt som kollar ingångarna. Men som sagt, det beror på.
DanielM
Inlägg: 2165
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Hmm...Det verkar som att en interrupt inte alls fungerar bra för mig. Jag får nog använda en vanlig while loop som läser om TS_IRQ blir låg.

Denna kod loopar hela tiden. Än fast jag har dragit ut kabeln till interrupt-pinnen, så loopar denna fortfarande.

Kod: Markera allt

/* Callbacks for external interrupt */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	/* We have pressed on the touch screen -> TS_IRQ falling edge */
	if(GPIO_Pin == TS_IRQ_Pin) {
		lcd.myTsData.isPressed = 1;
	}
}
Skriv svar