C8051F020Dk Tasterabfrageschleife

OP #3181257
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
OP
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...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.