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