Kann PORTC nicht korrekt auslesen

Gast #5408361
Lesenswert?

Hallo,

ich zweifel grade irgendwie an meinem Verstand. Ich habe einen 
ATMEGA324PA-AU und möchte einen Drehschalter (6 Schaltschritte, nicht 
kurzschließend) an PORTC einlesen. Der gemeinsame Anschluss liegt auf 
Masse, die 6 Anschlüsse der Schaltstellungen sind mit den Eingängen PC0 
bis PC5 verbunden. An PORTA sind acht LEDs angeschlossen, welche auch 
korrekt arbeiten. Das ist wirklich sichergestellt. Ich versuche nun, den 
Zustand von PORTC einzulesen und jeweils eine entsprechende LED 
anzusteuern. Beim Drehschalter beginne ich mit Stellung 3 zu zählen, die 
letzte Stellung ist dann 8. Wenn also die erste Position (PC5, rückwärts 
gezählt) eingestellt ist, soll LED3 leuchten. In meinem Programm habe 
ich die LEDs über ein Makro definiert, der Einfachheit halber habe ich 
diesen Part weggelassen. Funktioniert aber, da es kein Problem ist, die 
LEDs mit einem Bitmuster oder einer Hex-Zahl direkt anzusteuern. Wenn 
ich nun den Schalter aber drehe, kommen nicht die LEDs wie gewünscht, 
sondern die LEDs 3,4,5,6 kommen nacheinander (habe ich mit jeweils 
eingebauter verzögerung getestet) und leuchten danach dauerhaft, LED7 
und LED8 funktionieren wie gewünscht. Ich habe mittlerweile alles 
versucht, komme aber auf keinen grünen Zweig. Ich habe auch bereits den 
Controller getauscht, da ich den Verdacht hatte, dass dieser defekt ist. 
Macht aber keinen Unterschied. Irgendwie scheinen diese vier Port-Pins 
nicht korrekt abgefragt zu werden. Elektrisch gemessen ist an allen Pins 
der gewünschte Signalpegel vorhanden.

Die Fuses sind E:FF, H: 99 L:62
Hier der momentan arbeitende Abschnitt aus meinem Code
1
#define  F_CPU 1000000UL
2
#include <avr/io.h>
3

4
.
5
.
6
.
7

8
void schalterstellung(void);
9

10
void schalterstellung()
11
{
12
  if((PORTC & (1 << PC5)) == 0)
13
  {
14
      led_3 = 1;
15
  }else led_3 = 0;
16

17
  if((PINC & (1 << PC4)) == 0)
18
  {
19
    led_4 = 1;
20
  }else led_4 = 0;
21

22
  if((PINC & (1 << PC3)) == 0)
23
  {
24
    led_5 = 1;
25
  }else led_5 = 0;
26

27
  if((PINC & (1 << PC2)) ==0)
28
  {
29
    led_6 = 1;
30
  }else led_6 = 0;
31

32
  if((PINC & (1 << PC1)) == 0)
33
  {
34
    led_7 = 1;
35
  }else led_7 = 0;
36

37
  if((PINC & (1 << PC0)) == 0)
38
  {
39
    led_8 = 1;
40
  }else led_8 = 0;
41
  
42
  return;
43
}
44

45

46
int main(void)
47
{  
48
  DDRA = 0xFF;
49
  DDRC = 0x00;
50
  while (1)
51
  {
52
    schalterstellung();
53
  }
54
  return (0);
55
}
Moderator (Firma: Titel) Persönliche Seite #5408366
Lesenswert?

Verwirrter schrieb:
> Ich habe einen ATMEGA324PA-AU und möchte einen Drehschalter (6
> Schaltschritte, nicht kurzschließend) an PORTC einlesen.
Probiers mit PINC. Auch für die led_3...

> die 6 Anschlüsse der Schaltstellungen sind mit den Eingängen PC0 bis PC5
> verbunden.
Ohne oder mit Pullups?
https://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen

> Wenn ich nun den Schalter aber drehe, kommen nicht die LEDs wie
> gewünscht
Welchen Pegel kannst du denn am Pin messen?
Gast #5408379
Lesenswert?

Ist ja geil!! Ich lach' mich tot!!! Das mit der Fuse D9 hat 
funktioniert. Ich verstehe jetzt grade selber nicht, wie ich das 
übersehen konnte!

VIELEN DANK FÜR DIE SCHNELLE UND ÜBERAUS KOMPETENTE HILFE!!!!

Ich wünsche Euch allen einen schönen 1. Mai! Jetzt trinke ich erstmal 
ein Bier um das ganze hier besser zu kapieren!
Gast #5409014
Lesenswert?

> Aber wo liegt dieses Maßen denn eigentlich?

In der Nähe von Moderation.


(Man muss das aber englisch aussprechen, denn es ist Häger the Horrible, 
der auf Helgas "Now, don't get loaded!" antwortet mit "Are you kidding? 
I always drink in moderation")

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