C8051F020Dk Tasterabfrageschleife

OP #3181257
Lesenswert?

Hallo µC-Gemeinde

ich habe ein Problem mit dem Einbinden und Schleifenaufbau unter der 
Verwendung des auf dem µC-Board befindlichen Taster "SW2". Dieser Taster 
ist aus dem Port3 Pin8 herausgeführt und hat somit die Adresse "SW2 = 
P3^7". Nun sind ebenfalls auf dem Port3 die ersten 7 Pins als Push-Pull 
zum Ansteuern verschiedener LED's in Verwendeung.
Für das Ansteuern der einzelnen LED's habe ich ein Hex-Array erstellt, 
mit denen ich dann in verschiedenen Case's arbeite.

Nun möchte ich gerne mit dem Taster "SW2" die diversen Case's 
durchwählen.
Code wie folgt:
1
#include <c8051f020.h>                    // SFR declarations
2
// Global CONSTANTS-------------------------------------------
3
#define SYSCLK 2000000          // approximate SYSCLK frequency in Hz
4

5
unsigned char n = 0;
6
unsigned char t1 = 0;
7
unsigned char t2 = 1;
8
sbit SW2 = P3^7;
9

10
//Hex-Werte für jede einzelne LED auf dem Board - 29.04.2013-----
11
//LED Blau-Lauflicht
12
unsigned char code L_LED_Blau2[9] = {0x00,0x01,0x08,0x40,0x00,...,0x00};
13
unsigned char code L_LED_Blau3[9] = {0x00,...,0x04,0x20,0x00,0x00,0x00};
14

15
// MAIN Routine------------------------------------------------
16
void main (void)
17
{
18
   // disable watchdog timer
19
   WDTCN = 0xde;
20
   WDTCN = 0xad;
21
   PORT2_Init ();
22
   PORT3_Init ();
23
   Timer3_Init (SYSCLK / 12 / 10);   // Init Timer3 to generate interrupts
24
                                     // at a 10Hz rate.
25
   EA =1;
26
   while (1) {                       // spin forever
27
   }
28
}
29
// PORT_Init - ??? bei Port 3 ???--------------
30
void PORT3_Init (void)
31
{
32
   XBR2    = 0x40;         // Enable crossbar and weak pull-ups
33
   P3MDOUT = 0x7f;         // enable Port3 Pin1-7 as push-pull output  
34
                           // Pin8 ist der Taster dran SW2 = P3^7 ????
35
                           // somit eig. Open Drain
36
}
37
// Timer3_ISR-----------------------------------------------
38
void Timer3_ISR (void) interrupt 14
39
{
40
   TMR3CN &= ~(0x80);     // clear TF3
41
              
42
   t1 = t1 + 1;            //generieren von 1Hz-Taktrate
43
   if(t1>10)
44
   {
45
      n = n + 1;          //Zaehlvariablen n für Hex-Array-Stellen
46
      if(n>8)              
47
      {
48
         n = 0;      
49
         if (SW2 == 1)
50
         {
51
            t2= t2+4;  
52
            if(t2>=23) t2 = 1;  
53
         }
54
         else
55
         {
56
            t2= t2+1;  
57
            if(t2>=23) t2 = 1;    
58
         }
59

60
         B_LED_P2 = 0; //Variable loeschen
61
         B_LED_P3 = 0;
62
      }
63

64
      if (t2<23)        
65
      {
66
         switch ( t2 )
67
         {           
68
       case 1 : 
69
        B_LED_P2 = L_LED_Blau2[0] | L_LED_Rot2[0] | L_LED_Gruen2[0];
70
        B_LED_P3 = L_LED_Blau3[0] | L_LED_Rot3[0] | L_LED_Gruen3[0];
71
          
72
        P2 = B_LED_P2;
73
        P3 = B_LED_P3;
74
       break;
75

76
       case 2 : 
77
        B_LED_P2 = L_LED_Blau2[0] | L_LED_Rot2[0] | L_LED_Gruen2[0];
78
        B_LED_P3 = L_LED_Blau3[0] | L_LED_Rot3[0] | L_LED_Gruen3[0];
79

80
        //Port's negierte Variable übergeben, AUS wird zu EIN
81
        P2 = ~B_LED_P2;
82
        P3 = ~B_LED_P3;
83
       break;
84

85
       case 3 : //Blau-An - Hex-Wert der Arrays mit ODER verknüpft
86
        B_LED_P2 = L_LED_Blau2[6] | L_LED_Blau2[7];
87
        B_LED_P3 = L_LED_Blau3[8];
88
          
89
        P2 = B_LED_P2;
90
        P3 = B_LED_P3;
91
       break;
92

93
       case 9 : //Blau-Lauflicht - "n" zaehlt von 0-8 
94
        P2 = L_LED_Blau2[n];
95
        P3 = L_LED_Blau3[n];
96
       break;
97
         }
98
     }
99
     t1 = 0;      
100
   } 
101
}

Problem dabei ist:
- µC startet und gibt auf den Ports kurz einen Signalstrom drauf
- danach beginnt zu erst Case 1 - wodurch alle LED's aus sind
- nächster Schritt ist Case 2
-!! erst jetzt reagiert die if(SW2)-Anwendung und guckt welche Stellung 
dieser hat und führt den entsprechenden Prozessschritt aus -> nur dieses 
eine Mal???
- danach durchläuft das Programm nur noch "else" t2=t2+1 (egal ob SW2 
Ein oder Aus ist), bis ich wieder bei der zweiten Case angekommen bin

Wo ist denn mein Schleifen-Denkfehler??? Warum wird meine SW2-Schleife 
nicht nach einem Case-Durchlauf erneut abgerufen bzw. reagiert nur zw. 
Case 2 und 3???

Für eine erleuchtende Hilfestellung wäre ich sehr dankbar

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren