
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
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 fr 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 |