STM32 EXTI Pin auf 0 setzen?

Gast #5629513
Lesenswert?
• ▲
▼
Hi,

ich habe glaube gerade ein Verständnisproblem. Ich arbeite mit einem 
ADS7843 Touchscreen-Controller, dessen #PENIRQ Ausgang mit einem 
EXTI-Pin verbunden ist.
Der #PENIRQ Pin am ADS7843 hat auf dem Display-Board einen 100k Pullup.

Wenn ich nun nur eine Interrupt-Routine habe, in der nicht ausgelesen 
wird, dann funktioniert das soweit auch.

Wenn ich nun den Chip auslese, dann werden gleich ganz viele wirre 
Interrupts ausgelöst, egal ob in main() oder ISR ausgelesen wird.

Der #PENIRQ Pin ist intern über eine Diode an einem der analogen 
Eingänge. Wenn da nun gemessen wird und die internen switches Schalten 
bekomme ich über die Diode am EXTI ungewollte "Daten", die Interrupts 
auslösen.

Laut Datenblatt muss der Interrupt-Pin am Controller auf 0 gesetzt 
werden um diese ungewollten Interrupts zu verhindern und zur Minimierung 
von Störungen.

Nun meine Frage, wie mache ich sowas richtig?

Mein Versuch (der so nicht funktioniert, selbes Verhalten wie 
beschrieben):
1
uint16_t ads7843_read_x() {
2
    int x;
3

4
    GPIO_ResetBits(GPIOB, GPIO_Pin_6);  // interrupt pin auf 0???
5
    
6
    ads7843_enable();      // CS=0
7
    ads7843_cmd(CMD_CHX);  // send CMD
8
    x = ads7843_read();
9
    ads7843_disable();
10

11
    GPIO_SetBits(GPIOB, GPIO_Pin_6);  // interrupt pin auf 1???
12
    
13
    return x;
14
}

Der EXTI wird so initialisiert:
1
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
3
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
4
    GPIO_Init(GPIOB, &GPIO_InitStructure);
5

6
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
7
  
8
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;   
9
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
10
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;    
11
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
12
  NVIC_Init(&NVIC_InitStructure);  
13
  
14
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
15

16
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);
17
  EXTI_ClearITPendingBit(EXTI_Line6);
18

19
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
20
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
21
  EXTI_InitStructure.EXTI_Line = EXTI_Line6;
22
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
23
  EXTI_Init(&EXTI_InitStructure);
Moderator (Firma: Titel) Persönliche Seite #5629589
Lesenswert?
• ▲
▼
EloGuy schrieb:
> Wenn ich nun den Chip auslese, dann werden gleich ganz viele wirre
> Interrupts ausgelöst, egal ob in main() oder ISR ausgelesen wird.
Und was misst du mit einem Oszilloskop auf dieser Leitung? Wer löst 
diese IRQ aus? Sind das richtige low und high Pegel oder sind das simple 
Störungen?

> Der #PENIRQ Pin am ADS7843 hat auf dem Display-Board einen 100k Pullup.
Der wäre mir als Pullup für eine Logikleitung bedeutend zu hochohmig. 
Alles über 10k ist EMV-technisch überaus kritisch.
Gast #5629617
Lesenswert?
• ▲
▼
Ich habe leider kein Oszilloskop.
Der 100k Widerstand ist schon auf dem Display-Modul (HY32D 3,2" 
TFT/ADS7843/SSD1289).

Im Anhang ein Auszug aus dem Blockschaltbild. Über die Diode geht ein 
Low-Aktives Interrupt Signal raus, wenn der Touchscreen berührt wurde.

Ich "messe" die IRQs, indem ich in der ISR zu #PENIRQ nur einen Counter 
hochzählen lasse.
Wenn ich einmal kurz den Touchscreen berühre, kann ich einzelne 
Interrupts auslösen. Das funktioniert erstmal so wie gedacht.

In der main() wird in einer Dauerschleife der Wert des Zählers auf's 
Display ausgegeben.
Wenn ich nun in der main() den ADS7843 auslese, zählt er 10..20 
Interrupts pro Sekunde einfach nur für's "nichts tun". Wenn ich dann den 
Touchscreen berühre, kommen pro Berührung mehrere Hundert IRQs raus.
Angehängte Dateien:
Gast #5629628
Lesenswert?
• ▲
▼
Ich habe jetzt schnell einen 12k Widerstand (10k+2k) über den 100k 
gelötet (Parallel) um so auf 10,75k Pullup zu kommen. Damit habe ich 
genau das selbe Problem.

Die Lösung wird sein, wie im Datenblatt/Appnote beschrieben, den Pin 
MCU-seitig auf Low zu ziehen.
Im Anhang der Ablaufplan aus der Appnote.
Angehängte Dateien:

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.