Forum: Mikrocontroller und Digitale Elektronik Kann PORTC nicht korrekt auslesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Verwirrter (Gast)


Bewertung
0 lesenswert
nicht 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
#define  F_CPU 1000000UL
#include <avr/io.h>

.
.
.

void schalterstellung(void);

void schalterstellung()
{
  if((PORTC & (1 << PC5)) == 0)
  {
      led_3 = 1;
  }else led_3 = 0;

  if((PINC & (1 << PC4)) == 0)
  {
    led_4 = 1;
  }else led_4 = 0;

  if((PINC & (1 << PC3)) == 0)
  {
    led_5 = 1;
  }else led_5 = 0;

  if((PINC & (1 << PC2)) ==0)
  {
    led_6 = 1;
  }else led_6 = 0;

  if((PINC & (1 << PC1)) == 0)
  {
    led_7 = 1;
  }else led_7 = 0;

  if((PINC & (1 << PC0)) == 0)
  {
    led_8 = 1;
  }else led_8 = 0;
  
  return;
}


int main(void)
{  
  DDRA = 0xFF;
  DDRC = 0x00;
  while (1)
  {
    schalterstellung();
  }
  return (0);
}

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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 ....

: Bearbeitet durch User
von Verwirrter (Gast)


Bewertung
1 lesenswert
nicht 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)


Bewertung
-3 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß aus Berlin
Michael

von Bier Fahrer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Na das ist doch mal ein Thema zum heutigen Muttertag.

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

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Bier Fahrer schrieb:
> Oder doch was anderes?

Irgendwas katholisches, glaube ich....

von Johannes S. (jojos)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.