LED mit Interrupt umschalten

OP (Firma: mori) #6255622
Lesenswert?

Hallo
ich möchte eine LED mit Interrupt umschalten. Aber das geht nicht.
STM32F091RC nucleo board.
push button= PA10
LED= PB0,PB1,PB2,PB3
1
int main(int argc, char* argv[])
2
{
3

4
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);
5
        GPIO_InitTypeDef GPIO_Push_button;
6
        GPIO_Push_button.GPIO_Pin = GPIO_Pin_10;
7
        GPIO_Push_button.GPIO_Mode = GPIO_Mode_IN;
8
        GPIO_Push_button.GPIO_OType = GPIO_OType_PP;
9
        GPIO_Push_button.GPIO_Speed = GPIO_Speed_2MHz;
10
        GPIO_Push_button.GPIO_PuPd = GPIO_PuPd_DOWN;
11
        GPIO_Init(GPIOA, &GPIO_Push_button);
12

13
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);
14
            GPIO_InitTypeDef GPIO_LED;
15
            GPIO_LED.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
16
            GPIO_LED.GPIO_Mode = GPIO_Mode_OUT;
17
            GPIO_LED.GPIO_OType = GPIO_OType_PP;
18
            GPIO_LED.GPIO_Speed = GPIO_Speed_2MHz;
19
            GPIO_LED.GPIO_PuPd = GPIO_PuPd_NOPULL;
20
                  GPIO_Init(GPIOB, &GPIO_LED);
21

22

23
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
24
              SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource10);
25
            //interrupt_definieren
26
              EXTI_InitTypeDef External_Interrupt;
27
              External_Interrupt.EXTI_Line= EXTI_Line10;
28
              External_Interrupt.EXTI_Mode= EXTI_Mode_Interrupt;
29
              External_Interrupt.EXTI_Trigger= EXTI_Trigger_Rising;
30
              External_Interrupt.EXTI_LineCmd= ENABLE;
31
              EXTI_Init(&External_Interrupt);
32
            //NVIC definieren
33
              NVIC_InitTypeDef Interrupt_Controller;
34
              Interrupt_Controller.NVIC_IRQChannel= EXTI4_15_IRQn;
35
              Interrupt_Controller.NVIC_IRQChannelPriority=0x00;
36
              Interrupt_Controller.NVIC_IRQChannelCmd= ENABLE;
37
                NVIC_Init(&Interrupt_Controller);
38

39
  if(EXTI_GetITStatus(EXTI_Line10) != RESET){
40

41
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)){
42
        GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2 | GPIO_Pin_3 );}
43

44
    else
45
      GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2 | GPIO_Pin_3 );
46
      EXTI_ClearITPendingBit(EXTI_Line10);}
47

48
  while (1)
49
  {
50

51

52
  // Infinite loop, never return.
53
}
54
}
55
#pragma GCC diagnostic pop
Ich wäre sehr dankbar wenn jemand mir helfen könnten
Gast #6255631
Lesenswert?

Formatiere das mal so, dass man es auch lesen kann. Wo ist deine ISR? 
Und um welchen Mikrocontroller geht es überhaupt? An welchen Pin ist die 
LED wie angeschlossen? An welchen Pin ist dein Taster wie angeschlossen? 
Zeige mal einen Schaltplan und Foto vom Aufbau.
Gast #6255686
Lesenswert?

Gegenfrage: Was wollen Sie mit einem Interrupt ohne ISR anstellen? Was 
ist mit den anderen Fragen?

Ich kann hier nur empfehlen, erst einmal die Grundlagen ohne diese HAL 
Bibliothek zu lernen. ISR kann man notfalls googeln.

Für den Anfang ist zum Beispiel diese Anleitung gut: 
http://www.pomad.fr/node/2

Wenn das zu kompliziert ist, vielleicht besser mit einem AVR 
Mikrocontroller anfangen. Da kommt man schneller rein. 
http://stefanfrings.de/mikrocontroller_buch/index.html
#6256063
Lesenswert?

In der IDE zu Deinem MC sollte es doch bestimmt ein Beispielverzeichnis 
geben, wo man leicht das korrekte Aufsetzen eines Interrupthandlers 
entnehmen kann.

Abgesehen davon kann man sich auch fragen, warum professionelle 
Tastenabfragen absichtlich den externen Interrupt nicht benutzen 
(Stichwort Entprellen).

Läuft auf Deinem MC ein OS, weil Du dem Main Argumente übergibst?
Gast #6256072
Lesenswert?

Navid M. schrieb:
> ich möchte eine LED mit Interrupt umschalten. Aber das geht nicht.
Natürlich geht das. Du machst nur irgendetwas falsch, wobei der 
Interrupt genau genommen selber nicht irgendetwas umschalten kann. Aber 
in der Routine, die nach Auftreten des Interrupts ausgeführt wird, lässt 
sich der erforderliche Programmteil gut unterbringen.
Gast #6256521
Lesenswert?

