atmega8a alle eingänge invertiert bis auf einen (C#)

OP #3684172
Lesenswert?

Hallo,

INFOS:
Ich programmiere gerade einen ATMEGA8a. Ich nutze AStudio6.2, einen 
AVRISP mkII und ein selbstgebautes evaluations-Board aus diesem -> 
(https://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment) 
Artikel.

Die Ein- und Ausgänge habe ich wie im Folgeartikel
(https://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen)
beschaltet.

PROGRAMM:
1
#include <avr/io.h>  
2
 
3
int main (void) {            
4
 
5
  DDRB = 0xFF;             
6
  PORTB = 0xFF; 
7
  
8
  DDRD = 0x00;
9
  PORTD = 0x00;
10
             
11

12
   while(1) {
13
    
14
      if (PIND&(1<<PIND0)) 
15
        PORTB &= ~(1<<PINB0);
16
      else PORTB |= (1<<PINB0);  
17
              
18
      if (PIND&(1<<PIND1)) 
19
        PORTB &= ~(1<<PINB1);
20
      else PORTB |= (1<<PINB1);
21
      
22
      if (PIND&(1<<PIND2)) 
23
        PORTB &= ~(1<<PINB2);          
24
      else PORTB |= (1<<PINB2);
25
          
26
      if (PIND&(1<<PIND3)) 
27
        PORTB &= ~(1<<PINB3);          
28
      else PORTB |= (1<<PINB3); 
29
  
30
   }
31
   
32
   return 0;                
33
}
PROBLEM:
Ich geh davon aus, dass nun bei geöffnetem Taster alle LED´s aus sind 
und bei geschlossenem Taster an. Dies ist jedoch nur an PD0 der Fall. 
Alle anderen Taster sind invertiert.

TROUBLESHOOTING:
Ich habe die Beschaltung von Tastern und LEDs auf Verpolung 
kontrolliert. Negativ.
Auch die Spannungsversorgung vom AVR ist korrekt.

Ich habe die Paarung PD0->PB0 und PD1->PB1 zu PD0->PB1 und PD1->PB0 
getauscht. Nun war PB0 invertiert und PB1 nicht. Damit denke ich das 
Problem auf der Eingangsseite (PORTD) identifiziert zu haben.

Ich bitte um Rat. Auch über Vorschlägen bezüglich einer eleganteren 
Programmierung würde ich mich freuen.

Gruß Stefan
#3684197
Lesenswert?

Hallo Stephan,

ich will Dir nicht die Freude am Knobeln verderben, deshalb nur ein 
Hinweis: sowohl die Taster als auch die LED's sind so beschaltet, daß 
dort eine "0" gelesen bzw. ausgegeben werden muß, wenn der Schalter 
gedrückt ist bzw. die LED leuchten soll. Negative Logik also. Das mußt 
Du in Deinem Code berücksichtigen.

Gruß
Dirk
OP #3684303
Lesenswert?

Georg G. schrieb:
> Hast du externe Pull-Ups an den Eingängen? Die internen schaltest du ja
> explizit ab. Warum eigentlich?

Ja, ich habe externe Pull-Ups dran. Hab mich da erstmal an das oben 
genannte Kochrezept gehalten. Die Internen Widerstände habe ich explizit 
im Laufe der Fehlersuche ausgeschaltet, um potentielle Fehlerquellen 
auszuschließen (ich mach das grad zum ersten Mal, also hab keine Ahnung 
;)).
OP #3684339
Lesenswert?

Der Taster am PD0 ist der Übeltäter.
Oh man, hätte nicht gedacht das einer der Taster invertiert ist. Hab die 
alle zusammen gekauft. Vielen dank für den Tipp.

Zu meiner Frage, ob der Code eleganter geschrieben werden kann, kann mir 
da noch jemand weiter helfen.

Auf alle Fälle schon mal vielen, vieln dank!

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