www.mikrocontroller.net

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


Autor: Manu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: leo9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Niessen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Niessen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Niessen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Niessen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Niessen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: manu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja, Stackpointer könnte auch anders sein (8 Bit / 16 Bit)

...

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Niessen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.