Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Fehlersuche


von Patrick P. (korlask)


Angehängte Dateien:

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
    }

von nobi (Gast)


Lesenswert?

Du liest das falsche Register;
mit a=PORTB die Konfiguration der Pull Ups wieder ein;
versuchs mal mit a=PINB :-)

mfg
Norbert

von Patrick P. (korlask)


Lesenswert?

Das ist wirklich nur alles ?! :)

von nobi (Gast)


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!

von Patrick P. (korlask)


Lesenswert?

Gerade ausprobiert , nur es geht leider immer noch nicht.
a=PORTB in a=PINB umgeschrieben.
:(

Der wechsel am Eingang kommt. 5V auf GND.Hardware mässig geht alles.

von Anfänger (Gast)


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.

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.