Forum: Mikrocontroller und Digitale Elektronik "Universelle Tastenabfrage" auf Attiny2313


von Adrian E. (ahsd)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Adrian E. schrieb:

> 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

d.h. da sind praktisch alle irgendwie AVR-spezifischen Konstanten nicht 
vorhanden.
Kann es sein, dass du den
1
#include "avr/io.h"
in C_TEST.c vergessen hast?

: Bearbeitet durch User
von MagIO (Gast)


Lesenswert?

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.

von Adrian E. (ahsd)


Lesenswert?

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

Ich nutze AVR-GCC

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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

: Bearbeitet durch User
von Adrian E. (ahsd)


Lesenswert?

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 ?

von Davis (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Adrian E. (ahsd)


Lesenswert?

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.

: Bearbeitet durch User
von Stefanus (Gast)


Lesenswert?

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.

von Adrian E. (ahsd)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Adrian E. (ahsd)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Adrian E. (ahsd)


Lesenswert?

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.

von Moritz A. (moritz_a)


Lesenswert?

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

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

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.

von Fpgakuechle K. (Gast)


Lesenswert?

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,

von Moritz A. (moritz_a)


Lesenswert?

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

von Adrian E. (ahsd)


Lesenswert?

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.

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.