Forum: Mikrocontroller und Digitale Elektronik Attiny 85 Pin Change Interrupt


von Kevin R. (chronm)


Lesenswert?

Hallo zusammen,

Ich möchte folgendes realisieren:
Ich habe eine LED durchgemessen und von 0 bis volle Helligkeit 7 Stufen 
aufgeschrieben. Über zwei Button möchte ich diese Stufen an der LED 
einstellen. Dazu habe ich mir gedacht, da es ja ein Attiny 85 mit nur 
einem External Interrupt ist den Pin Change Interrupt zu nutzen.

So habe ich den Pin Change initialisiert:

  GIMSK |= _BV(PCIE);
  PCMSK |= (1 << PCINT3) | (1 << PCINT4);
  sei();

Und so versuche ich dann die LED anzusteuern:

  ISR(PCINT0_vect) {
    if (digitalRead(incBright) == HIGH) {
      analogWrite(led, 0);
    }
    if (digitalRead(decBright) == HIGH) {
      analogWrite(led, 1023);
    }
  }

Zum Testen habe ich mal nur die Zustände an und aus genommen.

Ich habe es schon über verschiedene Pins zu machen, aber wenn ich zum 
Beispiel anstatt PCINT4 PCINT0 nehme ergibt sich daraus auch ein ganz 
anderes Verhalten bei PCINT3 welches ich nicht verstehe.

Vielleicht kann mich da jemand drüber aufklären und mir auch 
Hilfestellung geben.

Und bitte habt Nachsicht mit mir, ich habe gerade erst damit angefangen 
;)

Viele Grüße
Kevin Raddatz

von Fragender (Gast)


Lesenswert?

Hallo,

und wo ist digitalRead() definiert ?

Die Funktion sieht man nicht.

von Kevin R. (chronm)


Lesenswert?

Hm dass das Problem daran liegt habe ich noch nicht gedacht. Ich kannte 
sie vom Arduino und die IDE hat mir keine Fehlermeldung dazu gegeben, 
deshalb dachte ich es müsste so gehen. Was sollte ich denn stattdessen 
nehmen?

von Bastian W. (jackfrost)


Lesenswert?

Beschreib bitte den Unterschied den du zwischen den einzelnen PCINTs 
festgestellt hast. Hast du die Taster über die Hardware entprellt oder 
ist das in der Digitalread drinnen ?

Wenn du noch nen Timer frei hast kannst du die Entprellung von peda 
nehmen. Da kannst du die Üins der Tasen definieren und die einzeln in 
der Main abfragen.

Gruß JackFrost

: Bearbeitet durch User
von Kevin R. (chronm)


Lesenswert?

Ich habe den Taster über einen PullDown Widerstand nach dieser Anleitung 
entprellt:
http://we-mod-it.com/board6-allgemein/board108-how-to/board231-raspberry-arduino/1972-arduino-tutorial-1-1-einfacher-taster/

Das Verhalten ist etwas schwierig zu beschreiben, ich versuche es mal:
Der Ausgangszustand ist bei beiden, dass die LED schon leuchtet.
Pin Change über PIN 2 und 3 (PCINT3, PCINT4):
Bei Pin 3 passiert gar nichts, Pin 2 schaltet beim drücken die LED an.

Pin Change über Pin 2 und 5 (PCINT3, PCINT0):
Beide schalten die LED aus, sie geht aber nicht mehr an.

Einen Timer habe ich bisher nicht genutzt.

von Stefan F. (Gast)


Lesenswert?

Zeige nochmal den GANZEN Quelltext. Und möglichst auch den Schaltplan.

von Karl M. (Gast)


Lesenswert?

Hallo,

Kevin R. schrieb:
> Ich habe den Taster über einen PullDown Widerstand nach dieser Anleitung
> entprellt:
> 
http://we-mod-it.com/board6-allgemein/board108-how-to/board231-raspberry-arduino/1972-arduino-tutorial-1-1-einfacher-taster/

Entprellen ist doch etwas anderes.

Schau dir bitte das Schema auf Seite 4 an.
# https://datasheets.maximintegrated.com/en/ds/MAX16054.pdf

Wir schalten den Taster nach Masse mit einem Pullup.

Lothar Miller (Moderator) beschreibt verschieden Methoden in seinen 
Artikeln:
# http://www.lothar-miller.de/s9y/categories/5-Entprellung

Hier ist noch ein Beitrag aus dem Forum:
# https://www.mikrocontroller.net/articles/Entprellung

Also mache es bitte gleich richtig und verwende:
# Beitrag "Universelle Tastenabfrage"

Ja das nennt man C Programmieren und Bedarf doch der Grundlagen der 
C-Programmierung.

Das was Du bisher gemacht hast ist ein zusammen klicken von Funktionen.
Erst wenn man (fas) alles selbst programmieren kann, dann kann man sich 
Programmierer nennen. Gut es gibt eine C Standard Bibliotheken und AVR 
Includefiles, die man so wie so immer nutzen darf und sollte.

von Stefan F. (Gast)


Lesenswert?


von Kevin R. (chronm)


Angehängte Dateien:

Lesenswert?

So zum Teil habe ich das Problem nun gelöst bekommen. Ich hatte 
erwartet, dass man die Pins vom Attiny 1 zu 1 in die IDE übernehmen 
kann.
An wäre ich damit nun fertig, da ich später eh Sensorbutton nehmen werde 
und die dürften ja eigentlich nicht prellen, oder vertue ich mich da?

Zu Lernzwecken würde ich aber trotzdem gerne das Entprellen von Peda 
einsetzen. Allerdings verstehe ich nicht wie ich das bei mir einsetzen 
soll..

von Bastian W. (jackfrost)


Lesenswert?

Kevin R. schrieb:
> Zu Lernzwecken würde ich aber trotzdem gerne das Entprellen von Peda
> einsetzen. Allerdings verstehe ich nicht wie ich das bei mir einsetzen
> soll..

Naja du fügst den Code vom Entprellen ( 
https://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29 
) ein und veränderst die Werte so das es zu dem Verwendeten Timer und 
Port/Pins passt.

Dann musst du nur noch in der Mainschleife
1
 if( get_key_short( 1<<KEYx ))

aufrufen und den entsprechenden Code von dem Pin einfügen.

Gruß JackFrost

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.