Hallo Leute,
könnt ihr mir helfen, den Code zum Entprellen von 8 Tasten auf einem
Attiny2313 zum Laufen zu bekommen? (Und wenn möglich auch Attiny13)
Beitrag "Universelle Tastenabfrage"
Ich bin gerade noch am C und AVR Programmieren lernen und langsam komm
ich nicht drumherum, Taster einzusetzen. Leider ist der Code von Peter
noch weitaus zu kompliziert, dass ich ihn verstehen und modifizieren
könnte.
Beim Kompilieren des original Codes für den 2313 bekomme ich folgende
Errors:
1
C_TAST.c: In function 'main':
2
C_TAST.c:102: error: 'TCCR0' undeclared (first use in this function)
3
C_TAST.c:102: error: 'CS02' undeclared (first use in this function)
4
C_TAST.c:102: error: 'CS00' undeclared (first use in this function)
5
C_TAST.c:103: error: 'TIMSK' undeclared (first use in this function)
6
C_TAST.c:103: error: 'TOIE0' undeclared (first use in this function)
7
C_TAST.c:105: error: 'PORTA' undeclared (first use in this function)
8
C_TAST.c:106: error: 'DDRA' undeclared (first use in this function)
9
make.exe: *** [C_TAST.o] Error 1
In dem original Thread wurde ich schon darauf hingewiesen, dass ich
a) die Ports richtig ansprechen muss
b) einen Timer mit ca 10ms Interruptzykluszeit aufsetzen soll
Ich habe versucht das Datenblatt zu studieren, aber bin zu keinem
funktionierenden Ergebnis gekommen. Es wäre nett, wenn ihr mir helfen
könntet. Ich möchte weiter kommen beim Lernen, aber ohne Taster wird es
bald langweilig.
Ich hab schon Ewigkeiten nix mehr mit AVRs gemacht, aber es sieht mir so
aus als würde die richtige AVR -Typ-Spezifische .h-Datei beim
compilieren noch fehlen. Dort werden solche Konstanten, Makros usw.
definiert.
Wäre also hilfreich zu wissen welchen Compiler du nutzt.
Entschuldige! Das kommt davon, wenn man eine Woche nach einem Problem
den Thread dazu schreibt ;)
Ich musste noch avr/ vor die #include Pfade setzen. Dann kommt folgender
Error:
1
_TAST.c: In function 'main':
2
C_TAST.c:102: error: 'TCCR0' undeclared (first use in this function)
3
C_TAST.c:102: error: (Each undeclared identifier is reported only once
4
C_TAST.c:102: error: for each function it appears in.)
Adrian E. schrieb:> Entschuldige! Das kommt davon, wenn man eine Woche nach einem Problem> den Thread dazu schreibt ;)>> Ich musste noch avr/ vor die #include Pfade setzen. Dann kommt folgender> Error:>>
1
_TAST.c: In function 'main':
2
> C_TAST.c:102: error: 'TCCR0' undeclared (first use in this function)
3
> C_TAST.c:102: error: (Each undeclared identifier is reported only once
4
> C_TAST.c:102: error: for each function it appears in.)
5
> make.exe: *** [C_TAST.o] Error 1
Das heißt im Grunde nichts anderes, als das es bei einem µC (dem
Tiny2313) kein Register TCCR0 gibt.
Kurze Suche im Datenblatt ergibt: Es gibt ein TCCR0A und ein TCCR0B.
Also heißt es ergründen, was beim Originalcode mittels TCCR0 alles beim
Timer eingeschaltet wurde und dann beim Tiny2313 nachsehen, welche Bits
in welchem der beiden TCCR0x Register die sinngemäss gleiche Operation
machen.
Hint: diese Entprellung verlangt nicht viel vom Timer - d.h. die
Operation des Umsetzens solltest du tatsächlich alleine hinkriegen.
Der Code ist nicht wirklich darauf angewiesen, dass die ISR in exakt
10ms Intervallen aufgerufen wird. Jede Zeit, die sich zwischen 5 und
sagen wir mal 40ms bewegt, wäre ok.
FAQ: Timer
Adrian E. schrieb:> Okay, leider durchsteige ich schon diese Zeile nicht:>
1
TCCR0=1<<CS02^1<<CS00;// divide by 1024
>> Ich verstehe, dass Bits in dem Timerregister TCCR0 gesetzt werden, aber> was bedeutet CS02 und CS00 ?
Antwort kommt gleich. Wenn du zwischenzeitlich den Wunsch verspürst in
das Datenblatt zu gucken, einfach unterdrücken.
Adrian E. schrieb:> Okay, leider durchsteige ich schon diese Zeile nicht:>
1
TCCR0=1<<CS02^1<<CS00;// divide by 1024
>> Ich verstehe, dass Bits in dem Timerregister TCCR0 gesetzt werden, aber> was bedeutet CS02 und CS00 ?
Was steht im Datenblatt dazu?
Sorry. Aber irgendwann musst du mal anfangen mit dem Datenblatt (den
Datenblättern) zu arbeiten. Warum also nicht hier, wo es besonders
einfach ist.
Sieh nach, für welchen µC die Originalsoftware geschrieben wurde, hol
dir von Atmel das Datenblatt für diesen Prozessor und finde raus, was
die beiden Bits bei diesem Prozessor machen.
Hinweis: es handelt sich um die Einstellung des Vorteilers. Aber - auf
welchen WErt wird er eingestellt - und auch nicht unwichtig: warum
gerade auf diesen Wert.
Speziell die letzte Frage ist insofern wichtig, weil du bei der Timer
Taktfrequenz wieder auf ungefähr dieselbe Zahl kommen willst. DIe hängt
aber nicht nur vom Vorteiler ab, sondern auch davon wie schnell dein µC
insgesammt getaktet wird.
1
Original_Taktrate / Original_Vorteiler -> eine bestimmte Zahl
1
Deine_Taktrate / Dein_Vorteiler -> dieselbe Zahl
Deine Taktrate kennst du. Die zu erreichende Zahl kennst du auch, bzw.
die hast du aus dem Originalcode und mit Verwendung des Datenblatts des
im Original verwendeten µC bestimmt.
Daraus kannst du dann bestimmen, welchen Vorteiler du bei DEINEM Tiny
benutzen willst, so dass du möglichst gut wieder auf dieselbe Zahl
kommst. Dann ab ins Datenblatt für deinen Tiny und dort raqusgesucht,
welcher mögliche Vorteiler dieser Wunschzahl am nächsten kommt.
Hi,
danke schonmal so weit :) Ich traue mich jetzt tatsächlich mehr, mal ins
Datenblatt zu schauen..
Im Datenblatt sieht es so aus, als wären die Clock Select Bits beim
Atmega16 und Attiny2313 die gleichen. Ich habe jetzt
1
TCCR0=1<<CS02^1<<CS00;// divide by 1024
gegen
1
TCCR0A=1<<CS02^1<<CS00;// divide by 1024
getauscht.
Da kommt schonmal kein Error mehr. Ich werde das gleich mal auf einem
Breadboard aufbauen um es zu testen.
Edit: Ich möchte doch im besten Fall den Teiler wie im original Code,
nämlich 1024, oder? Und wenn ich die Bits genau gleich setze, habe ich
laut Datenblatt auch den Gleichen Teiler. Mein µC ist auch so getaktet
wie im original Code.
Wenn du vorher noch keine Taster verwendet hast, dann leg diese Funktion
von Peter erstmal zur Seite. Erst sollte man die Grundlagen beherrschen,
bevor man sich mit fremden Code auseinander setzt. Sonst wirst du die
verstehen, wie er funktioniert - fall du ihn überhaupt an Laufen
bekommst.
Man kann Taster auch ohne großes Brimborium abfragen. In gefühlt
mindestens 50% der Fälle braucht man gar keine Entprellung. Also frage
deine Taster erstmal ohne Entprellung ab.
Und falls Deine Anwendung Entprellung braucht (ich hoffe Dir ist klar,
ob ja oder nein), dann programmiere erstmal eine Entprellung selbst für
einen einzelnen Taster. Meinetwegen erstmal mit Warteschleifen ohne
Timer. Dann mit Timer und dann eventuell mit Peters Code.
Man arbeitet sich langsam hoch. Bäcker fangen auch mit Brot an, nicht
mit Hochzeitstorten.
Hi, das ist nett gemeint, aber bei mir hat noch nie ein Taster ohne
Entprellung funktioniert. Da hier auch schon von Anderen darauf
hingewiesen wurde, dass der Code von Peter recht trickreich programmiert
ist und man ihn nicht unbedingt komplett verstehen muss um ihn
einzusetzen, würde ich ihn schon gerne zum laufen bekommen. Vor allem
habe ich viele Anwendungen, die zwar ansich recht simpel sind, aber
schon mehrere Taster benötigen.
Ich wäre also froh, wenn wir das hier gelöst bekommen :)
Ich habe jetzt einen Taster an PB0 gegen GND, zwei LEDs an PA0 und PA1
gegen GND.
Die LEDs leuchten von Anfang an durchgehend und der Taster bewirkt gar
nichts.. Ich stehe leider etwas auf dem Schlauch.
Edit: Du hast aber an sich recht, ich werde doch in der nächstne Zeit
mal einfache Entprellroutinen selber schreiben.
Adrian E. schrieb:> Im Datenblatt sieht es so aus, als wären die Clock Select Bits beim> Atmega16 und Attiny2313 die gleichen. Ich habe jetzt>
1
TCCR0=1<<CS02^1<<CS00;// divide by 1024
> gegen>
1
TCCR0A=1<<CS02^1<<CS00;// divide by 1024
> getauscht.
Wie kommst du auf TCCR0A?
Wenn ich ins Datenblatt vom Tiny2313 schaue, dann sind die CS Bits im
TCCR0B Register beheimatet.
> Edit: Ich möchte doch im besten Fall den Teiler wie im original Code,> nämlich 1024, oder? Und wenn ich die Bits genau gleich setze, habe ich> laut Datenblatt auch den Gleichen Teiler. Mein µC ist auch so getaktet> wie im original Code.
Wenn du die gleiche Taktfrequenz hast, dann willst du auch denselben
Teiler benutzen.
Soweit passt das.
Adrian E. schrieb:> Da hier auch schon von Anderen darauf> hingewiesen wurde, dass der Code von Peter recht trickreich programmiert> ist und man ihn nicht unbedingt komplett verstehen muss um ihn> einzusetzen, würde ich ihn schon gerne zum laufen bekommen.
Das passt schon.
Du musst nur EXAKT arbeiten.
Das falsche Konfigurationsregister zu erwischen hat nichts mit dem
Entprellcode zu tun. Sowas darf einfach nicht passieren.
Karl Heinz schrieb:> Adrian E. schrieb:>> Da hier auch schon von Anderen darauf>> hingewiesen wurde, dass der Code von Peter recht trickreich programmiert>> ist und man ihn nicht unbedingt komplett verstehen muss um ihn>> einzusetzen, würde ich ihn schon gerne zum laufen bekommen.>> Das passt schon.> Du musst nur EXAKT arbeiten.>> Das falsche Konfigurationsregister zu erwischen hat nichts mit dem> Entprellcode zu tun. Sowas darf einfach nicht passieren.
Du hast recht, natürlich...
Sieht so aus als würde es funktionieren! :D
Adrian E. schrieb:>> Das falsche Konfigurationsregister zu erwischen hat nichts mit dem>> Entprellcode zu tun. Sowas darf einfach nicht passieren.>> Du hast recht, natürlich...>> Sieht so aus als würde es funktionieren! :D
Natürlich funktionierts :-)
Dieser Entprellcode ist einfach nur der Hammer. Alles was man je von
Tasten haben wollte oder haben will.
Da ist es auch nicht schlimm, wenn man den ISR Code nicht versteht. Frag
mal die Leute, ob sie im Detail verstehen wie malloc() funktioniert. Und
trotzdem verwenden sie es. Nicht anders ist es hier: das ist ein
richtiger "Copy&Forget" Code, der einfach nur seine Arbeit macht.
Danke nochmal für die schnelle Hilfe :)
Gibt es noch Tipps, wie sich der Code am einfachsten in neue Programme
einbauen lässt? Kann man ihn zB in eine Header Datei verpacken? Oder in
eine eigene .c Source Datei auslagern? Letzteres habe ich noch nie
gemacht.
Adrian E. schrieb:> Gibt es noch Tipps, wie sich der Code am einfachsten in neue Programme> einbauen lässt? Kann man ihn zB in eine Header Datei verpacken? Oder in> eine eigene .c Source Datei auslagern? Letzteres habe ich noch nie> gemacht.
Ich lagere ihn üblicherweise aus, in eine keys.c/keys.h, siehe zB
https://github.com/maugsburger/blinkenkringel/tree/master/src/ (der Code
ist sogar für einen tiny2313/4313 passend).
In dem Fall das '#include "key.h"' in der main.c nicht vergessen, sowie
dem Compiler mitteilen dass er bitteschön auch keys.c mitkompiliert (in
dem Fall Zeile 84 im Makefile
https://github.com/maugsburger/blinkenkringel/blob/master/src/Makefile#L84)
Nicht über den restlichen Code wundern, der ist stellenweise noch sehr
zusamemnge(h|k)ackt und aufräumwürdig.
Moritz
Stefanus schrieb:> Man kann Taster auch ohne großes Brimborium abfragen.
Also lieber selber entwickeln auf die harte Tour mit Trial&Error.
Nur um dann festzustellen, das es Mist ist, mit vielen Nebenwirkungen,
Abhängigkleiten, schlecht in andere Projekte zu übernehmen usw.
Stefanus schrieb:> Bäcker fangen auch mit Brot an, nicht> mit Hochzeitstorten.
Sie nehmen aber fertiges Mehl dazu und mahlen das Getreide nicht selber.
Peter Dannegger schrieb:> Stefanus schrieb:>> Man kann Taster auch ohne großes Brimborium abfragen.>> Also lieber selber entwickeln auf die harte Tour mit Trial&Error.> Nur um dann festzustellen, das es Mist ist, mit vielen Nebenwirkungen,> Abhängigkleiten, schlecht in andere Projekte zu übernehmen usw.
Genau das ist der Sinn hinter Versuch & Irrtum -> selbst erkennen zu
können was Mist und was Gold ist (und wie man selbst Gold statt Misz
fabriziert).
MfG,
Fpga Kuechle schrieb:> Genau das ist der Sinn hinter Versuch & Irrtum -> selbst erkennen zu> können was Mist und was Gold ist (und wie man selbst Gold statt Misz> fabriziert).
Stimmt, ich fange gleich mal an nurnoch in Maschinencode zu schreiben.
Vielleicht finde ich ja die Zeit, mir einen Assembler zu bauen, oder
gleich eine ganze Hochsprache.
Wobei, vielleicht sollte ich erstmal mein Programmiergerät überarbeiten,
alles manuell mit Schaltern zu programmieren nervt auf Dauer. Vor allem
der CLK-Flankentaster nutzt sich so schnell ab.
Merkst du was? Es gibt immer ein gewisses Level, bis zu dem man
sinnvollerweise auf fertige Dinge zurückgreift. Irgenwdann definiert
sich das nur noch über die benötigte Zeit/Kosten. Vielleicht ist der
nächstgrößere µC günstiger als die Zeit, um es so zu optimieren, dass es
auf den kleinen passt. Oder fertige Libraries zu verwenden statt alles
selber auszubasteln.
Moritz
Peter Dannegger schrieb:> Stefanus schrieb:>> Man kann Taster auch ohne großes Brimborium abfragen.>> Also lieber selber entwickeln auf die harte Tour mit Trial&Error.> Nur um dann festzustellen, das es Mist ist, mit vielen Nebenwirkungen,> Abhängigkleiten, schlecht in andere Projekte zu übernehmen usw.
Danke Peter! Ich hab was ich brauche. Jetzt funktionieren die Taster,
ich kann weiter experimentieren, ohne dass mir langweilig wird und
irgendwann auch den Entprell-Code verstehen. So läuft das in der PRAXIS.