Forum: Mikrocontroller und Digitale Elektronik Timerfunktion


von Boris (Gast)


Lesenswert?

Hallo Leute,

ich habe Probleme mit der Timeraktiverung. Im folgenden ASM-Code
möchte ich den Timer0 benutzen.

Bei der Simulation im AVR-Studio
wird der Interrupt auch ausgelöst (alle 17.54ms). Dadurch wird die
"Count"-Variable hochgezählt die, wenn sie gleich NULL ist, den TONLOOP
abbricht. Normalerweise sollte der Ton an PortB ca. 4,3 sec anstehen.
Wie gesagt im AVR-Studio funktionierts aber auf dem STK500 ist der Ton, 
bzw.
eine Ausgabe auf PORTB nur so lange aktiv, wie eine Taste betätigt wird.

Auch mit anderen Testprogrammen hatte ich mit der Timerfunktion
noch kein Glück.
Kann mit jemand von Euch sagen wo der Fehler liegt?

Vielen Dank

Gruß
Boris


TCCR0 = 0x05 -> 128us bei 8MHz
TIMSK = 0x02 -> Interrupt enable
TCNT0 = 0x77 -> Offset, ergibt Interruptzeit von 17.54ms




;*** STK500 LEDS and SWITCH demo

.include "8515def.inc"

.def  Temp  = r21  ;temp reg
.def  Delay  = r17  ;delay var 1
.def  Delay2  = r18  ;delay var 2
.def  Count  = r19
.def  Null  = r20


      ;presel = 5
.equ  PRE_SEL = 0x05  ;prescale select Timer0 CK/1024 ;128us bei 8Mhz ; 
102,4us bei 10MHz
.equ  TC0_IE  = 0x02  ;Bit 1 TIMSK Interrupt enable


.equ  OFFSE_TC = 0x77  ;offset = 119 d.h. noch 137 zyklen -> 17,536ms x 
4 = 70ms

        ; 137x128us = 17,536ms  einstellungen für 8MHz


.org    $0000
  rjmp    RESET                ;Reset handler



.org    OVF0addr
  rjmp    tim0_ovf            ;Timer0 overflow handler



;**** Init
RESET:
  ldi    r16, RAMEND
  out    SPL, r16  ; setup stack pointer

  sei

  ser  Temp
  out  DDRB,Temp
  clr  Null
  ldi  Count,0x01


  ldi  r31,high(sinu + 0x0200)    ;Setup Z pointer High
  ldi  r30,low(sinu + 0x0200)     ;Setup Z pointer low

  ; clear   accumulator
   ldi r29,0x00
   ldi r28,0x00

   ; init add register
    ldi r24, 0x00    ;Frequenz einstellen
   ldi r25, 0x00    ; Ton 1 = 0x56d6 1060Hz ok,
  ldi r26, 0x00    ;wird für den Frequenzbereich der


  ldi  temp,PRE_SEL
  out  TCCR0,temp    ;interruptzeit einstellen


  ldi  temp,OFFSE_TC
  out  TCNT0,temp    ;Offset für timer


  ldi  Count,  0xfa    ;Offset Counter


;****

LOOP:
;  out  PORTB,Temp

  sbis  PIND,0x00  ;if portd pin0 = 0
  rcall  SETT0
  sbis  PIND,0x01  ;if portd, pin1 = 0
  rcall  SETT1
  sbis  PIND,0x02
  rcall  SETT2
  sbis  PIND,0x03
  rcall  SETT3
  sbis  PIND,0x04
  rcall  SETT4
  sbis  PIND,0x05
  rcall  SETT5
  sbis  PIND,0x06
  rcall  SETT6
  ;rcall  TONLOOP    ;Ton Ausführen

;wait
DLY:
  dec  Delay
  brne  DLY
  dec  Delay2
  brne  DLY

  rjmp  LOOP  ;repeat  loop forever


SETT0:
;  ldi   Temp,0x01
;  out  PORTB,Temp
  ;time interrupt enable
  ldi   temp,TC0_IE
  out   TIMSK,temp    ;TOIE0 bit 1 setzen



  ldi r24, 0xd6    ;Frequenz einstellen
   ldi r25, 0x56    ; Ton 1 = 0x56d6 1060Hz ok,
  rcall  TONLOOP
  clr  temp
  out  TIMSK,temp  ;disable Timer
  ret


