Skocz do zawartości

Zapalania przyciskiem poszczególnych diod [ STM32F407VG ]


pepe450

Pomocna odpowiedź

Witam prosił bym o poradę jak napisać program, który będzie zapalał przyciskiem określoną diodę. Napisałem program który po wciśnięciu przycisku gasi diodę działa on prawidłowo natomiast nie wiem jak napisać program, który diodę przyciskiem będzie zapalał.

Mój dotychczasowy kod:

#include "stm32f4xx_conf.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
int main(void)
{
SystemInit();
//Wlaczenie generatora sygnalu zegarowego
//a następnie doprowadzenia sygnału zegarowego do portów,
//które mają być wykorzystane
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */
GPIO_InitTypeDef GPIO_InitStructure;
//Pole GPIO_Pin zawiera informację o tym,
//które wyprowadzenia portu maja zostać zainicjalizowane.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
//Pole GPIO_Mode zawiera informację o trybie działania wyprowadzenia
//GPIO_Mode_IN - wejście binarne
//GPIO_Mode_OUT - wyjście binarne
//GPIO_Mode_AF - funkcja alternatywna
//GPIO_Mode_AN - wejście analogowe
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//Pole GPIO_OType zawiera informację o typie wyjścia
//GPIO_OType_PP - wyjście komplementarne
//GPIO_OType_OD - wyjście z otwartym drenem
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
//Pole GPIO_Speed informuje o maksymalnej dozwolonej prędkości przełączania wyprowadzeń
//GPIO_Speed_2MHz
//GPIO_Speed_25MHz
//GPIO_Speed_50MHz
//GPIO_Speed_100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//Pole GPIO_PuPd zawiera konfigurację rodzaju podciągania wyprowadzenia
//GPIO_PuPd_NOPULL - brak podciągania
//GPIO_PuPd_UP - podciąganie do napięcia zasilania
//GPIO_PuPd_DOWN - ściąganie do masy
GPIO_Init(GPIOD, &GPIO_InitStructure);
//GPIO_SetBits służy do ustawiania portów GPIO mikrokontrolera w stan ‘1’
//GPIO_ResetBits służy do ustawiania portów GPIO mikrokontrolera w stan '0'
//GPIO_ReadInputDataBit służy do odczytania stanu pojedyńczego wyprowadzenia mikrokontrolera
unsigned int i=0;
   while(1)
   {
   	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
   		GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
   	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2))
   		GPIO_ToggleBits(GPIOD,GPIO_Pin_13);
   	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3))
   		GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
   	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))
   		GPIO_ToggleBits(GPIOD,GPIO_Pin_15);
   	GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15);
   }
}
Link do komentarza
Share on other sites

1) A wejść od przycisków to nie trzeba konfigurować? Nie jestem pewien, być może są ustawiane przy starcie w stan taki jak chcesz.

2) Schemat połączeń? Oszczędź nam domyślania się. Zarówno przyciski jak i diody.

Link do komentarza
Share on other sites

nie wiem jak skonfigurować te diody

Sama konfiguracja wyjść wydaje się być ok.

Problemem jest brak konfiguracji wejść, zastanów się co widzi mikrokontroler na pinie do którego masz podłączone przyciski z tej płytki co pokazałeś (co gdy przycisk jest wciśnięty, a co jak nie jest).

No i pomyśl jak działa Twój program (konkretniej pętla nieskończona), może sobie rozpisz po kolei kroki co się dzieje i jakie zachowanie diod powinieneś zaobserwować?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ja od razu podpowiem, że ten program nie ma prawa działać poprawnie. Popatrz na taki kod:

        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)) 
           GPIO_ToggleBits(GPIOD,GPIO_Pin_15); 
       GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15); 

Nawet jeśli udałoby Ci się poprawnie wysterować diodę w części GPIO_ToggleBits, to i tak kilka mikrosekund później wywołujesz GPIO_Reset Bits i ją gasisz - więc raczej program nie będzie działał zgodnie z oczekiwaniami.

Link do komentarza
Share on other sites

void delay(int time)
{
    int i;
    for (i = 0; i < time * 4000; i++) {}
}
   while(1)
   {

   	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0)
   	{
   		GPIO_SetBits(GPIOD,GPIO_Pin_12);
   		delay(5000);
   	}
   	else
   	{
   		GPIO_ResetBits(GPIOD, GPIO_Pin_12);
   		delay(5000);
   	}
   }

Ten fragment kodu powoduje że dioda zapala mi się i gaśnie co kilka sekund.

