Forum: Mikrocontroller und Digitale Elektronik AVR einfache Schaltung mit assembler realisieren


von Mark W. (kram) Benutzerseite


Lesenswert?

Hallo,

ein gesundes neues Jahr erstmal an dieser Stelle.

Ich habe lange nichts mehr mit AVR Controllern gemacht, und vor Jahren 
auch nur einfache Sachen mittels STK500.

Ich wollte folgendes realisieren. Dazu habe ich ein STK600 und den 
Atmega2560 zum Probieren. Spaeter soll das Ganze auf einem Atiny13A 
laufen. Aber ertmal geht es mir darum den Code dazu zu schreiben und zu 
verstehen.
Beim Durcharbeiten des Tutorial hier, meckert der Compiler beim Register 
GICR. Muss ich mal im Datenblatt des 2560 nachsehen, hab ich noch nicht 
gemacht.

Ein Eingang, ein Ausgang. Dazu benutze ich erstmal Port B und Port D am 
STK600.
Kurz druecken(<2s) schaltet den Ausgang ein, nochmaliges kurz druecken 
schaltet den Ausgang aus usw.
Wenn der Ausgang durch kurzes druecken ein ist, sollte lang druecken 
keinen effect haben.
Lang druecken(>3s) schaltet den Ausgang nach einer im code 
voreingestellten Zeit(0-72h) ein. Dann kann nur nochmaliges lang 
druecken den Ausgang wieder ausschalten. Wenn der timer laeuft, sollte 
kurzes druecken keinen effect haben. Wenn der Ausgang nach Ablauf des 
Timers automatisch eingeschaltet ist, sollte er durch kurzes druecken 
wieder ausgeschaltet werden.

Also wenn mir jemand da etwas code liefern wuerde, waere ich sehr 
dankbar. Hinweise zu Informationen diesbezueglich sind auch willkommen. 
Spaeter will ich das dann in Assembler und in C haben, um es mir 
verstaendlich zu machen, erstmal gehts mir aber um Assembler.

vielen Dank...
von Achim M. (minifloat)


Lesenswert?

Kann da eine von Peter Dannegers Routinen für seine 
"Bulletproof"-Tastenentprellung
nicht auch zwischen langen und kurzen Tastendrücken unterscheiden?

http://www.mikrocontroller.net/articles/Entprellung

Freilich ist PeDas Code für den Neueinstieg recht starker Tobak...
mfg mf

PS: Schön, dass du dich noch mal ran wagst. Es ist ein harter Weg mit 
viel Frustration und Rückschlägen.
von Karl H. (kbuchegg)


Lesenswert?

Mini Float schrieb:

> http://www.mikrocontroller.net/articles/Entprellung
>
> Freilich ist PeDas Code für den Neueinstieg recht starker Tobak...

Einer der wenigen Fälle, an denen eine Ausnahme gerechtfertigt ist. Den 
Code muss man nicht im Detail verstehen, dazu funktioniert er einfach zu 
gut, als das man es sich leisten könnte den links liegen zu lassen.

Die beschriebene Aufgabenstellung ist damit ein Klacks. Zumindest was 
den Tastenteil anbelangt. Das spielt die PeDa Lösung aus dem Stand 
problemlos.
von Mark W. (kram) Benutzerseite


Lesenswert?

Hallo,

vielen Dank fuer die Hinweise. Der erste Teil funktioniert an sich 
schon.
Beim Kompilieren der Beispiele bekomme ich jedoch die folgenden 
Fehlermeldungen:

Undefined symbol: TCCR0
Undefined symbol: TIMSK

Sind diese Register mit meinem verwendeten Controller nicht vereinbar?
Was bedeutet das?
von Ingo (Gast)


Lesenswert?

Die Register heißen bei dir wohl etwas anders, musste mal ins DB gucken.


Grüße,
Ingo
von Karl H. (kbuchegg)


Lesenswert?

Wenn die Register anders heißen, kann es sein dass auch die Bits an 
anderen STellen sind. Das muss man aber sowieso immer überprüfen, wenn 
man Code von einem Prozessor auf den anderen überträgt.

ALlerdings ist die PeDa Lösung nicht anspruchsvoll. Irgendein 
regelmässiger Timerinterrupt, dessen Wiederholperiode irgendwo im 
Bereich von 5 bis 20 Millisekunden liegt, reicht ihr schon. Und wenns 
40ms sind, ist es auch noch kein Beinbruch.
So einen Timer hat man meistens in der einen oder anderen Form sowieso 
im Programm. Zb.: Wie hast du eigentlich vor die 0 bis 72h Wartezeit zu 
realisieren? Da fällt doch sicher ein Timer ab, in dessen ISR man noch 
den Entprellcode mit aufnehmen kann.

Da dein Zielprozessor letztendlich ein Tiny13 ist, würde ich mir da 
einen Timer suchen (Datenblattvergleich), der beim Tiny13 und beim 
Mega2560 gleich sind. Vor allen Dingen sollten sie gleiche Bitzahl 
haben, sonst muss man später die ganzen Konstanten alle wieder neu 
berechnen.
von Mark W. (kram) Benutzerseite


