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 - 9.12.2004 11:20)
 Als Antwort auf Re: Interrupt-Routine/Beep (Kollision?) von Topmail - 8.12.2004 18:14
Hallo Rene,

> Ich gehe - wie immer - davon aus, daß du die Bugs in den Interruptroutinen (siehe die Tolle CC-intern
> Sammlung) kennst.

ich habe die CC erst seit gut 2 Wochen und konnte mich noch nicht wirklich ausführlich mit den ganzen Infos rundum beschäftigen. Den asm Code habe ich unten mal angefügt, aber wie gesagt, das ist noch sehr suboptimal (aber immerhin dokumentiert :-)). Na ja, habe auch nur etwa 20 Minuten dafür investiert. Insbesondere die PWM für 2 Dimmer ist noch grottenschlecht ;-) aber sie funktioniert. Was mich halt wundert ist, dass das mit der Beep Funktion kollidiert, aber da schaue ich mal in die Buglisten. Danke für den Tipp!

Ich werde in den nächsten Tagen den Code sicher nochmal überarbeiten und optimieren.

Grüße,
Christian

p.s. habe gerade gesehen, dass ich Adresse $52 genutzt habe. Ich war mir sicher, dass es 51 sein sollte. Vielleicht hat sich das Problem gerade erledigt...


    org     $101                ; Lade Programm ab Adresse $101

    ; installiere nur Port 1
StartP1:
lda #TimerP1-StartP1+1  ; Berechne Offset zum Label TimerP1
    bset    #0,$05              ; Port 1 als Ausgang schalten
sta $52                 ; installiere TimerP1 als Interrupt-Handler
rts
   
    ; installiere nur Port 2
StartP2:
lda #TimerP2-StartP1+1  ; Berechne Offset zum Label TimerP2
    bset    #1,$05              ; Port 2 als Ausgang schalten
sta $52                 ; installiere TimerP2 als Interrupt-Handler
rts

    ; installiere Port 1 und Port 2 zusammen
StartP1AND2:
lda #TimerP1P2-StartP1+1  ; Berechne Offset zum Label TimerP1P2
    bset    #0,$05              ; Port 1 als Ausgang schalten
    bset    #1,$05              ; Port 2 als Ausgang schalten
sta $52                 ; installiere TimerP2 als Interrupt-Handler
rts

;-----------------------------------------------------------------------------
; Name: TimerP1P2
;-----------------------------------------------------------------------------
; Beschreibung:
; Diese Funktion ruft einfach nur die beiden PWM Funktionen für die Ports
; 1 und 2 hinterinander auf. Dadurch werden 2 Dimmer steuerbar.
;-----------------------------------------------------------------------------
TimerP1P2:
    bsr     TimerP1             ; Aufruf der PWM für Port 1
    bsr     TimerP2             ; Aufruf der PWM für Port 2
    rts

;-----------------------------------------------------------------------------
; Name: TimerP1
;-----------------------------------------------------------------------------
; Beschreibung:
; Diese Funktion implementiert die PWM Steuerung von Port 1. Dazu wird
; Port 1 eingeschaltet und eine Schleife läuft N-Mal durch, bis Port 1
; wieder ausgeschaltet wird. Die Schleife dient nur als Verzögerung
; und ist abhängig von der Geschwindigkeit des Prozessors. Vernünftige
; Werte für die Steuerung sind daher experimentell zu ermitteln.
; Der Wert N für die Schleife ist ein Byte und wird aus dem ersten
; Speicherbyte des Hauptspeichers gelesen.
;-----------------------------------------------------------------------------
TimerP1:
lda $a1                 ; Byte 1 des Hauptspeichers laden
bset #0,$01              ; Port 1 einschalten
LoopP1:
deca                        ; Wert aus Byte 1 um 1 erniedrigen
bne LoopP1              ; und solange wiederholen, bis der Wert 0 erreicht ist
bclr #0,$01              ; Port 1 wieder ausschalten
lda #$01                ; andere intr ebenfalls ausführen
rts

;-----------------------------------------------------------------------------
; Name: TimerP2
;-----------------------------------------------------------------------------
; Beschreibung:
; Diese Funktion implementiert die PWM Steuerung von Port 2. Dazu wird
; Port 2 eingeschaltet und eine Schleife läuft N-Mal durch, bis Port 2
; wieder ausgeschaltet wird. Die Schleife dient nur als Verzögerung
; und ist abhängig von der Geschwindigkeit des Prozessors. Vernünftige
; Werte für die Steuerung sind daher experimentell zu ermitteln.
; Der Wert N für die Schleife ist ein Byte und wird aus dem zweiten
; Speicherbyte des Hauptspeichers gelesen.
;-----------------------------------------------------------------------------
TimerP2:
lda $a2                 ; Byte 2 des Hauptspeichers laden
bset #1,$01              ; Port 2 einschalten
LoopP2:
deca                        ; Wert aus Byte 1 um 1 erniedrigen
bne LoopP2              ; und solange wiederholen, bis der Wert 0 erreicht ist
bclr #1,$01              ; Port 1 wieder ausschalten
lda #$01                ; andere intr ebenfalls ausführen
rts

end


 Antwort schreiben

Bisherige Antworten:

Re: Interrupt-Routine/Beep (Kollision?) (von Dietmar - 9.12.2004 17:21)
    Re: Interrupt-Routine/Beep (Kollision?) (von Christian - 22.12.2004 1:12)
    Re: Interrupt-Routine/Beep (Kollision?) (von Topmail - 10.12.2004 18:05)
        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)