www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik input bei atmega8


Autor: Rene Arnhold (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo leute

mal wieder ne noop frage von mir

bin gerade am verzweifeln

und zwar:

will hier nix weiter machen als den zustand von zwei tastern einlesen

habe dafür folgendes gemacht:

void aktion()
{
  if ( (PIND & (1<<PIND0)) )
  {
    lcd_clrscr();
    lcd_puts("links");
  }

  if ( (PIND & (1<<PIND1)) )
  {
    lcd_clrscr();
    lcd_puts("rechts");
  }
}

SIGNAL (SIG_INTERRUPT0)
{
  aktion();
}

int main ()
{
  DDRD  &= ~(1<<DDD0);
  PORTD |= (1<<PD0);

  DDRD  &= ~(1<<DDD1);
  PORTD |= (1<<PD1);

  //DDRD  &= ~(1<<DDD2);
  PORTD |= (1<<PD2);

  sei();

  lcd_init(LCD_DISP_ON);
  lcd_clrscr();

  for(;;)
  {
    aktion();
  }
  return 0;
}


nun ist irgendwie das problem, dass ich keinen knopf drücken brauch er
zeigt dennoch immer 1

woran liegt das?


verkabelung:

GND-------[Taster 1]-------(PIND0)
                       |
                       ------(PIND2)


GND-------[Taster 2]-------(PIND1)
                       |
                       ------(PIND2)



danke im vorraus

Autor: Stefan Sczekalla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie vermisse ich die Initiralisierung der Interrupts ...
Prüf mal ob die defaults in GIMSK oder so ähnlich passen.

Der Aufruf von "aktion" innerhalb der for-ever schleife ist imho
überflüssig - dann brauchst Du keine Interrupts wenn du die Pins in der
Schleife pollst ...

Grüße,

Stefan

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich vermisse pulldown widerstände

Autor: Rene Arnhold (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles klar habs gefunden

die pull downs werden gemacht mit portd zuweisung (interne pulldowns)

irgendwie waren meine schalter öfnner

des hab ich jetzt so gelöst, dass ich einfach prüfen

if ( !(PIND & (1<<PIND0))

funzt eigentlich recht gut

was das aktion in der for angeht des war nur gespiel ist logischerweise
normalerweise raus


aber noch eine frage

wenn ich jetzt meine verarbeitung starte wenn pind0 oder pind1 0 ist

wie mache ich das da mit dem interrupt der schaltet ja wenn die hight
sind

jemand ne ahnung?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die pull downs werden gemacht mit portd zuweisung (interne pulldowns)

ein AVR hat keine pulldowns

Autor: Rene Arnhold (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie?

hat er nicht?

und warum lese ich das dann im avr-gcc manual

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo?

Autor: Rene Arnhold (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich les zwar was von Pulldowns, aber nur im zusammenhang mit externer
beschaltung

Autor: Rene Arnhold (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh stimmt eigentlich

pull downs bei aktiv height ;)

dann verstehe ich aber net, warum die bei mir aktiv height sind

hab ja so geschaltet:

erde -> taster -> pin am atmega

sollte dann doch eigentlich funzen oder net?

ich will ja, dass die aktion ausgeführt wird, wenn ich nen taster
drücke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie solltest Du Dich mit den Grundlagen mal vertraut
machen.

Pull-Down: Da gibt es einen Widerstand vom Pin
           nach Masse. Ist an dem Pin nichts angeschlossen
           dann misst man am Pin einen 0 Pegel.

Pull-Up:   Da gibt es einen Widerstand vom Pin
           zur Versorgungsspannung. Ist an dem Pin nichts
           angeschlossen, so misst man am Pin einen 1 Pegel.

Ein AVR hat keinen Pull-Down, sehr wohl aber einen Pull-Up.
D.h. wenn Du die internen Pull-Ups aktivierts, dann stellst
Du dort eine logische 1 fest, wenn nichts angeshlossen ist.
Um dort also eine Aenderung festzustellen, brauchst Du daher einen
Schalter, der den Pin mit Masse verbindet. Wird der Schalter
geschaltet, dann wechselt der Pegel von 1 auf 0. Du kannst den
Schalter auch anders herum einbauen: Im Grundzustand ist er
geschaltet (am Pin liegt dann 0 an) und bei Betaetigung wird der
Schalter geloest (am Pin liegt dann 1 an).
Am besten probierst Du das ganze mal ohne µC nur mit einer
Batterie, einem Widerstand, einer Led und einem Schalter durch,
dann wird Dir sehr schnell klar, was da passiert:


 5V
  +   ---------.
               |
              ---
              | |  330 Ohm
              | |
              ---
               |
               |
               .----------.
               |          |
               |          .
              ---           /
              \              Schalter
         Led   v          .
             -----        |
               |          |
               |          |
    - ---------.----------.

Die Led zeigt Dir durch Leuchten den Pegel, 1 oder 0 an.
Wunder wirkt auch, den Taster mal mit einem Durchgangspruefer
durchzumessen. Es gibt naemlich Taster, die im Grundzustand
geschlossen sind und bei Betaetigung oeffnen und umgekehrt.
Obige Schaltung zeigt das sehr schoen.

Autor: Rene Arnhold (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh ok danke, dass du so geduldig bist ist halt doch was anderes als ne
sps mit fup zusammen zu schieben

kann leider im moment net viel basteln da ich wieder mal nur 10 ohm
widerstände rumliegen habe

aber mal zum verständnis

der zustand der schalter wird also für den avr negiert, wenn ich pull
ups nutze

bei pull downs wäre das ein gleich

hab ich das richtig verstanden?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du den Schalter wie gezeigt einbaust: Ja

Wie gezeigt ist: Wenn der Schalter (eigentlich Taster) nicht
gedrueckt ist, dann ist er offen  -> der Pull-up zieht den Pin
auf 1

Ist der Schalter ( Taster ) gedrueckt, dann verbindet der
Schalter/Taster den Pin mit Masse und am Port stellt sich
logisch 0 ein.

Autor: Rene Arnhold (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke

des ganze funzt jetzt auch bei mir

ist ne uhr mit drei tastern

der erste springt ins / aus dem setup menu

die anderen beiden stellen minuten / stunden ein

funzt recht gut :)

nochmal danke

lese mich jetzt mal in adc ein weil soll noch ne temperatur angezeigt
werden

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.