Lesenswert?

Hallo Ingo,

nachdem ich die Datenblaetter verglichen habe, hab ich die folgenden 
beiden Register benutzt:

TCCR1A anstelle von TCCR0
TIMSK1 anstelle von TIMSK

Dies fuehrte zu folgenden Fehlermeldungen:

Operand 1 out of range: 0x80
Operand 1 out of range: 0x6f

Ich stoebere weiter....
von Karl H. (kbuchegg)


Lesenswert?

Mark W. schrieb:

> Dies fuehrte zu folgenden Fehlermeldungen:
>
> Operand 1 out of range: 0x80
> Operand 1 out of range: 0x6f
>

Du musst dir angewöhnen, zu einer Fehlermeldung immer auch die Zeile 
oder die nähere Umgebung zu zeigen, in der der Fehler auftritt.

Für deinen AUtomechaniker ist es schliesslich ja auch interessant, 
welche Automarke du fährst, wenn auf dem DIsplay ein Fehlercode 
auftaucht.
von spess53 (Gast)


Lesenswert?

Hi

>TCCR1A anstelle von TCCR0

Was nun? Timer1 oder Timer0

>Dies fuehrte zu folgenden Fehlermeldungen:

>Operand 1 out of range: 0x80
>Operand 1 out of range: 0x6f

Beim ATMega2560 liegen eine Reihe IO-Register im Adressbereich, der mit 
in/out nicht mehr erreichbar ist. Einfach statt dessen lds/sts 
verwenden.

MfG Spess
von Karl H. (kbuchegg)


Lesenswert?

Mark W. schrieb:
> Hallo Ingo,
>
> nachdem ich die Datenblaetter verglichen habe, hab ich die folgenden
> beiden Register benutzt:
>
> TCCR1A anstelle von TCCR0
> TIMSK1 anstelle von TIMSK

Na, ob das so schlau ist, anstelle des 8_bit Timer 0 den Timer 1 zu 
benutzen? Zumal der Tiny13 keinen Timer 1 hat sondern nur einen 8-Bit 
Timer 0 und beim Mega2560 der Timer 1 ein 16 Bit Timer ist. Du steuerst 
da jetzt geradewegs auf ein Programm zu, dass du auf dem Mega 
entwickelst und dann für den Tiny wieder komplett umschreiben kannst.

Mit welcher Taktfrequenz wird dein deine Schaltung laufen? Bevor man 
anfängt sollte man erst mal ein bischen rechnen. Besonders die 
Interrupt-Intervalle sind nicht ganz uninteressant und da sollte man im 
Vorfeld schon eine Vorstellung davon haben, wo die Reise hingehen wird.
von Mark W. (kram) Benutzerseite


Lesenswert?

Hallo,

Es geht darum:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten

Das Beispiel "Entprellung" funktioniert ohne Fehlermeldungen.
Jedoch das naechste Beispiel "Einfache Entprellung und Abfrage" schon 
nicht mehr. Jedenfalls nicht mit dem mir zur Verfuegung stehenden 2560.

Statt TCCR0 nahm ich das Register TCCR1A. Mittlerweile auch die anderen 
Timer.
Statt TIMSK0 nahm ich TIMSK1.

Die Fehlermeldungen wechselten von:

Undefined symbol: TCCR0
Undefined symbol: TIMSK

zu

Operand 1 out of range: 0x80
Operand 1 out of range: 0x6f

AVR Studio 5.0.1223
von spess53 (Gast)


Lesenswert?

Hi

Liest du eigentlich die Antworten?

MfG Spess
von Karl H. (kbuchegg)


Lesenswert?

Mark W. schrieb:

> Das Beispiel "Entprellung" funktioniert ohne Fehlermeldungen.
> Jedoch das naechste Beispiel "Einfache Entprellung und Abfrage" schon
> nicht mehr. Jedenfalls nicht mit dem mir zur Verfuegung stehenden 2560.

Nun ja.
Das Tutorial ist aber auch gedacht, dass man es von vorne durchmacht. 
Wenn man mitten drinn einsteigt, dann fehlt einem halt das ganze Wissen 
von davor.

> Statt TCCR0 nahm ich das Register TCCR1A.

Schlechte Wahl.

> Mittlerweile auch die anderen
> Timer.

Welche anderen Timer? ZU jedem Timer gehört ein Satz 
Konfigurationsregister. Im Namen jedes Konfigurationsregisters kommt die 
Nummer des Timers vor.

> Operand 1 out of range: 0x80
> Operand 1 out of range: 0x6f

Wie Spess schon sagte: Die liegen beim Mega so, dass sie mit einem out 
nicht mehr erreichbar sind. Da muss man auf sts ausweichen.

Bleib doch beim Timer 0
Auch im Hinblick darauf, dass du ja eigentlich irgendwann auf den Tiny 
gehen willst.
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.