SETT1:
;  ldi   Temp,0x02
;  out  PORTB,Temp

  ;time interrupt enable
  ldi   temp,TC0_IE
  out   TIMSK,temp    ;TOIE0 bit 1 setzen

  ldi r24, 0x07    ;Frequenz einstellen
   ldi r25, 0x5f    ; Ton 1 = 0x56d6 1060Hz ok,
  rcall TONLOOP
  clr  temp
  out  TIMSK,temp  ;disable Timer
  ret



SETT2:
;  ldi   Temp,0x04
;  out  PORTB,Temp

  ;time interrupt enable
  ldi   temp,TC0_IE
  out   TIMSK,temp    ;TOIE0 bit 1 setzen

  ldi r24, 0x0a    ;Frequenz einstellen
   ldi r25, 0x68    ; Ton 1 = 0x56d6 1060Hz ok,
  rcall TONLOOP
  clr  temp
  out  TIMSK,temp  ;disable Timer
  ret



SETT3:
;  ldi   Temp,0x08
;  out  PORTB,Temp

  ;time interrupt enable
  ldi   temp,TC0_IE
  out   TIMSK,temp    ;TOIE0 bit 1 setzen

  ldi r24, 0xce    ;Frequenz einstellen
   ldi r25, 0x88    ; Ton 1 = 0x56d6 1060Hz ok,
  rcall TONLOOP
  clr  temp
  out  TIMSK,temp  ;disable Timer
  ret



SETT4:
;  ldi   Temp,0x0f
;  out  PORTB,Temp

  ;time interrupt enable
  ldi   temp,TC0_IE
  out   TIMSK,temp    ;TOIE0 bit 1 setzen

  ldi r24, 0xd7    ;Frequenz einstellen
   ldi r25, 0xa3    ; Ton 1 = 0x56d6 1060Hz ok,
  rcall TONLOOP
  clr  temp
  out  TIMSK,temp  ;disable Timer
  ret



SETT5:
;  ldi   Temp,0x10
;  out  PORTB,Temp

  ;time interrupt enable
  ldi   temp,TC0_IE
  out   TIMSK,temp    ;TOIE0 bit 1 setzen

  ldi r24, 0x39    ;Frequenz einstellen
   ldi r25, 0xb4    ; Ton 1 = 0x56d6 1060Hz ok,
  rcall TONLOOP
  clr  temp
  out  TIMSK,temp  ;disable Timer
  ret



SETT6:
;  ldi   Temp,0x20
;  out  PORTB,Temp

  ;time interrupt enable
  ldi   temp,TC0_IE
  out   TIMSK,temp    ;TOIE0 bit 1 setzen

  ldi r24, 0xfe    ;Frequenz einstellen
   ldi r25, 0xd4    ; Ton 1 = 0x56d6 1060Hz ok,
  rcall TONLOOP
  clr  temp
  out  TIMSK,temp  ;disable Timer
  ret



TONLOOP:
;  inc  Count
  add  r28,r24    ;1 cyc
  adc  r29,r25    ;1 cyc
  adc  r30,r26    ;1 cyc wenn r30+ wird zeiger incr.
  lpm    ;3 cyc
  out  PORTB,r0  ;1 cyc
  cpse  Count,Null  ;1 cyc skip next if Count = null
  rjmp  TONLOOP     ;2 cyc rücksprung
  ret      ; retun zu set




;***************************************************************
;interupt
;***************************************************************

tim0_ovf:
  push r16 ;?
;  dec cnt7    ;dekrement couter


  ldi  temp,OFFSE_TC  ;timer offstet
  out  TCNT0,temp

  inc   Count    ;increment count

  pop r16 ;?
  reti


.org 0x200  ;steht im Prgspeicher 0x400 bis 0x4f

sinu: .db 0x80,0x83,0x86,0x86,0x89,0x8c,0x8f,0x92
 .db 0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab
 .db 0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1
 .db 0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5
 .db 0xd8,0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6
 .db 0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3
 .db 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc
 .db 0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff
 .db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe
 .db 0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8
 .db 0xf7,0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed
 .db 0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde
 .db 0xdc,0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc
 .db 0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6
 .db 0xb3,0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f
 .db 0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86
 .db 0x83,0x80,0x7c,0x79,0x76,0x73,0x70,0x6d
 .db 0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54
 .db 0x51,0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e
 .db 0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a
 .db 0x27,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19
 .db 0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c
 .db 0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03
 .db 0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00
 .db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01
 .db 0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07
 .db 0x08,0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12
 .db 0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21
 .db 0x23,0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33
 .db 0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49
 .db 0x4c,0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60
 .db 0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79

Beitrag #7019026 wurde von einem Moderator gelöscht.
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.