Teo D. schrieb:
> Da denk lieber..... Wie viel Haar, wollen wir spalten?! ;)

Dann sei du doch bitte so nett und erkläre dem TO, wie er seine LED mit 
Interrupt aber ohne ISR ansteuern kann. Ich fühle mich dazu nicht 
imstande.

Die Frage sollte ein deutlicher Hinweis sein, dass er da etwas wichtiges 
vergessen hat. Wenn er nicht weiss, dass er die ISR vergessen hat, weiss 
er nicht, was ein Interrupt ist. Und solange er das nicht weiss, sollte 
er noch nicht anfangen, entsprechende Quelltexte zu schreiben oder zu 
kopieren.
Gast #6256562
Lesenswert?

Stefan ⛄ F. schrieb:
> Wenn er nicht weiss, dass er die ISR vergessen hat, weiss
> er nicht, was ein Interrupt ist. Und solange er das nicht weiss, sollte
> er noch nicht anfangen, entsprechende Quelltexte zu schreiben oder zu
> kopieren.

Kinder fangen das Fahrradfahren an, ohne dessen Fahrphysik 
verstanden/studiert zu haben.

Du möchtest sagen, dass alle Kinder falsch handeln.

Oder andersrum:
Wenn man immer nur das tun würde, was man schon kann und weiß, dann 
würde es keine Entwicklung geben.


Liebster stefanus ist das dein Ziel, des runter machens?
Andere in der Entwicklung bremsen?

Du siehst, ich bin immer noch auf der Suche nach deinen Motiven!
Gast #6256580
Lesenswert?

Navid M. schrieb:
> ich möchte eine LED mit Interrupt umschalten. Aber das geht nicht.

Doch, das geht schon, aber man muss es richtig machen.

1. Ein Taster ist als Interrupt-Quelle ungeeignet. Bei jedem Tastendruck 
sendet der 3 oder 4 (oder 10) Interrupts, weil er prellt. Daß Taster 
nicht per (flankengetriggertem) Interrupt ausgewertet werden dürfen, 
weiss jedes Kind.

2. Wenn ein Interrupt auf PinChange ausgelöst wird (durch irgendien 
andere Quelle als deinen Taster, z.B. einen NE555 als Taktgeber oder 
Entprellschaltung), dann muss auch irgendein damit verknüpfter Code 
irgendetwas tun. Dieser Code heisst Interrupt (Service) Routine. Die 
fehlt bei dir komplett.

Also: Grundlagen lernen.
Gast #6256583
Lesenswert?

MaWin schrieb:
> Daß Taster
> nicht per (flankengetriggertem) Interrupt ausgewertet werden dürfen,
> weiss jedes Kind...

Ich ergänze: weiss jedes Kind, dass auf mikrocontroller.net aufmerksam 
mit liest.

Für erste Versuche mit Interrupts finde ich die Iddee aber gar nicht so 
falsch, diese zunächst manuell auszulösen. Wenn er die LED in der ISR 
toggelt, wird er das Problem des Prellens auch direkt bemerken und sich 
dann damit weiter befassen (hoffentlich).
Gast #6256589
Lesenswert?

Stefan ⛄ F. schrieb:
> ohne fiesen Hintergedanken.


Ja, dass du da nicht bewusst drüber nachdenkst, ist mir schon klar!
Das ist offensichtlich ein lang trainierter und unreflektiert 
ablaufender Automatismus. (denn sonst würdest du ja nicht dauernd das 
Gegenteil behaupten, wenn man dich drauf anspricht)


Dennoch scheint das irgendeins deiner Bedürfnisse zu befriedigen.
Aber ich finde das noch heraus, worum es sich dreht!
Da mache dir nur keine übertriebenen Hoffnungen.
#6256685
Lesenswert?

Ob und was an dem Code nicht wie gewünscht funktioniert, kann ich 
natürlich nicht einschätzen, da ich weder Chip noch Toolchain kenne.
Es ist allerdings schon sehr beeindruckend, welche riesen Menge Zeugs 
dafür initialisiert werden muß.
Falls irgendeine Vorlage verwendet wurde, wäre es sinnvoll, diese zu 
verlinken. Vielleicht stehen da irgendwelche Erläuterungen.

Ich würde erstmal ohne Interrupt versuchen, eine LED zum Leuchten zu 
bringen.
Also Taste ein-> LED ein, Taste aus -> LED aus.
Gast #6256688
Lesenswert?

Peter D. schrieb:
> Arduino Fanboy D. schrieb:
>> Kinder fangen das Fahrradfahren an, ohne dessen Fahrphysik
>> verstanden/studiert zu haben.
>
> Sie fangen aber damit an, indem sie schauen, wie andere es machen.
> D.h. nicht mit Lenker hinten oder Räder oben.

Ich weiß es noch wie Gestern!
Dein erstes Spielzeug Fahrrad hast du unter lautem "Da! Da! Da!" 
Geschrei, immer wieder auf den Boden geknallt, bis es in Fetzen gegangen 
ist.
Wie Gestern!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren