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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.