mikrocontroller.net

Forum: Compiler & IDEs Noob-Frage - warum funzen meine Eingänge nicht?


Autor: Teletrabi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

hab gerade mal etwas angefangen, mit 'nem Atmega16 zu experimentieren.
Okay, LED am Ausgang setzten funktioniert, nächster Schritt war 'ne Art 
Flipflop. Und da fängt der Ärger schon an. Irgendwie werden meine Taster 
ignoriert und die Simulation im AVR-Studio macht mir da auch keine 
großen Hoffnungen (sofern ich sie denn richtig bediene)... Nur wo liegt 
der Fehler?

schönen Dank,
Trabi


#include <avr/io.h>
// LEDs an C0...C3; EIN-Taster an C6, AUS an C7

int main(void)
{
  // Port C - untere pins als ausgang, obere als Eingang (0000.1111)
  DDRC = 0x0f;
  // Port C - obere beiden pins pullup aktivieren (1100.0000)
  PORTC = 0xc0;

      for ( ; ; )
      {
         if (PINC & 0x80) // Pin C7 abfragen (1000.0000)
         {
            PORTC = 0xc0; // LEDs aus, pullups bleiben aktiv (1100.0000)
         }

         if (PINC & 0x40)  // Pin C6 abfragen (0100.0000)
         {
             PORTC = 0xcf;  // LEDs an, pullups aktiv (1100.1111)
         }
     }
return 1;
}

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar werden die ignoriert, nachdem die if-Zweige einmal zugeschlagen 
haben, so ist es programmiert. Und wegen Lesbarkeit besser (1 << PNx) 
(mit N = Port, x Portpin) benutzen.

Autor: Teletrabi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie meinst du das mit ignoriert wenn einmal zugeschlagen?
Eigentlich war beabsichtigt, dass der for-Block in einer Schleife läuft 
und dann je nach Druck auf den Taster die LEDs an oder ausgehen und den 
neuen Zustand beibehalten, bis der andere Taster betätigt wird. Läuft 
aber nicht so recht, da kann ich drücken was ich will. Was muss man nun 
ändern? Ist die for-Schleife fehlerhaft?

Autor: Epoxyd Harzkleber (fr4)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du denn deine Taster an den Port angeschlossen? Die sollten so 
angeschlossen sein, dass sie den Portpin nach Masse "wegziehen", d.h. 
den Portpin mit Masse kurzschliessen.

Tun sie das nicht erkennen beide ifs ihre Bedingung PINC & 0x80 als 
wahr, da du die Pullups eingeschaltet hast.

Autor: Reisender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiss auch nicht was er damit meint.

Jedoch ist es doch so, das ein offener Taster durch den eingeschalteten 
Pull-Up als "1" gelesen wird und ein gedrückter als "0".

Dein Code prüft aber auf "1" um die LEDs jeweils ein oder auszuschalten.
Wenn Du keine Taste drückst dann liest er schon die "1" und schaltet 
ganz schnell hintereinander die LEDS aus und ein.

Wenn Du den Taster an PC6 drückst dann sollten die LEDS ständig an 
bleiben.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja das Progamm ist halt total fehlerhaft. Ausserdem muss man 
mechanische Taster entprellen. Und ohne Schaltplan kann man auch nichts 
sagen, aber ich vermute, dass da noch mehr im Argen liegt.

Schau Dir mal das AVR-Tutorial an.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael G. wrote:
> Naja das Progamm ist halt total fehlerhaft. Ausserdem muss man
> mechanische Taster entprellen.

dürfte in dem Fall wohl unnötig sein, da ja nur der Zustand abfragt wird 
und keine Flanke detektiert werden soll...

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja dass da nichts passiert ist ja klar, weil der ganze Port abgefragt 
wird. Und es gibt keinen else-Zweig.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael G. wrote:
> Naja dass da nichts passiert ist ja klar, weil der ganze Port abgefragt
> wird. Und es gibt keinen else-Zweig.

Liest du eigentlich, was du selbst schreibst? Alle 3 Posts, die du 
verfasst hast, sind totaler Müll.

Für mich sieht das Programm 1A in Ordnung aus. Wie sieht denn die 
Hardware-Beschaltung aus? Also im Klartext. Wie sind die Schalter 
angeschlossen, zum Beispiel?

Autor: Teletrabi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

es läuft... :o)

a) Dusseligkeit. Mit der Pinbelegung durcheinandergeraten.

b) Ferner muss die Abfrage auf == 0 lauten.

c) Beschaltung: externe Pulluops (ich weiß, is hier doppelt mgemoppelt), 
Taster nach GND, kontrolliert über LEDs an den Eingangspins (antürlich 
auch mit Widerstand).

d) Beiträge eines Users hier: als Noob wollt ich das nicht schreiben, 
aber...

e) Öhm, Simon, das "K." endet nicht zufällig auf "n"?


ciao und Dank für die Hilfe,
Trabi

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. wrote:
> Michael G. wrote:
>> Naja dass da nichts passiert ist ja klar, weil der ganze Port abgefragt
>> wird. Und es gibt keinen else-Zweig.
>
> Liest du eigentlich, was du selbst schreibst? Alle 3 Posts, die du
> verfasst hast, sind totaler Müll.

Full ACK

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Teletrabi wrote:
> b) Ferner muss die Abfrage auf == 0 lauten.
Ja, bei Active Low gecshalteten Schaltern (also gegen Masse, mit Pullup) 
ist das so, richtig. Mit einer der Gründe, warum ich nach der Hardware 
fragte :D

> e) Öhm, Simon, das "K." endet nicht zufällig auf "n"?
Nicht, dass ich wüsste ;)

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.