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

Eine eigene Frage? Dieser Thread ist über 12 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.