www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer 0 und 2 machen komische sachen Mega 16


Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Simulator macht Timer 0 und Timer 2 Komische probleme.

      .include "m16def.inc"

      .def SREGbuf = R2
      .def tempL   = R16
      .def tempH   = R17
      .def PUF0    = R18
      .def PUF1    = R19
      .def Spalte  = R20
      .def Zeile   = R23
      .def Flag    = R21
      .def Flag2   = R22
      .def zaehl   = R24






      .equ VTimeL = 0xB0
      .equ VTimeH = 0xB1
      .equ HTimeL =  0xB2
      .equ HTimeH =  0xB7
      .equ VorzeitL = 0xB3  ;ergebniss
      .equ VorzeitH = 0xB4
      .equ SpaltenzeitL = 0xB5
      .equ SpaltenzeitH = 0xB6
      .equ SpaltenzeitL1 = 0xCE
      .equ SpaltenzeitH1 = 0xCF
      .equ zeileL = 0xBA
      .equ zeileH = 0xBB
      .equ Startzeile_HI_0 = 0xBC
      .equ Startzeile_LO_0 = 0xBD
      .equ Startzeile_HI_1 = 0xBE
      .equ Startzeile_LO_1 = 0xBF
      .equ Startzeile_HI_2 = 0xC0
      .equ Startzeile_LO_2 = 0xC1
      .equ Startzeile_HI_3 = 0xC2
      .equ Startzeile_LO_3 = 0xC3
      .equ Startzeile_HI_4 = 0xC4
      .equ Startzeile_LO_4 = 0xC5



      ;*********************************************************************

      #define Master_Dimm    255

              /* ****set interrupt-routines */

       .org $0
        rjmp reset                                                         /* reset vector address */




    

      reset:

      cli


      /* ***** set stackpointer */
      ldi      tempL,  low(RAMEND)
      ldi      tempH, high(RAMEND)
      out      SPL,tempL
      out      SPH,tempH

      
      sei
            


      


      
      main:    
               ldi templ,low(360)
           ldi temph,high(360)
           sts vtimel,templ
           sts vtimeh,temph
      
    VZ:         lds  tempH,vtimeH
    Ltime1:     lds  tempL,vtimeL
    vzeit2:     out  OCR2,templ        ;Timer mit Match L Wert laden
          clr  templ
          out  TCNT2,templ       ; 
    

        wtt:        ldi  tempL, (0<<CS02)|(0<<CS01)|(1<<CS00)
          out  TCCR2, tempL          ; Timer Start nach Match wieder von vorn
    vzeit:      in   templ,TIFR
          andi templ,0b10000000
          sbrs templ,OCF2             ;OCF0
          rjmp vzeit
          ori  templ,(1<<OCF2)     
          out  TIFR,templ
          cpi  temph,0
          breq out_tim0
          ldi  templ,0xff
          dec  temph
          rjmp vzeit2
    out_tim0:   ldi  tempL, (0<<CS02)|(0<<CS01)|(0<<CS00) ; Timer Stop
          out  TCCR2, templ 







           


      rjmp   main

keine Ahnung woran das liegt beim ersten durchlauf ist alles OK aber 
beim zweiten wird das OCF2 Flag schon bei ca. 10 ausgelöst und nicht bei 
255.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also bei mir funktioniert die simulation. versuch mal, dein programm 
etwas zu stukturieren, dann kannste eventuelle Fehler leichter finden.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Interruptvektoren fehlen.....

Gruss Otto

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn er keine Interrupts verwendet, braucht er auch keine Vektoren.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach - und deshalb auch das "sei"....

Gruss Otto

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ori  templ,(1<<OCF2)
out  TIFR,templ

ich glaube das war das Problem da ich auch noch den Timer 1 mit  nutze 
und ich das register anspreche ohne mir vorher TIFR zu maskieren.

also

in templ,TIFR
ori  templ,(1<<OCF2)
out  TIFR,templ

sollte besser sein.
Oder Nicht?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René Schink wrote:
> in templ,TIFR
> ori  templ,(1<<OCF2)
> out  TIFR,templ
>
> sollte besser sein.
> Oder Nicht?
Nein! Interrupt-Flags werden nicht mit Read-Modify-Write gelöscht, 
sondern im direkten Zugriff. Einfach
ldi temp, (1 << OCF2)
out TIFR, temp
Wenn Du maskierst, werden alle anderen Flags, die beim Lesen von TIFR 
gesetzt sind, gelöscht. Und genau das will man eigentlich normalerweise 
nicht. Interrupt-Flags immer direkt schreiben. Eine Null hat schließlich 
keinen Einfluss auf den Zustand des Flags.

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.