Forum: Mikrocontroller und Digitale Elektronik STM32 EXTI Pin auf 0 setzen?


von EloGuy (Gast)


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);

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von EloGuy (Gast)


Angehängte Dateien:

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.

von EloGuy (Gast)


Angehängte Dateien:

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.

von EloGuy (Gast)


Lesenswert?

Und richtig konfiguriert (PD0=PD1=0) ist der Chip auch, denn in allen 
anderen Modi wird gar kein #PENIRQ ausgelöst.

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.