mikrocontroller.net

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


Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :|
void main()
{ 
  
  // Button Select (PF1) als digitalen Eingang 
  GPIO_PORTF_DIR_R &= ~ BIT1;      // Eingang
  GPIO_PORTF_DEN_R |=  BIT1;       // Digitale Funktion (0: Nein 1: Ja)
   
  GPIO_PORTF_IEV_R |=  BIT1;       // steigende Flanke
  GPIO_PORTF_IBE_R &= ~  BIT1;     // single Flanke
  GPIO_PORTF_IS_R &= ~  BIT1;       // Int. Sense: edge
  GPIO_PORTF_IM_R &= ~  BIT1;      // Interrupt enabled 
   
  GPIO_PORTF_PUR_R |=  BIT1;       // Pull Up
  

  // Enable processor interrupts.
  IntMasterEnable();
  
  while(1)
    asm("nop");
}

void PORTF_ISR(void)
{
  asm("nop");
}

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

Autor: Andreas Watterott (andreasw) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgendes disabled den Interrupt:
GPIO_PORTF_IM_R &= ~  BIT1;      // Interrupt enabled 

Man muss auch noch die Peripherie einschalten:
//system clock
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); //8 MHz

//peripherie clock
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

//pin setup
GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_1);
GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_RISING_EDGE);
GPIOPinIntEnable(GPIO_PORTF_BASE, GPIO_PIN_1);

GPIOPortIntRegister(GPIO_PORTF_BASE, PORTF_ISR);

IntMasterEnable();

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Watterott (andreasw) Benutzerseite
Datum:

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

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Watterott (andreasw) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Taster ziehen ja nach Masse.

Pull-up noch anschalten - hatte ich oben vergessen:
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.

Autor: Timo (Gast)
Datum:

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

gruß

Autor: Andreas Watterott (andreasw) Benutzerseite
Datum:

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

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.