Forum: Mikrocontroller und Digitale Elektronik input bei atmega8


von Rene Arnhold (Gast)


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

von Stefan Sczekalla (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

ich vermisse pulldown widerstände

von Rene Arnhold (Gast)


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?

von Simon K. (simon) Benutzerseite


Lesenswert?

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

ein AVR hat keine pulldowns

von Rene Arnhold (Gast)


Lesenswert?

wie?

hat er nicht?

und warum lese ich das dann im avr-gcc manual

von Simon K. (simon) Benutzerseite


Lesenswert?

wo?

von Rene Arnhold (Gast)


Lesenswert?


von Simon K. (simon) Benutzerseite


Lesenswert?

Ich les zwar was von Pulldowns, aber nur im zusammenhang mit externer
beschaltung

von Rene Arnhold (Gast)


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

von Karl H. (kbuchegg)


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.

von Rene Arnhold (Gast)


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?

von Karl H. (kbuchegg)


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.

von Rene Arnhold (Gast)


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

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.