Forum: Mikrocontroller und Digitale Elektronik Timer in Assembler probleme...


von Manu (Gast)


Lesenswert?

Hallo an alle,

ich bekomme bei meinem MEGA 8 leider den Timer nicht zum laufen.
Wollte nur ein wenig damit rumspielen. Er soll einfach hochzählen
und wenn er einen bestimmten Wert erreicht hat, soll auf PORTB
0xFF ausgegeben werden. Habe das ganze in etwa so gemacht:

----
.include "4433def.inc"

 ldi r16,0xFF
 out DDRB, r16

 ldi r16, 0b00000011
 out TCCR0, r16

 ldi r16, 0b00001111

loop:
 ldi r17, TCNT0
 cp r16,r17
 ldi r17, 0b00000000
 out portb, r17
 rjmp loop

test:  ldi r17, 0b11111111
       out portb, r17

---

Später möchte ich auf externen Clock umstellen und damit
Frequenzen messen (nur bis ca 5 kHz!) .. Wie muss ich dort
dann die ISR definieren?

Danke schonmal im voraus!

Manu

von leo9 (Gast)


Lesenswert?

sofern ich dein Code-Fragment richtig interpretiere gibt dein Programm
ununterbrochen 0x00 auf Port B aus, nach dem compare müsstest du das
Z-Flag befragen.

grüsse leo9

von Alexander Niessen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo "Gott des Krieges" g,
zunächst mal würde ich dem Assembler mitteilen, dass es sich um einen
Mega8 handelt. Also:
.include "m8def.inc" anstatt .include "4433def.inc"
Das Datenrichtungsregister ist noch ok - aber dann kann ich dir nicht
mehr folgen.

Schau doch mal ins Datenblatt zum Mega8 in die Sektion "Timer ..."

Hier meine 10 Punkte, welche zu einem laufenden Timer führen:
1. Im Hauptprogramm setzt du deine Datenrichtungen & Ports ...
2. ... Timer/Counter-Interrupt Mask setzen (TIMSK) ...
3. ... Timer/Counter Prescaler setzen ...
4. ... Timer mit Wert laden ...
5. ... Interrupts freigeben.
6. In deiner ISR (in meinem Beispiel tim_ovf1) lädst du deinen
   Timer neu und machst den Kram, den du halt in der ISR
   machen wolltest :)
7. debuggen
8. läuft wie gewollt ? dann springe zu 10.
9. goto 7.
10. über die geleistete Arbeit freuen

Im Anhang findest du ein einfaches Beispiel aus der Praxis. Meine Frau
brauchte einen Timer für 180 Sekunden. Falls du nicht weiterkommst
(nach dem Studium des Datenblattes) frag' halt nochmal.

Grüße,
Alex

von Alexander Niessen (Gast)


Lesenswert?

SRY:
Noch kurz was zur Erklärung des Beispielprogramms:
Zwischen PB0 und PB1 ist eine 2-polige-DUO-LED.
Diese blinkt 180 Sekunden rot und danach für 10 Sekunden gruen.
Das 'Ding' findet übringens als 'Zahnputzuhr' in unsrem Haushalt
Verwendung :)

Grüße,
Alex

von Frank (Gast)


Lesenswert?

Hallo

Du hast einen Controller dafür geopfert? Finde ich ja gut.
Wenn der Controller im sleepmodus ist, wieviel Strom nimmt er dann?
Hast Du noch mehr solcher kleinen Haushelferchen???
Gruss
Frank

von Alexander Niessen (Gast)


Lesenswert?

Irgendwo muss man ja die Controller, die laut Spezifikation gar nich
mehr zu brennen sein dürften (wg der Anzahl der Brennvorgänge), ja
'entsorgen'  :-)

Tja ... mit dem Sleepmodus hab ich mir die Karten gelegt:
Auf meinem Testboard war alles wunderbar und die Stromaufnahme so
gering, dass (vorsichtig gerechnet) das Teil mindestens ein 3/4 Jahr
mit einer 9V Batterie laufen sollte. Werte weiss ich nicht mehr.

Dann hab ich ein Platinchen gemacht (und genau hier nimmt das Schicksal
seinen Lauf ...):
Auf meinem Testboard habe ich nur die Stromaufnahme vom Controller +
LED gemessen.
Auf der Platine ist aber noch ein 78L05 mit drauf ...
dieser nimmt sich sage und schreibe 3mA !!
Nach zwei Tagen war die Batterie leer hmpf
Naja aus Fehlern lernt man. Da das Ding recht praktisch ist hab ich
halt ein herumliegendes Steckernetzteil genommen und seitdem verrichtet
die 'Uhr' ihren Dienst.
Ich ärger' mich allerdings mindestens zwei mal am Tag (beim
Zähneputzen eben...) über die Verlustleistung des Steckernetzteils.

So viel zu dieser Bastelei.

'Helferlein' hab' ich sonst keine. Ich hab vor gut zwei Jahren mit
den Controllern angefangen, weil mich das Thema Hausautomation
beschäftigt: Busknoten in jedem Zimmer, welche vom PC aus mit Daten
versorgt werden können. Die Knoten laufen auch ohne PC. PC dient nur
zur Kontrolle und Eingabe von Daten (Zeiten ...). Vernetzt is das ganze
über RS485. Bisher nur in meiner Bastelbude mit 4 Knoten getestet. Das
tatsächlich in den realen Betrieb zu integrieren is mir z zt zu
aufwändig. Das fängt damit an, dass bei uns keine Leer-Rohre liegen
...


