Witam,
Jestem nowym użytkownikiem tego forum oraz osoba uczącą się obecnie zarówno programowania jak i elektryki/elektroniki. Od jakiegoś czasu bawię się STM32. Uczę się z różnych źródeł a jedną z nich jest książka: "Aplikacje i ćwiczenia w języku C z biblioteką HAL" Marka Galewskiego. Książka dedykowana do STM32, język programowania C a piszemy na pewnym zestawie uruchomieniowym. Ja tego zestawu uruchomieniowego nie mam, postanowiłem budować układy na płytkach stykowych z własnych elementów.
Jedno z ćwiczeń, początkowe. Zapalanie diod - 5 diod, 5 przycisków. Każdy przycisk do konkretnej diody - zapalenie i wyłączenie. Ćwiczenie to zrobiłem. Kolejne ćwiczenie: zapalanie diod przyciskami lub joystickiem. Celem ćwiczenia jest zapalenie kolejnej diody poprzez wychylenie joysticku lub wciśniecie przycisku (do wyboru). I teraz: zestaw uruchomieniowy ma joystick 5 pozycyjny (składający się z 5 mikrowyłączników). Ja natomiast użyłem joisticka analogowego. Udało mi się napisać program który obsługuje joystick analogowy tak jak sobie tego życzę: Wychylenie w lewo zapala diodę 1, w góre 2, w prawo 3, w dół 4, naciśniecie diodę 5. Nie potrafię jednak napisać kodu który obsługiwałby jednocześnie i joystick i przyciski (mikrowyłączniki). W moim programie przy wychylaniu joysticka diody zapalają się pełnym światłem jak napisałem wyżej, natomiast przy naciśnięciu przycisku widać tylko minimalne żarzenie się pomiędzy anodą a katodą w ledzie. Gdy usunę fragment kodu odpowiedzialny za obsługę joysticka, diody uruchamiane przyciskiem palą się pełnym światłem.
Jak połączyć te dwie funkcjonalności, bym daną diodę mógł zapalić jednocześnie i odpowiednim wychyleniem Joystickiem oraz przyciskiem. Fragment kodu obsługujący joystick i przyciski w obecnym kształcie zamieszczam poniżej - jak połączyć te dwie instrukcje i dać alternatywę, Joystick lub przycisk? Moim pomysłem jest zbudowanie instrukcji switch gdzie case 0 to kod odpowiedzialny za zapalanie diody nr 1 przyciskiem, case 1 zapalenie diody nr 1 joystickiem itd. Zrobiłem już takie podejście ale efekt był taki, że diody nie zapalały się ani przyciskami ani joystickiem mimo braku błędów przy kompilacji.
/* USER CODE BEGIN WHILE */
volatile static uint16_t joystick[2];
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)joystick, 2);
while (1)
{
// Obsługa przycisków
//-------------------------------------------------------------Dioda zielona, przycisk 1
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_13)){
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_RESET);
}else{
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_SET);
}
//-----------------------------------------------------------------Dioda czerwona, przycisk 2
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_14)){
HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_RESET);
}else{
HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_SET);
}
//-----------------------------------------------------------------Dioda żółta, przycisk 3
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4)){
HAL_GPIO_WritePin(GPIOB, LED3_Pin, GPIO_PIN_RESET);
}else{
HAL_GPIO_WritePin(GPIOB, LED3_Pin, GPIO_PIN_SET);
}
//-----------------------------------------------------------------Dioda niebieska, przycisk 4
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15)){
HAL_GPIO_WritePin(GPIOB, LED4_Pin, GPIO_PIN_RESET);
}else{
HAL_GPIO_WritePin(GPIOB, LED4_Pin, GPIO_PIN_SET);
}
//-----------------------------------------------------------------Dioda biała, przycisk 5 - przycisk w joysticku
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)){
HAL_GPIO_WritePin(LED5_GPIO_Port, LED5_Pin, GPIO_PIN_RESET);
} else {
HAL_GPIO_WritePin(LED5_GPIO_Port, LED5_Pin, GPIO_PIN_SET);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// Obsługa joysticka
if ((joystick[0]>=2000) && (joystick[0]<=3000))
{
HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, LED4_Pin, GPIO_PIN_RESET);
}
if ((joystick[1]>=2000) && (joystick[1]<=3000))
{
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, LED3_Pin, GPIO_PIN_RESET);
}
if ((joystick[0]>=4000))
{
HAL_GPIO_WritePin(GPIOB, LED4_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_RESET);
}
if ((joystick[0]<=800))
{
HAL_GPIO_WritePin(GPIOB, LED4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_SET);
}
if ((joystick[1]>=4000))
{
HAL_GPIO_WritePin(GPIOB, LED3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_SET);
}
if ((joystick[1]<=800))
{
HAL_GPIO_WritePin(GPIOB, LED3_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_RESET);
}
}
/* USER CODE END 3 */