mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Timer-Interrupt (Assembler, AVR Studio)


Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich versuche gerade mein erstes Programm komplett in Assembler zu 
schreiben. Fehler gibts beim Build schon mal nicht - freut mich. Aber 
beim Simulieren gibts ein Problem mit dem Timer-Interrupt.

Es werden zunächst ganz normal die Einzelschritte bis zur loop-Schleife 
gemacht - aber wenn der Timer-Interrupt auslöst springt das Programm zum 
ersten Befehl nach dem Label "main" und nicht zu "timer0_overflow".

Irgendwie finde ich nicht heraus, warum da so ist - habe auch schon 
einiges aus dem Netz probiert - immer der gleiche Fehler...

Wer kann mir da weiterhelfen?

Gruß

Jens
.include "2313def.inc"

;----------------------------------------------------
 
.def temp = R16
.def PWMcnt = R17
.def PWMwert = R18
.def Spalte = R19

;----------------------------------------------------

.equ F_CPU = 20000000
.equ RCK = PB4
.equ SCK = PB7
.equ SERI = PB5
.equ POE = PB3
.equ SCL = PB3

;----------------------------------------------------

.dseg                        ;Beginn Datensegment
Spalten:  .BYTE 14                ;14 Bytes für Spalte 1

.cseg                        ;Beginn Programmsegment

;----------------------------------------------------
 
.org 0x0000
  rjmp   main                            ;Reset Handler
.org OVF0addr*2
  rjmp   timer0_overflow                 ;Timer Overflow Handler

;----------------------------------------------------
 
main:
    ldi    temp, RAMEND                 ;Stackpointer initialisieren
    out    SPL, temp

    ldi    temp, 0b00000001                ;CS00 setzen: Teiler 1
    out    TCCR0, temp

    ldi    temp, 0b00000001                ;TOIE0: Interrupt bei Timer Overflow
    out    TIMSK, temp

  ldi    PWMcnt, 0                ;PWM-Counter auf 0 setzen
  ldi    Spalte, 1                ;mit Spalte 1 anfangen

     cbi    PORTB, POE                              ;Schieberegister "aktivieren"

    sei                        ;Interrupts aktivieren

;----------------------------------------------------

loop:
  rjmp   loop

;----------------------------------------------------

timer0_overflow:                              ;Timer 0 Overflow Handler

  reti

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal das "*2" in "OVF0addr*2" weg.

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.: oben ist eine falsche Include-Datei eingebunden - aber mit der 
richtigen ("tn2313def.inc") klappt es auch nicht...

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das *2 wegmache funktioniert das leider auch nicht - schon 
probiert.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ja nich sein. Lad mal die Include-Datei in nen Editor und guck Dir 
an, welcher Wert OVF0addr darin zugewiesen ist. Dann vergleichen mit der 
Interrupttabelle im Datenblatt (des richtigen Controllers).

Autor: flätz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist der Debugger so eingestellt, dass er die Int-Sequenz 
nicht anzeigt?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ne Idee: Korrekten Controller in den Simulator Options gewählt?

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für OVF0addr steht 0x0006 drin - stimmt mit dem Datenblatt überein. 
kommt aber bei 0x000D raus. Richtige Sprungmarke wäre bei 0x003E...

@flätz:

Glaube ich nicht, dass mir der Debugger das "verheimlicht", denn von der 
Taktanzahl her springt der direkt an diese Stelle. Da würde sich mehr 
ändern, da einiges im Int-Handler abgearbeitet wird (geposteter 
Quelltext ist gekürzt). Außerdem sollte der doch beim reti wieder in die 
loop springen - nicht ein ganzes Stück drüber...

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gast:

Dort ist der Attiny2313 eingestellt - also korrekt.

Autor: flätz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Außerdem sollte der doch beim reti wieder in die
> loop springen - nicht ein ganzes Stück drüber...

ja, stimmt.
Einfach mal die Sprungtabelle ausführlich hinschreiben?

rjmp main
nop
nop
nop
nop
nop
rjmp timer0_overflow

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch so hab ich das schon probiert. Nur statt nop hatte ich reti...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo springt er hin, wenn Du das als Sprungtabelle verwendest?

.ORG 0
rjmp   main    //0
reti       // 1
reti       // 2
reti       // 3
reti       // 4
reti       // 5
reti       // 6
reti       // 7
reti       // 8
reti       // 9
reti       // 10
reti       // 11
reti       // 12
reti       // 13
reti       // 14
reti       // 15
reti       // 16
reti       // 17
reti       // 18
reti       // 19
reti       // 20
reti       // 21
reti       // 22
reti       // 23
reti       // 24
reti       // 25
reti       // 26
reti       // 27
reti       // 28
reti       // 29
reti       // 30

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aaaah... da springt der zur 13 - dann stimmt wohl was mit der 
Initialisierung des Timers nicht. Das wäre ja "Compare Match A" und 
nicht "Overflow"...

Mal gucken, wie es "richtig" funktioniert... ;)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>dann stimmt wohl was mit der Initialisierung des Timers nicht

Mit Verlaub - sowas notiert man auch nicht so...

>ldi   temp, 0b00000001        ;TOIE0: Interrupt bei Timer Overflow

...sondern so:

ldi   temp, 0<<OCIE2 | 0<<TOIE2 | 0<<TICIE1 | 0<<OCIE1A | 0<<OCIE1B | 
0<<TOIE1 | 0 | 0<<TOIE0

-----------------
(kopiert aus ner Datei für den ATmega8, also nicht ungeprüft 
übernehmen!)

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich habe jetzt die Zeilen
    ldi    temp, 0b00000001   ;CS00 setzen: Teiler 1
    out    TCCR0, temp

    ldi    temp, 0b00000001  ;TOIE0: Interrupt bei Timer Overflow
    out    TIMSK, temp

ausgetauscht durch
    ldi    temp, (1<<CS00)     ;CS00 setzen: Teiler 1
    out    TCCR0, temp

    ldi    temp, (1<<TOIE0)    ;TOIE0: Interrupt bei Timer Overflow
    out    TIMSK, temp

und jetzt gehts auch ;)

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hatten wir jetzt wohl auch die gleiche Idee ;) Die Initialisierung 
stammt aus dem Tutorial "AVR-Tutorial: PWM" hier auf der Seite... mit 
hatte es so auch nicht gefallen - so wie es jetzt ist, ist es auch viel 
übersichtlicher.

So, Problem ist also gelöst. Vielen Dank für die Hilfe ;)

Gruß

Jens

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja super. Dann gute Nacht! :-)

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gute Nacht ^^

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.