mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TIMER-Problem


Autor: Julien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe folgendes Problem:
Bin ein Neuling im Gebiet der µC-Programmierung und jetzt habe ich 
versucht ein gleiches Assembler-Programm zu schreiben um zu sehen wie 
die Timer in der AVR-RISC Reihe funktionieren.

beim RESET wird folgendes ausgeführt:

LDI LR,LOW(RAMEND)
OUT SPL,LR
LDI LR,HIGH(RAMEND)
OUT SPH,LR

LDI LR, (1<<TOV0)
OUT TIFR, LR

LDI LR, 0
OUT TCNT0, LR
LDI LR, 5
OUT TCCR0, LR
LDI LR, 2
OUT TIMSK, LR
SEI

RJMP MAIN

und die PORTS werden festgelegt.

Leider funktioniert der Zähler nicht!
Sowohl in der Simulation als auch HARDWARE-technisch.

Wo liegt das Problem.

Autor: Julien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat Vielleicht jemand ein funktionsfähiges Assembler-Programm für die 
Timer T0 und/oder T1.

Der verwendete µC ist ein AT90S8515
AVR Studio 4

Danke im Vorraus

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Julien!
Ist das nicht etwas wenig was du uns da anbietest?
Wo ist die Interrupttabelle?
Wo ist die ISR?
Was soll der Timer überhaupt machen?
Du hast jedenfalls einen Timer0 mit CK/1024, der nach 262144 Takten 
einen TOV0 erzeugt, mehr ist deinem Prog.nicht zu entnehmen.

Gruss Uwe

Autor: Julien (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Uwe

ich glaube das obige beispiel war nicht sehr glücklich gewählt.
Deshlab hab ich jetzt mal den Code gepostet.

Das Problem ist, das der Timer dafür zuständig ist bei jedem Overflow 
den er erzeugt das REg. DMX1 um 1 erhöht.

Im hauptprogramm wird dieses Reg. abgefragt und eine entspr. Funktion 
ausgeübt.

Leider sehe ich sowohl in der Simulation als auch in der hardware keine 
anzeichen, dass der Timer zu zählen beginnt, und somit auch kein 
Overflow erzeugt.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Timer funktioniert schon, sind aber ein paar Ungenauigkeiten drin.
Auf jeden Fall mußt du in der ISR das SREG sichern, entweder in einem 
eigenen Register oder auf dem Stack, der inc-Befehl verändert die Flags, 
nach Rückkehr ins Hauptprogramm stimmen die Werte sonst nicht.
Des weiteren solltest du in der ISR ein Bit setzen, welches anzeigt, daß 
etwas passiert ist und nur dieses im Hauptprogramm abfragen und dann die 
entsprechenden Aktionen ausführen, da der Zustand deines Zählregisters 
längere Zeit denselben Wert enthält, werden die Programmteile ST1_x 
ziemlich oft ausgeführt, nicht direkt falsch, aber nicht schön.
Das eigentliche Problem dürfte aber in den Programmteilen
ST1_x liegen. Ich schätze mal, du willst die Ports PA4-7, bitweise 
setzen/rücksetzen. Das funktioniert so nicht, PA7 ersetzt der Assembler 
mit 7, in deinem Fall würdest du das I/O-Register mit der Adresse 7 
beschreiben (das existiert übrigens zumindest bei 8515 gar nicht). 
Entweder schreibst du den kompletten PortA, oder du mußt mit 
Einzelbitbefehlen arbeiten.

ST1_1:
ldi LR1, 0b10000000
out PORTA, LR1          ;PortA0..A6=0, PA7=1

oder:
cbi PORTA, PA7          ;PA7=0
cbi PORTA, PA6          ;PA6=0
cbi PORTA, PA5          ;PA5=0
sbi PORTA, PA4          ;PA4=1

Autor: Julien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen danke @ Crazy horse

Das gewünschte Programm funktioniert jetzt.

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.