Hallo Leute! Ich bin sehr neu auf dem Gebiet und versuche mich in die Welt der Mikroprozessoren einzuarbeiten. Ich programmiere auf einem LPC2478 von NXP und benutze µVision4 von Keil. Ich habe an derPlatine (von Firma) LEDS zum leuchten bekommen, UART0 läuft, PWM Signal funktioniert und auch, die Ansteuerung von analogen Ausgängen über einen MAX5550 geht auch. Jetzt dachte ich mir, ich könnte über einen Taster und FIOPIN einen Eingang abfragen und damit ganz einfach eine LED zum leuchten kriegen. Aber bis jetzt kein Erfolg: void init_system (void) { int f; configureHW(); timer(); // just a tool to run the three LEDs for (f = 0; f < 10000000; f++) { if ( !(FIO2PIN & 0x00000001) ) { timer(); } } } void configureHW (void) { // Pin configuration IODIR0 |= (1<<13) | (1<<14) | (1<<21); // three LEDs IOCLR0 |= (1<<13) | (1<<14) | (1<<21); // LED on wait100ms(); // Timer 1 (~100ms) IOSET0 |= (1<<13) | (1<<14) | (1<<21); // LED off // configure User Taster PINSEL4 &= ~(3<<0); // P2[0] FIO2DIR &= ~(1<<0); // input PINMODE4 &= ~(3<<0); // reset PINMODE PINMODE4 |= (2<<0); // neither Pullup or Pulldown . . } Ist die Abfrage des Tasters so überhaupt korrekt? Ich wäre um jeden Hinweis dankbar :-) Gruß Christian
Hat der Taster einen Pull-up oder Pull-Down? Falls Pull-Up ist der Pin ja Default High, und wird durch Drücken auf Low gezogen, dann musst Du 0 abfragen. Danach ein Delay zum Entprellen.
Vielen Dank für die schnelle Antwort. Daran habe ich auch schon gedacht. Taster geht über Pullupwiderstand. Angenommen, ich würde den Taster drücken und gedrückt halten, hätte ich ja ein andauerndes LOW-Signal anliegen. Lade ich daraufhin das Programm (mit gedrücktem Taster) neu, und lass den Taster kurz los (quasi LOW->HIGH->LOW) bekomme ich ebenfalls kein Feedback von den LEDs. Das Programm Timer(); lässt die LEDs genau wie in der configureHW() kurz aufblinken.
Hier für LPC1766 (sollte aber kein Unterschied zum LPC2478 sein): void Delay(volatile unsigned long i) { while (i!=0) i--; } // toggle LED1 at P1_25 by BUTTON1 at P0_23 int main (void) { FIO1DIR_bit.P1_25 = 1; // output while (1) { if (FIO0PIN_bit.P0_23 == 0) // check =0 { FIO1PIN_bit.P1_25 ^= 1; // toggle Delay(1<<18); } } return 0; }
Ok.. ich hab jetzt folgendes gemacht:
1 | void init_system (void) { |
2 | |
3 | int f; |
4 | int value |
5 | |
6 | configureHW(); |
7 | timer(); // just a tool to run the three LEDs |
8 | |
9 | for (f = 0; f < 10000000; f++) |
10 | {
|
11 | value = (FIO2PIN & 0x00000001); |
12 | |
13 | if (value == 1) |
14 | {
|
15 | timer(); |
16 | }
|
17 | }
|
18 | }
|
19 | |
20 | void configureHW (void) { |
21 | |
22 | // Pin configuration
|
23 | |
24 | IODIR0 |= (1<<13) | (1<<14) | (1<<21); // three LEDs |
25 | IOCLR0 |= (1<<13) | (1<<14) | (1<<21); // LED on |
26 | wait100ms(); // Timer 1 (~100ms) |
27 | IOSET0 |= (1<<13) | (1<<14) | (1<<21); // LED off |
28 | |
29 | // configure User Taster
|
30 | |
31 | PINSEL4 = 0x0000; |
32 | PINSEL4 &= ~(3<<0); // P2[0] |
33 | FIO2DIR &= ~(1<<0); // input |
34 | // PINMODE4 &= ~(3<<0); // reset PINMODE
|
35 | // PINMODE4 |= (2<<0); // neither Pullup or Pulldown
|
36 | .
|
37 | .
|
38 | }
|
Nach einfügen der variable value und der ver-UND-dung mit 0x00000001 funktioniert der Taster immerhin invers. Klar, ist ja auch ein Pullup-Widerstand drin aber das sollte dann das kleinere Übel sein, immerhin hat der Taster jetzt schon einen Effekt..
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.