Grüße,
Alex

von Frank (Gast)


Lesenswert?

Hallo
und was würdest Du mit dem Hausbus alles so steuern
wollen. Hast Du Beruflich mit den Controllern zu tun oder auch
alles learning by doing?
Frank

von Alexander Niessen (Gast)


Lesenswert?

Alles learning by doing. Programmieren tu' ich allerdings schon über 20
Jahre. Da war das mit den Controllern keine grosse Sache.
Beruflich mach ich was ganz anderes. Nix mit Elektronik oder Software.
Ist alles Hobby.

Was ich damit steuren werde in Zukunft ?
Naja - Ich bin zur Vernunft gekommen. Man redet ja schonmal vom
vernetzten Haus ... Alles Blödsinn, finde ich. Keine (!) Software ist
fehlerfrei ! Über die Konsequenzen von Bugs mag ich garnicht weiter
nachdenken (egal ob das Zeug nun von 'professionellen' oder vom
Hobbybastler stammt).
Ich werde mich auf Heizung + Rolladen beschränken. Beim Licht will ich
auf den guten, alten Schalter nicht verzichten.
Aber auch aus den beiden Dingen Heizung und Rollade kann man mehr raus
holen als man auf den ersten Blick vermuten mag:
Zum Beispiel kannst du über 'nen LDR gucken obs Tag oder Nacht is.
Dann misst du noch die Aussentemperatur und kannst ggf auf der Seite wo
die Sonne so strak scheint die Rollade automatisch runter lassen damit
es in der Bude nicht unnötig heiss wird.

Grüße,
Alex

von Frank (Gast)


Lesenswert?

muss schon sagen respekt! Ich habe gerade angefangen mit AVR und
Assembler. Ich tu mich schwer mit dem Assembler und vor allem mit dem
Datenblatt des Atmega8. Ist schon harter toback dieses Fachenglisch.
Aber ich werdemich da durchbeissen;-)!
Frank

von Alexander Niessen (Gast)


Lesenswert?

Ich wünsch dir viel Erfolg dabei.
... und wenn alles nix hilft ... 's gibt ja noch das Forum hier und
google.


Grüße,
Alex

von manu (Gast)


Lesenswert?

Hallo Alex,

ich melde mich nochmals zurück.. ;-)

Leider bekomme ich es einfach nicht hin, dass es läuft..
Habe dein Programm mal kompiliert (erst die mega8 Def. eingefügt!)
und auf meinen "kleinen" gespielt.. Leider liegt dann nur
01010101 auf dem PORTB an, und es tut sich nichts.. Das selbe in
der simulation im AVRStudio!

Was könnte ich da falsch machen?

von ...HanneS... (Gast)


Lesenswert?

Du hast zwar nicht kompiliert sondern assembliert (ist ein Unterschied),
aber das macht ja nix...

Hast du die Interrupt-Vektor-Tabelle deinem AVR angepasst??
Denn die ist bei den einzelnen AVRs unterschiedlich. Die Datenblätter
der einzelnen AVR-Typen werden dabei deine Freunde sein.

...

von ...HanneS... (Gast)


Lesenswert?

Achja, Stackpointer könnte auch anders sein (8 Bit / 16 Bit)

...

von Dirk (Gast)


Lesenswert?

Hi,

du solltest Dir das Tutorial ansehen. Bei der Assemblerporgrammierung
muss man wirklich alles zu Fuss machen. Ein Compiler(z.B.Bascom) nimmt
Dir die Arbeit zur Initalsierung des Stacks ab.

Mfg
Dirk

von Alexander Niessen (Gast)


Lesenswert?

Hallo,
das Bitmuster 01010101 ist schon richtig.
Dieses Bitmuster erscheint aber erst nach 180 Sekunden.

Voher wechseln sich im Sekundentakt '10101010' und '00000000' ab.
Der Wechsel zwischen 0xAA und 0 bewirkt, dass die (zweibeinige DUO-)LED
im Sekundentakt rot blinkt.

Das andere Bitmuster, welches bei dir dauerhaft zu sehen ist bewirkt,
dass die LED grün leuchtet.
Die Leuchtdiode ist in der Schaltung direkt zwischen zwei Portpins
angeschlossen. Ich wollte die LED auf einfache Art umpolen können wg
der Farbe.

Tja - wie kommst du nun voran ?
Ich empfehle dir auch (wie Dirk), dass du mal das Tutorial genau
durcharbeitest. Danach wirst du dann auch das Posting von HanneS
verstehen.

Tipp am Rande: Auf der Atmel-Homepage gibt es ja App-Notes in Massen.
Dort sind auch immer nette Beispielprogramme dabei. Von denen hab' ich
sehr viel gelernt.

Noch'n Tipp: Registrier dich bei AVRFREAKS.NET. Dort kommst du dann
auch in einen Bereich hinein, in dem man sich (Beispiel-) Programme
runterladen kann.

Nach wie vor viel Erfolg,
Alex

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.