Forum: Mikrocontroller und Digitale Elektronik Luminary LM3S6965 - GPIO / Button Interrupt geht nicht.


von Timo (Gast)


Lesenswert?

Hallo,
ich verzweifle etwas mit dem Interrupt.
Vielleicht kann mir jemand von euch weiter helfen .
Ich kopiere am besten mal das Programm hinein. Irgendetwas wird wohl an 
der Init. nicht stimmen :|
1
void main()
2
{ 
3
  
4
  // Button Select (PF1) als digitalen Eingang 
5
  GPIO_PORTF_DIR_R &= ~ BIT1;      // Eingang
6
  GPIO_PORTF_DEN_R |=  BIT1;       // Digitale Funktion (0: Nein 1: Ja)
7
   
8
  GPIO_PORTF_IEV_R |=  BIT1;       // steigende Flanke
9
  GPIO_PORTF_IBE_R &= ~  BIT1;     // single Flanke
10
  GPIO_PORTF_IS_R &= ~  BIT1;       // Int. Sense: edge
11
  GPIO_PORTF_IM_R &= ~  BIT1;      // Interrupt enabled 
12
   
13
  GPIO_PORTF_PUR_R |=  BIT1;       // Pull Up
14
  
15
16
  // Enable processor interrupts.
17
  IntMasterEnable();
18
  
19
  while(1)
20
    asm("nop");
21
}
22
23
void PORTF_ISR(void)
24
{
25
  asm("nop");
26
}

In der startup.c habe ich folgende Zeile der Vektor TAbelle geändert.
PORTF_ISR,           // GPIO Port F

Wenn ich Select drücke (PF1) dann seh ich, dass Data auf 0 wechselt aber 
er springt nicht in die PORTF_ISR()

Ich weiß leider nemmer weiter

Gruß Timo

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Folgendes disabled den Interrupt:
1
GPIO_PORTF_IM_R &= ~  BIT1;      // Interrupt enabled

Man muss auch noch die Peripherie einschalten:
1
//system clock
2
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); //8 MHz
3
4
//peripherie clock
5
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
6
7
//pin setup
8
GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_1);
9
GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_RISING_EDGE);
10
GPIOPinIntEnable(GPIO_PORTF_BASE, GPIO_PIN_1);
11
12
GPIOPortIntRegister(GPIO_PORTF_BASE, PORTF_ISR);
13
14
IntMasterEnable();

von Timo (Gast)


Lesenswert?

Hallo,
danke für die Antwort,

ja clock init hab ich auch, hab ich nur entfernt damit es nicht alzulang 
wird...habe über ne pll nen 40Mhz clock

hab nun periphrie clock und pin setupo cvon dir übernommen, leider aber 
bei
GPIOPortIntRegister(GPIO_PORTF_BASE, PORTF_ISR);

compiler fehler , da er PORTF_ISR nicht kennt, das ist ja eigentlich der 
name meiner interrupt routine, kann man die nicht beliebig verändern und 
muss denen ihre vorgaben nehmen?

gruß und schonmal danke
timo

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Dann hast du die Funktion nicht vorher deklariert.
Schreib sie einfach vor main() und nicht unter bzw. dahinter.

von Timo (Gast)


Lesenswert?

ah ok, ich hatte es nur bei der startup.c als extern deklariert.
nun bekomm ich keinen compiler fehler aber er springt sofort in die 
interrupt routine (ohne taste gedrückt zu haben)

von Timo (Gast)


Lesenswert?

ok alles klar,
ich habe in die init noch das request bit vom interrupt gelöscht und nun 
klappt es.

danke für die hilfe. nun kanns weiter gehn

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Die Taster ziehen ja nach Masse.

Pull-up noch anschalten - hatte ich oben vergessen:
1
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);

und der Int. muss auf GPIO_FALLING_EDGE gestellt werden. Dann sollte 
es klappen.

von Timo (Gast)


Lesenswert?

Ja, wie gesagt es funktioniert. das mit dem pull up hab ich ja oben 
schon herausgefunden, aus deinem eben genannten grund

gruß

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Da war ich ein bisschen zu langsam. Habe deinen Post erst gesehen 
nachdem ich auf Absenden gedrückt hatte...

von Timo (Gast)


Lesenswert?

Muss mich doch wieder zu Wort melden.
obwohl ich vor der initialisierung der ports die main interrupts 
deaktiviere und bevor ich diese wieder aktiviere, setze ich den irq vom 
port zurück springt er mir einmal in die isr routine rein.
beim debuggen habe ich festgestellt, dass das während der funktion
GPIOPortIntRegister(GPIO_PORTF_BASE, PORT_F_ISR); passiert

woran liegt das und wie kann ich daas verhinden?!

gruß

von Timo (Gast)


Lesenswert?

Ok hatte doch noch den nerv alles einzeln durchzugehen und habe nun 
gelesen,
dass ich noch steigende flanke drin hatte, hab dies nun auch auf fallend 
geändert und es geht,

aber wieso geht es mit der steigenden nicht, das blick ich noch net ganz 
aber is ja auch schon spät ;)


gn8

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.