Attiny 85 Pin Change Interrupt

OP #4467519
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
#4467890
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
OP #4468410
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.
Gast #4468449
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.
OP #4468573
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..
Angehängte Dateien:
#4470179
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren