Wie viele externe Interrupts hat attiny85?

Der Titel ist ziemlich selbsterklärend. Ich stelle diese Frage, weil ich auf der Atmel-Webseite widersprüchliche Informationen gefunden habe. Ich brauche zwei externe Interrupts, um einen Drehgeber zu steuern. Einer unterbricht Steuerimpulse von einem Pin (sowohl steigend als auch fallend) und der andere unterbricht das gleiche für den anderen Pin. Wenn ich also nur 1 habe, funktioniert es bei mir nicht.

Wie schnell ändert sich der Encoder? Ich hatte eine schreckliche Zeit beim Versuch, eine sich schnell ändernde Encoder-Funktion mit Interrupts zu erstellen, und wechselte zu einem Controller, der Encoder-Eingänge direkter verarbeitete (in diesem Fall Bild 18f4331). Interrupts sind für Dinge wie Frob-Knöpfe in Ordnung, aber wenn Sie sich schnell drehende Motoren ansehen, sollten Sie sich einen Chip ansehen, der dafür ausgelegt ist, damit umzugehen.
Es ist ein Knopf, 4 Impulse in jeder Position, 20 Positionen pro Umdrehung. Ich schätze, 300 Impulse pro Sekunde beginnen sehr schnell mit den Fingern. Ich habe es im ATmega32U4 des Arduino Leonardo ganz gut zum Laufen gebracht. Aber ich benutze 2 Interrupts, und das ist das Problem mit dem attiny85. Trotzdem danke, daran habe ich nicht gedacht.
Dann kein Problem!

Antworten (2)

Es gibt INT0 und dann gibt es PCINT[0:5]. INT0 erhält seine eigene Interrupt-Routine, und PCINT hat eine Routine für alle Pins, die für die Verwendung durch den Interrupt konfiguriert sind. Das bedeutet, dass eines der ersten Dinge, die die Interrupt-Routine tun muss, herauszufinden, welche Pins sich tatsächlich geändert haben, um den Interrupt auszulösen. Sollte eigentlich bequemer sein, diesen Weg für Ihren Encoder zu verwenden, da Sie wirklich möchten, dass jede Encoder-Änderung dieselbe Interrupt-Routine auslöst.

Ich habe keine Ahnung, ob dies alles über die Arduino-Plattform zugänglich ist oder ob Sie den Controller selbst programmieren müssen (da ich kein Arduino-Benutzer bin).

Ich werde dies mit der Arduino-Schnittstelle versuchen. Wenn es nicht funktioniert, muss ich mir die Hände schmutzig machen und die nativen avr-Bibliotheken verwenden. Danke es hilft wirklich.

Sie können dies bei Bedarf mit einem einzelnen Interrupt tun, indem Sie die beiden Pins in den einen Interrupt ODERn ("etwas hat sich geändert"). Sie benötigen immer noch zwei digitale Eingänge, um die Encoder-Pins zu lesen, und die ISR (oder eine Hilfsroutine auf Exec-Ebene) muss die Verantwortung dafür übernehmen, herauszufinden, welche Encoder-Pins sich geändert haben, aber es ist machbar.

Es fiel mir schwer, die Pins zu lesen, nachdem der Interrupt aufgerufen wurde. Es war mein erster Ansatz. Der Encoder springt, und Sie lesen vielleicht, wann er nicht stabil ist. Ich lasse es als letzte Ressource. Danke