Lub też jeśli trzymam przycisk dioda świeci się cały czas.

Nie rozumiem natomiast dlaczego właśnie dioda cyklicznie się samoczynnie zapala (bez wciśnięcia przycisku). Przecież warunek if nie jest spełniony.

Link do komentarza
Share on other sites

#include "stm32f4xx_conf.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
int main(void)
{
SystemInit();
//Wlaczenie generatora sygnalu zegarowego
//a następnie doprowadzenia sygnału zegarowego do portów,
//które mają być wykorzystane
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */
GPIO_InitTypeDef GPIO_InitStructure;
//Pole GPIO_Pin zawiera informację o tym,
//które wyprowadzenia portu maja zostać zainicjalizowane.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
//Pole GPIO_Mode zawiera informację o trybie działania wyprowadzenia
//GPIO_Mode_IN - wejście binarne
//GPIO_Mode_OUT - wyjście binarne
//GPIO_Mode_AF - funkcja alternatywna
//GPIO_Mode_AN - wejście analogowe
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//Pole GPIO_OType zawiera informację o typie wyjścia
//GPIO_OType_PP - wyjście komplementarne
//GPIO_OType_OD - wyjście z otwartym drenem
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
//Pole GPIO_Speed informuje o maksymalnej dozwolonej prędkości przełączania wyprowadzeń
//GPIO_Speed_2MHz
//GPIO_Speed_25MHz
//GPIO_Speed_50MHz
//GPIO_Speed_100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//Pole GPIO_PuPd zawiera konfigurację rodzaju podciągania wyprowadzenia
//GPIO_PuPd_NOPULL - brak podciągania
//GPIO_PuPd_UP - podciąganie do napięcia zasilania
//GPIO_PuPd_DOWN - ściąganie do masy
GPIO_Init(GPIOD, &GPIO_InitStructure);
//GPIO_SetBits służy do ustawiania portów GPIO mikrokontrolera w stan ‘1’
//GPIO_ResetBits służy do ustawiania portów GPIO mikrokontrolera w stan '0'
//GPIO_ReadInputDataBit służy do odczytania stanu pojedyńczego wyprowadzenia mikrokontrolera
unsigned int i=0;
void delay(int time)
{
    int i;
    for (i = 0; i < time * 4000; i++) {}
}
   while(1)
   {

   	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0)
   	{
   		GPIO_SetBits(GPIOD,GPIO_Pin_12);
   		delay(5000);
   	}
   	else
   	{
   		GPIO_ResetBits(GPIOD, GPIO_Pin_12);
   		delay(5000);
   	}
   }
}

To mój cały kod.

Nie mam nic odnośnie przycisków. Ja to rozumie po prostu tak że przycisk przewodzi gdy jest wciśnięty.

Link do komentarza
Share on other sites

Nie mogę zrozumieć skąd to miganie diody co kilka sekund.

Na moje rozumowanie dioda powinna się tylko zapalać tylko gdy spełni się if

   while(1)
   {

   	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0)
   	{
   		GPIO_SetBits(GPIOD,GPIO_Pin_12);
   		delay(5000);
   	}
   	else
   	{
   		GPIO_ResetBits(GPIOD, GPIO_Pin_12);
   		delay(5000);
   	}
   }

A jak if może być spełniony nie wciskając nic?

Link do komentarza
Share on other sites

Coś ciężko idzie.

Jeśli przycisk przewodzi mam stan wysoki (1) a jeśli nie przewodzi mam stan niski (0), tak to rozumie.

To źle rozumiesz (dla tego konkretnego schematu i kodu co pokazałeś).

Nie masz rezystora podciągającego przy przycisku. Możesz go dodać jako osobny element lub wykorzystać wbudowane w mikrokontroler pull-upy.

Więc jak przycisk jest wciśnięty to mikrokontroler widzi 0V (stan 0), bo jest pin jest zwarty do masy. A jak przycisk nie przewodzi to pin sobie lata na wietrze, więc raz mikrokontroler widzi 0V, raz 3.3V.

Dodaj podciąganie pinu do 3.3V i przy rozwartym przycisku będziesz miał stabilnie 3.3V na pinie i wtedy możesz zabrać się za analizę działania programu.

Link do komentarza
Share on other sites

Chyba zaczynam rozumieć o co chodzi port pod który mam podpięty przycisk też trzeba skonfigurować.

Pytanie jakie parametry powinien mieć?

Przycisk powinien mieć

//GPIO_PuPd_UP - podciąganie do napięcia zasilania

//GPIO_PuPd_DOWN - ściąganie do masy

