Forum: Mikrocontroller und Digitale Elektronik Kann PORTC nicht korrekt auslesen


von Verwirrter (Gast)


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
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

: Bearbeitet durch Moderator
von Chris (Gast)


Lesenswert?

Hi,

Vielleicht einfach auch nur der Klassiker: PortC = JTAG, JTAG ist in den 
Fuses an und deswegen gehen die IO-Befehle in die Hose...

Probiert mal D9 als HFuse.

von Einer K. (Gast)


Lesenswert?

Verwirrter schrieb:
> if((PORTC & (1 << PC5)) == 0)
>   {
>       led_3 = 1;
>   }else led_3 = 0;

Würde ich ersetzen durch:
> led_3 = !(PORTC & (1 << PC5));
Und das für alle Inputs.

Ansonsten ....

von Verwirrter (Gast)


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!

von Bier ist Gift (Gast)


Lesenswert?

Verwirrter schrieb:
> Jetzt trinke ich erstmal
> ein Bier um das ganze hier besser zu kapieren!

Bier ist doch Gift für die Leber, der Alkohol mach den Stoffwechel keine 
"Freude"!

von Bier Fahrer (Gast)


Lesenswert?

Bier ist Gift schrieb:
> Bier ist doch Gift für die Leber

Bei uns ist Bier ein Lebensmittel, daher hat Bier per
Definition keinen Alkohol.

von Rolf M. (rmagnus)


Lesenswert?

Wie sagte mein Lehrer damals? "Alkohol sollte man in Maßen genießen". Er 
hat nur nicht gesagt, wie viele Maßen man trinken soll.

von Michael U. (amiga)


Lesenswert?

Hallo,

wie schon der Herr von Hirschhausen schrieb:
Die Leber wächst mit ihren Aufgaben.

Gruß aus Berlin
Michael

von Bier Fahrer (Gast)


Lesenswert?

Na das ist doch mal ein Thema zum heutigen Muttertag.

Oder war's der Vatertag? Oder doch was anderes?

von Einer K. (Gast)


Lesenswert?

Bier Fahrer schrieb:
> Oder doch was anderes?

Irgendwas katholisches, glaube ich....

von Johannes S. (Gast)


Lesenswert?

Rolf M. schrieb:
> Wie sagte mein Lehrer damals? "Alkohol sollte man in Maßen genießen"

Höre ich auch immer. Aber wo liegt dieses Maßen denn eigentlich?

von S. Landolt (Gast)


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")

von S. Landolt (Gast)


Lesenswert?

Pardon, Hägar heißt er, der Schreckliche. (und das trotz Vorschau)

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.