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 Christian - 13.12.2004 9:47)
 Als Antwort auf Re: Interrupt-Routine/Beep (Kollision?) von Topmail - 10.12.2004 18:05
Hallo Rene,

ich habe gestern versucht, das Programm zum Laufen zu bekommen. Das will allerdings gar nicht funktionieren. Der Ablauf im Interrupthandler selbst scheint logisch und ist nachvollziehbar. M.E. liegt das Problem darin, dass der Handler eben bei mir nicht 1953 mal/sek aufgerufen wird, sondern entweder deutlich weniger oder deutlich öfter. Zudem beschleunigt sich nach Installation des Handlers der Zeitfaktor des Pause-Befehls um ca. 10, so dass ein PAUSE 100 nur noch etwa einem Pause 10 entspricht. Wenn ich das Original unten compiliere und in die CC lade, wird bei h1 zwischen 1 und 49 der Dimmer 100% hell, bei h1=50 geht dieser aus.

Zur Info: Ich habe eine original C-Control Station 1. Hast du die bei dir vielleicht übertaktet oder anders modifiziert?

Grüße,
Christian



> 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 Topmail - 13.12.2004 18:14)
    Re: Interrupt-Routine/Beep (Kollision?) (von Christian - 13.12.2004 20:01)