który parametr?

Kombinuje ale nie mogę zapalić diody

Teraz mój kod wygląda tak

#include "stm32f4xx_conf.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
int main(void)
{
SystemInit();
//Wlaczenie generatora sygnalu zegarowego
//a następnie doprowadzenia sygnału zegarowego do portów,
//które mają być wykorzystane
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */
GPIO_InitTypeDef Konfiguracja_Diody;
//Pole GPIO_Pin zawiera informację o tym,
//które wyprowadzenia portu maja zostać zainicjalizowane.
Konfiguracja_Diody.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
Konfiguracja_Diody.GPIO_Mode = GPIO_Mode_OUT;
//Pole GPIO_Mode zawiera informację o trybie działania wyprowadzenia
//GPIO_Mode_IN - wejście binarne
//GPIO_Mode_OUT - wyjście binarne
//GPIO_Mode_AF - funkcja alternatywna
//GPIO_Mode_AN - wejście analogowe
Konfiguracja_Diody.GPIO_OType = GPIO_OType_PP;
//Pole GPIO_OType zawiera informację o typie wyjścia
//GPIO_OType_PP - wyjście komplementarne
//GPIO_OType_OD - wyjście z otwartym drenem
Konfiguracja_Diody.GPIO_Speed = GPIO_Speed_100MHz;
//Pole GPIO_Speed informuje o maksymalnej dozwolonej prędkości przełączania wyprowadzeń
//GPIO_Speed_2MHz
//GPIO_Speed_25MHz
//GPIO_Speed_50MHz
//GPIO_Speed_100MHz
Konfiguracja_Diody.GPIO_PuPd = GPIO_PuPd_NOPULL;
//Pole GPIO_PuPd zawiera konfigurację rodzaju podciągania wyprowadzenia
//GPIO_PuPd_NOPULL - brak podciągania
//GPIO_PuPd_UP - podciąganie do napięcia zasilania
//GPIO_PuPd_DOWN - ściąganie do masy

GPIO_InitTypeDef Konfiguracja_Przycisku;
//Pole GPIO_Pin zawiera informację o tym,
//które wyprowadzenia portu maja zostać zainicjalizowane.
Konfiguracja_Przycisku.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_8;
Konfiguracja_Przycisku.GPIO_Mode = GPIO_Mode_IN;
//Pole GPIO_Mode zawiera informację o trybie działania wyprowadzenia
//GPIO_Mode_IN - wejście binarne
//GPIO_Mode_OUT - wyjście binarne
//GPIO_Mode_AF - funkcja alternatywna
//GPIO_Mode_AN - wejście analogowe
Konfiguracja_Przycisku.GPIO_OType = GPIO_OType_PP;
//Pole GPIO_OType zawiera informację o typie wyjścia
//GPIO_OType_PP - wyjście komplementarne
//GPIO_OType_OD - wyjście z otwartym drenem
Konfiguracja_Przycisku.GPIO_Speed = GPIO_Speed_100MHz;
//Pole GPIO_Speed informuje o maksymalnej dozwolonej prędkości przełączania wyprowadzeń
//GPIO_Speed_2MHz
//GPIO_Speed_25MHz
//GPIO_Speed_50MHz
//GPIO_Speed_100MHz
Konfiguracja_Przycisku.GPIO_PuPd = GPIO_PuPd_DOWN;
//Pole GPIO_PuPd zawiera konfigurację rodzaju podciągania wyprowadzenia
//GPIO_PuPd_NOPULL - brak podciągania
//GPIO_PuPd_UP - podciąganie do napięcia zasilania
//GPIO_PuPd_DOWN - ściąganie do masy

GPIO_Init(GPIOD, &Konfiguracja_Diody);
GPIO_Init(GPIOA, &Konfiguracja_Przycisku);
//GPIO_SetBits służy do ustawiania portów GPIO mikrokontrolera w stan ‘1’
//GPIO_ResetBits służy do ustawiania portów GPIO mikrokontrolera w stan '0'
//GPIO_ReadInputDataBit służy do odczytania stanu pojedyńczego wyprowadzenia mikrokontrolera
unsigned int i=0;
   while(1)
   {

   	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
   	{
   		GPIO_SetBits(GPIOD,GPIO_Pin_12);
   	}
   	else
   	{
   		GPIO_ResetBits(GPIOD, GPIO_Pin_12);
   	}
   }
}

[ Dodano: 06-01-2017, 21:59 ]

Zrozumiałem dzięki 🙂

Teraz program działa tak jak chciałem.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.