Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Interrupt-Routine/Beep (Kollision?) Kategorie: Programmierung ASM (von Topmail - 10.12.2004 18:05)
 Als Antwort auf Re: Interrupt-Routine/Beep (Kollision?) von Dietmar - 9.12.2004 17:21
Hallo,
mein Programm nutzt genau den Beep-Interrupt, läßt sich sicher auch irgendwie mit dem 20ms-Interrupt (CMP2) basteln - war mir aber zu umständlich.
Ich habe versucht das Wesentliche zu kommentieren - was im Datenblatt detailliert steht lasse ich aber weg.
Ich habe mich auf 50 Helligkeitsstufen, die mit knapp 40 Hz ausgegeben werden beschränkt. Wenn die Ausgabefrequenz egal ist, kann man sicher auch noch den Beep verwenden.

Cu Rene,
alias Topmail



' pwm.bas
' (c) by ReneStadler@stadlerhome.de

Define h1 Byte[1]
Define cnt Byte[2]

Define b Byte
Define i Word

Define bp1 Port[1]

define init &H101

bp1 = OFF ' als Ausgang setzten - kann auch in Init geschehen
cnt = 0

sys init

b=1
For i = 0 To 1000
  h1 = b
  Pause 10
  Input b
  Print "Neu: ";b
Next

End

---

; pwm.asm
; (c) by ReneStadler@stadlerhome.de
  ORG $101

; einige Konstanten
BYTEPORT1 EQU $01
BYTEPORT2 EQU $02
TCR EQU $12
TSR EQU $13 ; Timer status register
CAP1LO EQU $15 ; Timer1 compare low
CMP1LO EQU $17 ; OCR1 low
CMP2LO EQU $1F ; OCR2 low
TIMERLO EQU $19 ; Timer low
CAP2LO EQU $1D ; Timer2 compare low
CAPPTR EQU $51 ; Einsprungadresse für Timercap
CMPPTR EQU $52 ; Einsprungadresse fr Timercmp
OFLPTR EQU $53 ; Einsprungadresse für Timeroverflow

;h1    equ $A1
;cnt   equ $A2
Stufen    EQU 49 ; Anzahl der Stufen -1

; Initialisierung
init:
  SEI
  LDA TCR
  ORA #$40    ; nur %01000000 OCIE
  STA TCR
  LDA #(_cmpint-$100)
  STA CMPPTR
  CLI
  RTS

_cmpint:
  BRCLR 6,TSR,_exitcmp1  ; nur auf CMP1 reagieren!
; hier ist noch einiges zu optimieren bzw. auszuprobieren
; so wird die Routine ca. 1953 mal pro Sekunde aufgerufen
  INC CMP1LO-1 ; neuen Wert für CMP1 setzen
  CLR CMP1LO   ; muß auch geändert werden, obwohl es immer 0 ist
  LDA cnt
  DECA
  BPL _higher
  LDA #Stufen ; nur 50 Stufen zulassen, da sonst zu langsam
_higher:  
  STA cnt
  BEQ _clrport1 ; bei cnt=0 aus - dadurch immer einen Step aus!
  CMP h1
  BNE _exitcmp1
  BSET 0,BYTEPORT1 ; bei cnt=h1 ein
_exitcmp1:
  JSR $0e70 ; Systemroutine aufrufen
  CLRA
  RTS
_clrport1:  
  BCLR 0,BYTEPORT1
  BRA _exitcmp1


 Antwort schreiben

Bisherige Antworten:

Re: Interrupt-Routine/Beep (Kollision?) (von Christian - 13.12.2004 9:47)
    Re: Interrupt-Routine/Beep (Kollision?) (von Topmail - 13.12.2004 18:14)
        Re: Interrupt-Routine/Beep (Kollision?) (von Christian - 13.12.2004 20:01)