Hilfe bei Fehlersuche

OP #3097351
Lesenswert?

Hallo Community,
ich verwende für mein erstes Project einen ATmega32P. Die Taster(3 an 
der Zahl) sollen bei GND das 1-Signal geben(PORTB). Am Ausgang ist der 
PORTA(jeweils 8 LED´s) belegt.
Ich habe folgendes Problem mit der Switch & Case Variante im Programm. 
Wenn ich den Taster(S2) am PINB1 betätige springt er nicht im 2 Case. 
Ich weiss nicht wieso. Er bleibt immer im 1 Case. Könntet ihr mir 
vielleicht weiter helfen ?
1
#include <stdio.h>
2
#include <stdint.h>
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#define F_CPU 16000000UL /* 16 Mhz-Takt; hier richtigen Wert eintragen */
6

7
int main(void)
8
{
9
  
10
    DDRA  = 0xFF; /*Ausgänge*/
11
    PORTA = 0x00;
12
    DDRB  = 0x00; /*Eingänge*/
13
    PORTB = 0xFF;
14
    
15
    uint8_t a;
16
    uint8_t x;
17
    uint8_t y;
18
    int z=0;
19
  
20
    while(1)
21
    {
22
  
23
  for (y=z; y < 10; y++){  
24
  
25

26
DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2) | (1 << DDA3) | (1 << DDA4) | (1 << DDA5) | (1 << DDA6) | (1 << DDA7);
27
PORTA = DDRA;
28
_delay_ms(850.0);
29
DDRA = (0 << DDA0) | (0 << DDA1) | (0 << DDA2) | (0 << DDA3) | (0 << DDA4) | (0 << DDA5) | (0 << DDA6) | (0 << DDA7);
30
PORTA = DDRA;
31
_delay_ms(600.0);
32
DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2) | (1 << DDA3) | (1 << DDA4) | (1 << DDA5) | (1 << DDA6) | (1 << DDA7);
33
PORTA = DDRA;
34
_delay_ms(850.0);
35
  z = z+2;  
36
        }              
37
     
38
a=PORTB;
39
       
40
     if(a==0xFF)
41
     
42
      x = 1;
43
      
44
     if(a==0xFE)
45
     
46
      x = 2;
47

48
     if(a==0xFD)
49
     
50
      x = 3;
51

52
     if(a==0xFB)
53
     
54
      x = 4;    
55
            
56
    switch(x){
57
    
58
      case 1:
59
DDRA = (1 << DDA0) | (1 << DDA2) | (1 << DDA4) | (1 << DDA6) ;
60
PORTA = DDRA;
61
_delay_ms(100.0);
62
DDRA = (1 << DDA1) | (1 << DDA3) | (1 << DDA5) | (1 << DDA7) ;
63
PORTA = DDRA;
64
_delay_ms(100.0);        
65
      break;
66
        
67
      case 2:
68
DDRA = (1 << DDA0);
69
PORTA = DDRA;
70
_delay_ms(100.0);
71
DDRA = (1 << DDA1);
72
PORTA = DDRA;
73
_delay_ms(100.0);
74
DDRA = (1 << DDA2);
75
PORTA = DDRA;
76
_delay_ms(100.0);
77
DDRA = (1 << DDA3);
78
PORTA = DDRA;
79
_delay_ms(100.0);
80
DDRA = (1 << DDA4);
81
PORTA = DDRA;
82
_delay_ms(100.0);
83
DDRA = (1 << DDA5);
84
PORTA = DDRA;
85
_delay_ms(100.0);
86
DDRA = (1 << DDA6);
87
PORTA = DDRA;
88
_delay_ms(100.0);
89
DDRA = (1 << DDA7);
90
PORTA = DDRA;
91
_delay_ms(100.0);
92
      break;
93
            
94
      case 3:
95
          .
96
          .
97
          .                    
98
      break;
99
      
100
      case 4:      
101
          .
102
          .  
103
          .     
104
      break;  }
105
      
106
      }     
107
    }
Angehängte Dateien:
Gast #3098065
Lesenswert?

Was verstehst Du nicht ?

einen Port liest man ein mit PINB,

wenn Du PORTB liest, dann liest Du das zurueck was Du zuvor in PORTB 
reingeschrieben hast, nähmlich die gesetzten PULL Up bits, und das 
entspricht einem Wert von 0xFF, egal, was Du aussen füe einen Pegel 
anlegst.

das heist, du gehst immer mit 0xFF in deine switch case anweisung!
Gast #3099233
Lesenswert?

Hallo,
wie soll denn deine Switchanweisung funktionieren?

Deine Sprünge sind abhängig von den Werten auf den anderen B-Eingängen. 
Es braucht nur ein weiterer Eingang nicht auf High liegen und dein 
Taster2 bleibt in der Abfrage unerfasst.

Du solltest die einzelnen Bits isolieren um sicherzustellen, dass ein 
bestimmtes Bit eine bestimmte Reaktion auslöst.

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