Forum: Mikrocontroller und Digitale Elektronik AVR Timer


von Mark Zimmermann (Gast)


Lesenswert?

Hallo!

Habe hier nen Codeschnipsel der mich zum Verzweifeln bringt.
Der Timer funzt auf einem 8535 wunderbar, soll aber leider auch auf nem
8515 laufen, damit ich nicht die ganze Platine umändern muss. Bekomme es
also nicht hin, das der Sprung auch auf einem 8515 ausgeführt wird.

Vielen Dank für eure Hilfe...

.equ  tm1end=  10000  ;Timer1 Endwert (entspricht 100 Interrupts/s oder
Zykluszeit 10ms)
.cseg
.org  0x0000
t1coma:  rjmp  t1int    ;Zeitzählung alle 10ms
;
ldi  r16,high(tm1end)  ;Timer1 Endwert1 H
out  ocr1ah,r16    ;ausgeben
ldi  r16,low(tm1end)    ;Timer1 Endwert1 L
out  ocr1al,r16    ;ausgeben
clr  r16      ;Timer1 kein PWM, kein Comp-Out
out  tccr1a,r16
ldi  r16,(1<<ctc1)+(1<<cs11)  ;Timer1 Löschen nach Vergleich
out  tccr1b,r16    ;und Vorteiler=8 setzen
;
;  - Interrupt aktivieren
;
clr  r16
out  gimsk,r16    ;externe Interrupts sperren
ldi  r16,1<<ocie1a
out  timsk,r16    ;Timer1 Vergleich1 freigeben
sei

von Mark Zimmermann (Gast)


Lesenswert?

nachobenschieb...

bitte um hilfe, sitze seit einer woche dran und bekomme es nicht hin.

bitte helft mir...

von Malte Bayer (Gast)


Lesenswert?

.org  0x0000
t1coma:  rjmp  t1int    ;Zeitzählung alle 10ms

Schau dir mal im Datenblatt (auf www.atmel.com) die Interrupt-Table
an.

an ORG 0x0 steht soweit ich weiss bei allen AVR Controllern ein Jump
auf RESET

T1/T2 kommen irgendwo danach; das müsste dein einziger Fehler sein (ist
ja nicht der komplette code den du gepostet hast)

von Mark Zimmermann (Gast)


Lesenswert?

Danke, das wars aber nicht, habe in auszügen gepostet:

.cseg
.org  0x0000
;
reset:  rjmp  start    ;Programmstart
exint0:  reti        ;nicht genutzt
exint1:  reti        ;nicht genutzt
t2comp:  reti        ;nicht genutzt
t2ovfl:  reti        ;nicht genutzt
t1icap:  reti        ;nicht genutzt
t1coma:  rjmp  t1int    ;Zeitzählung alle 10ms
t1comb:  reti        ;nicht genutzt
t1ovfl:  reti        ;nicht genutzt
t0ovfl:  reti        ;nicht genutzt
spiint:  reti        ;nicht genutzt
uartrx:  reti        ;nicht genutzt
uartem:  reti        ;nicht genutzt
uarttx:  reti        ;nicht genutzt
adccom:  reti        ;nicht genutzt
eeprom:  reti        ;nicht genutzt
ancomp:  reti        ;nicht genutzt

von Sebastian (Gast)


Lesenswert?

was kommt denn für ne Fehlermeldung bzw. was passiert?

von OldBug (Gast)


Lesenswert?

Poste doch mal das ganze Programm (als Anhang), dann kann man vielleicht
auch Fehler entdecken. Die Sprungmarke "t1int" find ich in Deinen
Fetzen nämlich auch nicht...

von Mark Zimmermann (Gast)


Lesenswert?

Beim compilieren kein fehler. Wenn ich den Code für nen 8535 mache und
im stk500 teste, läuft alles (testweise ne LED anblitzen). mache ich
den code für den 8515 passiert nichts, die led bleibt aus.
bin nicht unerfahren mit avr programmierung, nur bin nun zum ersten mal
dabei die timer zu benutzen.

von Mark Zimmermann (Gast)


Angehängte Dateien:

Lesenswert?

ok, hier der code, soll eine funkuhr werden.
(alpha entwicklungsstadium)

von Sebastian (Gast)


Lesenswert?

Macht er denn im Simulator was er soll? Haben beide die selben
Taktfrequenzen? ...
Wenn die LED nur alle 10 ms mal kurz eingeschaltet wird sieht man
bestimmt nich viel. Aber ohne ein paar weitere Infos kann man da nicht
viel sagen.

von Mark Zimmermann (Gast)


Lesenswert?

ich gebe auf....
baue nun auf 8535 um

danke für eure hilfe!

von OldBug (Gast)


Lesenswert?

Ich konnte es in den paar minuten so nebenbei noch nicht ganz
einschränken, aber es scheint an einem falschen Timerprescaler oder
etwas in dieser Richtung zu liegen. Sieht im Simulator jedenfalls so
aus!

von Mark Zimmermann (Gast)


Lesenswert?

verstehe ich nicht ganz...
auf dem 8535 läufts, takt geteilt duch 8, alle 10000 takte, also 80000
total, sprung in die interrupt routine. naja, versuche auch mal zu
debuggen. bin für jede hilfe dankbar.

von OldBug (Gast)


Lesenswert?

Im Simulator "springt" TCNT1L, aber TCNT1H und TCNT1L ergeben niemals
0x2710 (10000)...
Deshalb vermute ich da den Fehler im Prescaler...

von OldBug (Gast)


Lesenswert?

Nö, hab mist erzählt, Deine Vektortabelle stimmt tatsächlich nicht:

;  ---------------------------------
;  Prgrammbeginn, Interrupt-Vektoren
;  ---------------------------------
;
.cseg
.org  0x0000
;
reset:  rjmp  start    ;Programmstart
exint0:  reti        ;nicht genutzt
exint1:  reti        ;nicht genutzt
t1icap:  reti        ;nicht genutzt
t1coma:  rjmp  t1int    ;Zeitzählung alle 10ms
t1comb:  reti        ;nicht genutzt
t1ovfl:  reti        ;nicht genutzt
t0ovfl:  reti        ;nicht genutzt
spiint:  reti        ;nicht genutzt
uartrx:  reti        ;nicht genutzt
uartem:  reti        ;nicht genutzt
uarttx:  reti        ;nicht genutzt


Probier die mal... :-)

von Mark Zimmermann (Gast)


Lesenswert?

MEIN RETTER!!!
Bin dir zu ewigem Dank verpflichtet!

Heisst das also, dass zuviele Sprungvektoren probleme verursachen...

VIELEN DANK!

von OldBug (Gast)


Lesenswert?

Die Vektortabelle ist "fest verdrahtet", also stark Modellabhängig.
Vergleiche mal die beiden Vektortabellen in den Datenblättern.
Der 8515 hat beispielsweise gar keinen Timer2, weshalb er auch keinen
IR-Vektor dafür hat...

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.