Forum: Mikrocontroller und Digitale Elektronik Komisches Verhalten des Taster-Pins


von Michael S. (michl-s)


Lesenswert?

Halle Leute, ich besitze das Explorer16- Entwicklungsboard von 
Microchip.
Auf dem ist an PortA-7 ein Taster angeschlossen. Unentprellt, active 
low. Gleichzeitig hängt an diesem Pin auch noch ne LED dran, über einen 
Jumper ausschaltbar.

Jetzt zu dem Verhalten:
Lese ich den PortA ein, so steht jedes mal 0x00 im Register, als ob alle 
Pins, insbesondere Pin7, LOW sind. (taster also gedrückt wäre???)
Auch meine Button-Routine erkennt LOW, also Taster gedrückt. Die Routine 
funktioniert, denn wenn ich diesem Button-Event einen anderen Port 
zuweise funktionierts. Also liegt es definitiv an dem Port.
Er ist als Eingang definiert und es hängt nichts weiteres mehr daran. 
Wenn ich mit dem DMM messe, liegen auch 3,3V an. Stimmt also.
Vielleicht hat jemand von euch noch eine Idee woran das liegen könnte...

Es dreht sich um den S5, bzw S5_INPUT im Code.

Systeminfos:
µC: dsPIC33FJ256GP710
IDE: MPLAP IDE v8.40 mit ICD2
1
#include "p33FJ256GP710.h"
2
#include "timer.h"
3
#include "nmea.h"
4
#include "buttons.h"
5
6
7
/***** ISR (autp_psv) definition *****/
8
#define _ISR_AUTOPSV __attribute__((interrupt, auto_psv))
9
10
11
int put_select;
12
unsigned char timer_cnt;
13
14
15
16
void Init_Timer1 (void)
17
{
18
  T1CON = 0;
19
  T1CONbits.TCKPS = 0b10;
20
  T1CONbits.TCS  = 0;
21
  TMR1  = 0x0000;
22
  PR1    = 31250;
23
24
  IPC0bits.T1IP = 0x05;
25
  IFS0bits.T1IF = 0;
26
  IEC0bits.T1IE = 1;
27
28
  T1CONbits.TON = 1;
29
30
  timer_cnt = 0;
31
  reset_buttons();
32
}
33
34
35
void _ISR_AUTOPSV _T1Interrupt( void )
36
{
37
  unsigned char counter;
38
39
  timer_cnt++;
40
41
  button[ENTER].status &= (~ENTER_INPUT);
42
  button[UP].status    &= (~UP_INPUT);
43
  button[RIGHT].status &= (~RIGHT_INPUT);
44
  button[DOWN].status  &= (~DOWN_INPUT);
45
  button[LEFT].status  &= (~LEFT_INPUT);
46
  button[S3].status   &= (~S3_INPUT);
47
  button[S4].status   &= (~S4_INPUT);
48
  button[S5].status    &= (~S5_INPUT);
49
  button[S6].status    &= (~S6_INPUT);
50
51
52
  if (timer_cnt >= 2)
53
  {
54
    timer_cnt = 0;
55
56
    for (counter = 0; counter < MAX_SIZE; counter++)
57
    {
58
      if (button[counter].status)
59
        button[counter].event = 1;
60
      else
61
        button[counter].status = 1;
62
    }
63
  }    
64
  IFS0bits.T1IF = 0;
65
}
1
#define ENTER_INPUT PORTDbits.RD3
2
#define UP_INPUT   PORTDbits.RD4
3
#define RIGHT_INPUT PORTDbits.RD5
4
#define DOWN_INPUT   PORTDbits.RD6
5
#define LEFT_INPUT   PORTDbits.RD7
6
#define S3_INPUT   PORTDbits.RD6
7
#define S4_INPUT  PORTDbits.RD13
8
#define S5_INPUT  PORTAbits.RA7
9
#define S6_INPUT  PORTDbits.RD7
10
11
12
13
14
enum buttons
15
{
16
  ENTER,
17
  UP,
18
  RIGHT,
19
  DOWN,
20
  LEFT,
21
  S3,
22
  S4,
23
  S5,
24
  S6,
25
  MAX_SIZE  
26
};
27
28
29
typedef struct {
30
  unsigned char event;
31
  unsigned char status;
32
}button_attributes;
33
34
35
36
extern button_attributes  button[MAX_SIZE];
37
38
39
void reset_buttons (void);
1
  while(service == UNSELECTED)
2
  {
3
    if (button[S5].event)
4
    {
5
      service = TRACKER;
6
      init_put_track();
7
      tracking_status = START_TRACKING;
8
      button[S5].event = 0;
9
    }
10
11
    if (button[RIGHT].event)
12
    {
13
      service = VIEWER;
14
      button[RIGHT].event = 0;
15
    }
16
  }

Und genau hier oben tritt immer(!) ein button-S5-Event ein.
Timer kommt alle 10ms zum entprellen.
In dem Datenblatt auf Seite 33 - Abschnitt 4.2.9 ff.
http://ww1.microchip.com/downloads/en/DeviceDoc/Explorer%2016%20User%20Guide%2051589a.pdf

von Michael S. (michl-s)


Lesenswert?

Ich habe gerade nochmal geschaut. Der Debugger zeigt die korrekten Werte 
für PortA0 - PortA5 an. Nur 6 und 7 haben keinen Einfluss iwie obwohl 
ich sie direkt auf 3,3V gehängt habe...

von Karl H. (kbuchegg)


Lesenswert?

Michael S. schrieb:
> Ich habe gerade nochmal geschaut. Der Debugger zeigt die korrekten Werte
> für PortA0 - PortA5 an. Nur 6 und 7 haben keinen Einfluss iwie obwohl
> ich sie direkt auf 3,3V gehängt habe...

Hä?

Du hast sie direkt auf 3.3V gehängt UND da hängt dann auch noch ein 
active-Low Taster drann?

Das ergibt einen Kurzen, wenn du den Taster betätigst.

von Michael S. (michl-s)


Lesenswert?

Jo is mir klar, deswegen habe ich den in diesem Moment auch nicht 
gedrückt! War nur zum Einlesen so angeschlossen.

von Karl H. (kbuchegg)


Lesenswert?

Ich weiß nicht, welcher Chip auf deinem Board verbaut ist.
Aber bei einigen AVR ist es zb so, das ausgewählte Ports (namentlich 
diejenigen die über einen ADC angesprochen werden können) eine eigene 
Spannungsversorgung am IC haben. Schliesst man die nicht an, kommt es 
auch zu solch seltsamen Effekten.

Vielleicht hat der Port auf deinem IC auch irgendso eine Sonderrolle?

von Michael S. (michl-s)


Lesenswert?

Die Ausgang-Funktion des Pins funktioniert noch.
Kanns sein, dass der Input-Zweig im Ar*** ist, oder...

Sonderrolle wäre AD-Eingang 22 und 23. ADC ist aber aus.

von dsPIC (Gast)


Lesenswert?

Könnte hinkommen. Was meint der Rest der µC-Welt?^^

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.