Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Tasterentprellung in Assembler geht nicht Kategorie: Progr. Assembler, TaskingTools, OS (von Harald - 28.02.2005 9:12)
Ich nutze:
C164CI-ControllerBoard, eigenes Board, original OS
Hallo,

folgendes Assemblerprogramm dient zur Belichtungszeiterzeugung für ein
Aufnahmesystem:




$case
$segmented
$model(medium)
$extend
$nomod166
$stdnames(reg164ci.def)

                regdef R2
                regdef R3
                regdef R4
                regdef R5
;***************************************************
userseg SECTION CODE word at 30000h
assume  dpp3:userseg
assume  dpp3:system
;***************************************************
;Loops: 1,2,3,4,5,6,7,8,9
                public  belichtungszeit

belichtungszeit proc far
                ;Interrupt deaktivieren        
                bclr CC8IE
                bclr P1H.6
                bclr P1H.7
                mov R2,#1
                mov R3,#1
                mov R4,#1
                mov R5,#1
                ;Kamera öffnen Anfang
                bset    P1L.4
                ;Verschluss_1 öffnen Anfang
                ;Rollei auffahren
                bclr    P1L.1
                bclr    P1L.0
                ;5ms warten bis Verschluss geöffnet
                Loop5:
                Loop4:
                nop
                cmpi1   R2,#1775
                jmpr    cc_SLT,Loop4
                mov     R2,#1
                cmpi1   R3,#5
                jmpr    cc_SLT,Loop5
                mov     R3,#1
                ;Verschluss_1 halt:
                bset    P1L.1
                bclr    P1L.0
                ;Verschluss_1 öffnen Ende
                ;Verschluss_2 öffnen
                mov     R2,#1
                mov     R3,#1
                mov     R4,T3
                ;mov   R4,#3000
                add     R4,#1
                bset    P1L.2
                bset    P1L.3
                Loop1:
                Loop2:
                nop
                cmpi1   R2,#850
                jmpr    cc_SLT,Loop1
                mov     R2,#1
                bset    P1L.5                   ;Blitz
                Loop3:
                nop
                cmpi1   R2,#925
                jmpr    cc_SLT,Loop3
                mov     R2,#1
                add     R3,#1
                cmp     R3,R4
                jmpr    cc_SLT,Loop1
                ;Verschluss_2 schlieÃ?en
                bclr    P1L.2
                bclr    P1L.3
                ;Blitz zurücksetzen
                bclr    P1L.5
                ;Verschluss_1 schlieÃ?en Anfang
                ;Verschluss_1 zufahren
                bclr    P1L.1
                bset    P1L.0
                ;5ms warten
                mov     R2,#1
                mov     R3,#1
                Loop7:
                Loop6:
                nop
                cmpi1   R2,#1775
                jmpr    cc_SLT,Loop6
                mov     R2,#1
                cmpi1   R3,#5
                jmpr    cc_SLT,Loop7
                mov     R3,#1
                ;Verschluss_1 festbremsen:
                bset    P1L.1
                bclr    P1L.0
                ;Verschluss_1 schlieÃ?en Ende
                ;bset  P1L.0
                ;bclr    P1L.1
                ;Kamera schlieÃ?en
                bclr    P1L.4
                ;Taster entprellen
                Loop8:
                Loop9:
                nop
                cmpi1   R2,#1775
                jmpr    cc_SLT,Loop8
                mov     R2,#1
                cmpi1   R3,#1000
                jmpr    cc_SLT,Loop9      
                mov     R3,#1
                bclr P1H.0
                ;Interrupt wieder einschalten
                bset CC8IE
                rets
testport        endp
userseg         ends
                end


Aufgerufen wird die Assmblerroutine mit folgendem C2-Programm (Auszug):



thread main
{
system.hook (system.EVENT_P1H0,3,0,system.HOOK_BEFORE);
loop
{
}



AM P1H0 ist ein taster angebracht. Das Problem ist nun, daÃ? die Entrpellung im Maschinencode
so nicht funktioniert. Das System scheint sich die beim Prellen entstehende zweite fallende Flanke
(konnt ich Oszillografieren) zu merken und führt die Routine nach Ende der Wartezeit sofort
nochmals aus.

Woran liegt das? Gibt es eine Lösung für das Problem? Kann der Interrupt evtl. wegen des Betriebssystems von
Assembler aus nicht stillogelegt werden?
Mittlerweile bin ich kurz davor, ein FlipFlop auf Platine zu basteln und den Taster so zu entprellen.

GruÃ?,
Harald




    Antwort schreiben


Antworten:

Re: Tasterentprellung in Assembler geht nicht (von André H. - 15.05.2005 18:13)