Forum: Mikrocontroller und Digitale Elektronik C8051F020Dk Tasterabfrageschleife


von batty m. (battyman)


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

von batty m. (battyman)


Lesenswert?

Mhhh, ich bekomme den Taster SW2 einfach nicht dazu auf ein Weiteres zu 
reagieren, als an der Position t2=2  - ????? Raff nicht warum er die 
if(SW2==1) nur ein enziges Mal anfässt und dannach immer nur durch 
"else" läuft, bis er wieder zum Anfang kommt...

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.