[Company Logo Image]        Assembler 

Home Up Contents Search Articles Caveat Purpose Notice                                                           

;***** Allgemeine Deklarationen:

list p=pic16f84 ;Anweisung an den Assembler: Zielprozessor
list LINES = 75 ;Anweisung an den Assembler: Zeilenzahl im Listing
#include <p16f84.inc> ;Includ file mit processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC

;***** Debugging help

DEBUG equ 0 ;0 = debugg off / 1 = debugg on


;***** Beschreibung des Programmes:
; Two-Step-Trigger
; Betätigung des Trigger Servos am KAP-Rigg in zwei Stufen:
; Kommt vom Empfänger für >= 0,5 s der Befehl zum Auslösen, so bewegt sich das
; Servo von der RUHELAGE in die Stellung MESSEN. Dort verweilt es für einige Zeit
; und geht dann in die Stellung AUSLÖSEN. Danach fährt es wieder in die RUHELAGE.
; Danach wird eine Auslösesperrzeit von 5 sec. eingehalten, bis die Kamera wieder
; ready ist.
; Servoimpulse sind 1 bis 2 ms lang, die Impulspause ca. 20 ms.


;***** Entwicklungsstand bzw Teil oder Testprogramm:
; Kompletter Ablauf, mit Anschluss an den Empfänger


;***** Hardware:
; Testaufbau auf Steckbrett am 001210


;**********
; Filename: TST01-h.asm (Programm Nr XX, Versions Nr. X)
; Zielprozessor: PIC16F84
; Takt: Quarz, 4 MHz
; Date: 010125
; Last Update: 010131
; Author: mfs
; File assembled with: MPLAB V4.00.00


;========== Remarks and Errors zum Programmlauf im PIC-Controller ==========
;
; Funktion:
;
; die schaltung klappt mit der sony kamera super. die kamera löst
; jedesmal sicher aus und die zeiten und wege lassen sich feinfühlig einstellen.
;
;
; Mögliche Verbesserungen:
;
; nach erfolgter auslösung, wartezeit bis camera wieder bereit.
;
; Möglichkeit der Servoumkehr vorsehen
;
; Im Programm, bestimmte Werte, die den Ablauf bestimmen und
; eine Anpassung an die Verhältnisse ermöglichen als Konstanten
; deklarieren
;
;========================================================================


;********************************
;***** Belegung der I/O - Ports:
;********************************
;
;*** Input an Port B:
; Am Port B ist der 8 polige DIL-Schalter angeschlossen
; Bei geöffnetem Schalter ist der eingang Low
; Mit dem DIL-Schalter werden verschiedene Zeiten und Positionen
; digital eingestellt
;
; S1 = RB0 = Messzeit low bit
; S2 = RB1 = Messzeit high bit
;
; S3 = RB2 = Servo Position MESSEN low bit
; S4 = RB3 = Servo Position MESSEN
; S5 = RB4 = Servo Position MESSEN high bit
;
; S6 = RB5 = Servo Position AUSLÖSEN low bit
; S7 = RB6 = Servo Position AUSLÖSEN
; S8 = RB7 = Servo Position AUSLÖSEN high bit
;
; Funktion der einzelnen DIL-Schalter
; S1 S2 S3 S4 S5 S6 S7 S8
; ' ' ' ' ' ' ' '
; ' ' ' ' ' ' ' '----- Servo Position AUSLÖSEN high bit
; ' ' ' ' ' ' '---------- Servo Position AUSLÖSEN
; ' ' ' ' ' '--------------- Servo Position AUSLÖSEN low bit
; ' ' ' ' '-------------------- Servo Position MESSEN high bit
; ' ' ' '------------------------- Servo Position MESSEN
; ' ' '------------------------------ Servo Position MESSEN low bit
; ' '----------------------------------- Messzeit high bit
; '---------------------------------------- Messzeit low bit


;*** Input an Port A:
; Servo Impuls vom Empfänger = RA4, da schmitt trigger input


;*** Output an Port A:
; Servo Impuls zum Servo = RA0
; LED1 = RA2
; LED2 = RA3


;***** Festlegung der Portadressen
; Die Festlegung der Portadressen erfolgt im Include-File
; Die Ausgaenge sind in p16f84.inc schon definiert als PORTA, PORTB.

Switch equ PORTB
IO equ PORTA
LED1 equ 2
LED2 equ 3
ServoIN equ 4
ServoOUT equ 0


;*******************************
;***** Festlegung von Speicherstellen für die Variablen
;*******************************

RAM: equ 0Ch ;Erstes freies Register
countr50: equ RAM ;loopcounter for 50us loop
x50us: equ RAM+1 ;Zähler for Impulslängen = Anzahl der 50us Aufrufe
messimp: equ RAM+2 ;anzahl der 50us aufrufe for den messimpuls
trigimp: equ RAM+3 ;anzahl der 50us aufrufe for den triggerimpuls
x500ms: equ RAM+4 ;Zeit zwischen messen und auslösen
delms_1: equ RAM+5 ;counter for messzeit=anzahl der 500ms aufrufe
count500_1: equ RAM+6 ;loopcounter for 500ms loop
count500_2: equ RAM+7 ;loopcounter for 500ms loop
count500_3: equ RAM+8 ;loopcounter for 500ms loop
input: equ RAM+9 ;eingangsbyte von IO
w_copy: equ RAM+0A ;Backup for Akkuregister
s_copy: equ RAM+0B ;Backup for Statusregister
shiftreg equ RAM+0C ;schieberegister da rrf nicht in w möglich!!!???
count17_1 equ RAM+0D ;loopcounter for 1700us inner-loop
count17_2 equ RAM+0E ;loopcounter for 1700us outer-loop
druckcount equ RAM+0F ;zähler for tastendrückzeit
count100_1 equ RAM+11 ;loopcounter for 100ms loop
count100_2 equ RAM+12 ;loopcounter for 100ms loop
flags equ RAM+13 ;
c2minh equ RAM+14 ;2min counter high byte 30 * 200 = 6000
c2minl equ RAM+15 ;2min counter low byte



;********************************
;***** Festlegung von Konstanten
;********************************

flag2min equ 0 ;zwei min flag = bit 0



;********************
;***** Programmstart
;********************

;***** Festlegen der Startadresse

; Der Reset-Vector des PIC16F84 liegt bei Adresse 0000h
; Nach dem Reset wird der Reset - Vector in den PC geladen und
; der dort stehende Befehl ausgefuehrt. Dies ist normalerweise ein Sprung
; an den Programmanfang.

ORG 0x000 ;PC auf den Reset-Vector stellen
goto start ;Dort Sprung an den Programmanfang ablegen



;*****************************
;***** Interuptserviceroutine
;*****************************

;Bei einem Interupt springt der PIC16C84 immer zur Adresse 4

Intserv: org 4

;Der Interupt wird durch den Timer des PIC 16F84 alle 20 ms aufgerufen.
;Diese Zeit entspricht dem Rahmentakt einer Fernsteuerung

;In der Interuptroutine werden zunächst weitere Interupts gesperrt
;und der Prozezzorstatus gerettet.

;Vom Hauptprogramm werden die Werte für die gerade zu erzeugende Impulslänge in
;den Speicherstellen "messimp" und "trigimp" übergeben.
;Die, erforderlichen Werte werden an den DIP - Schaltern eingestellt.

;In der eigentlichen Interuptroutine wird der Servoimpus mit der entsprechneden
;Länge für RUHELAGE, MESSEN und AUSLÖSEN erzeugt.


;weitere interupts unterbinden, register retten, Timer 0 neu laden

; bcf INTCON, GIE ; disable Interupt ### Laut BHM not used

movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
movwf s_copy ;

movlw D'178' ; 256-78=178 ((1MHz : 256 ): 78 = 50,08 Hz = 20 ms)
movwf TMR0



;dec des 2min counters und setzen des 2min flags, wenn counter abgelaufen

chec2min: btfsc flags,flag2min ;zwei min flag gesetzt?
goto impstart ;JA, dann sofort servoimpus erzeugen

decfsz c2minl,f ;NEIN (clear), dann 2min counter dec. Zuerst lowbyte
goto impstart ;low counter nicht abgelaufen, also 2 min nicht um
;wenn lowbyte null, wieder neu laden und highbyte testen

chec_1: movlw d'200'
movwf c2minl
decfsz c2minh,f ;dann highbyte testen
goto impstart ;high counter nicht abgelaufen, also 2 min nicht um

bsf flags,flag2min ;2min counter ist abgelaufen, also 2 min flag setzen



;nun Servo Ipuls erzeugen

;Die Impulslänge besteht aus:
;- einem festen Anteil von ca.1ms
;- einem variablen teil für die messposition
;- einem variablen teil für die triggerposition
;die Auflösung ist jeweils 50 us


impstart: bsf IO, ServoOUT ;1 an Servo ausgeben = positive impulsflanke
;impuls beginnt

impfix: movlw d'19' ;feste zeit x 50 us

IF DEBUG
movlw 2
ENDIF

movwf x50us
impfix_1: decfsz x50us,f
goto impfix_2
goto impmes ;feste zeit ist um, nun variable messen dazu
impfix_2 call del50us
goto impfix_1



impmes: movf messimp,w ;variable impulslänge "messen" x 50 us
movwf x50us
incf x50us,f ;to prevent an overflow
impmes_1: decfsz x50us,f
goto impmes_2
goto imptrig ;messen ist um, nun variable triggern dazu
impmes_2: call del50us
goto impmes_1



imptrig: movf trigimp,w ;variable impulslänge "triggern" x 50 us
movwf x50us
incf x50us,f ;to prevent an overflow
imptri_1: decfsz x50us,f
goto imptri_2
goto impend ;triggern ist um, = impuls ist fertig
imptri_2: call del50us
goto imptri_1


impend: bcf IO, ServoOUT ;0 an servo ausgeben, negative impulsflanke
;impuls zu ende


Int_End: ;nun alle register wieder zurück und int freigeben

swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w

bcf INTCON, T0IF ; Interupt-Flag löschen
; bsf INTCON, GIE ; enable Interupt ### Laut BHM not used

retfie



;***** zeitverzögerung ca 50us (50,99us) ACHTUNG nur vom Interrupt her aufrufen

del50us: movlw d'15'

IF DEBUG
movlw 2
ENDIF

movwf countr50

loop50: decfsz countr50,f
goto loop50

return



;********************
;***** Hauptprogramm
;********************

start: bcf INTCON, GIE ;disable Interupt

call init ;initialisierung

IF DEBUG
goto start_1 ;readymeldung überspringen
ENDIF

call readymeld ;readymeldung an LED ausgeben

start_1: bsf INTCON, GIE ;enable Interupt



mainloop: ;2 min check. in der int routine wird alle 20 ms ein counter dec. dieser läuft
;ca. 2min. ist er abgelaufen, so wird ein flag gesetzt. dadurch wird ein
;messvorgang ausgelöst, um ein cameratimeout zu vermeiden.

btfss flags,flag2min ;zwei min flag gesetzt?
goto readio ;NEIN, dann eingang lesen
bcf flags,flag2min ;JA, dann 2min flag reset, 2 min counter neu laden
movlw 19 ;6000 * 20 ms = 2 min.
movwf c2minh ;2min counter high byte 30 * 200 = 6000
movlw d'200'
movwf c2minl ;2min counter low byte
call xmess ;messvorgang an der camera auslösen
clrf messimp ;Impulslänge wieder auf kurz
clrf trigimp


readio: ;feststellen ob ein servoimpuls vorhanden ist
;auswerten, ob der impus lang genug ist, also eine auslösung
;erfolgen soll.

btfss IO,ServoIN ;Ist Servoimpuls vom Empfänger vorhanden?
goto mainloop ;NEIN, dann Eingang wieder abfragen

bcf INTCON, GIE ;JA. disable Interupt
;Während der Messung der 1,7ms darf die Interuptroutine
;nicht aufgerufen werden, da sonst die Messzeit durch
;die Laufzeit des Interruptes verfälscht wird.
;Die nachfolgende Zeitschleife läuft 1,7ms.
;Ist danach der Impuls vom Sender noch 1, so ist er
;länger als 1,7ms, dh "Auslösebefehl" vom Sender.

call del1700us

btfss IO,ServoIN ;Ist Servoimpuls vom Empfänger nach 1,7ms noch da?
goto loadcountr ;NEIN, dann drückzähler neu laden

zerocheck: bsf INTCON, GIE ;enable Interupt

btfsc IO,ServoIN ;JA, warten bis Impuls wieder 0, sonst wird beim nächsten
goto zerocheck ;Schleifendurchlauf noch die Restzeit des Impulses
;ausgewertet, wenn er vom Sender zB. 1,9ms lang ist.
;Die nächste Auswertung würde dann 0,2 ms ergeben, also
;nicht Auslösen.

decfsz druckcount,f ;Der Impuls vom Sender ist nun >= 1,7ms. Das bedeutet
;Auslösen.
;Um aber eine gewisse Störsicherheit zu haben, muss der
;Befehl für mindestens 0,5 sec. anstehen, damit der
;Befehl vom Programm auch ausgeführt wird. Dadurch wird
;vermieden, das bei einigen Störimpulsen, die
;länger als 1,7ms sind, eine Auslösung erfolgt.
;Der 1,7ms Impuls muss 25 x hintereinander
;(25 x 20ms = 500ms) vorhanden sein.
;Erfolgt hier nur ein Impuls der kürzer als 1,7 ms ist,
;so wird der Zähler wieder neu geladen.

goto mainloop ;zähler nicht 0, dann eingang wieder abfragen

;zähler ist 0, dh taste ist 500ms gedrückt.

bcf flags,flag2min ;dann 2min flag reset, 2 min counter neu laden
movlw 19
movwf c2minh ;high byte
movlw d'200'
movwf c2minl ;low byte

call trigger ;nun camera triggerablauf starten

clrf messimp ;Impulslänge wieder auf kurz
clrf trigimp

call c_readydel ;delay till camera is ready

loadcountr: bsf INTCON, GIE ;enable Interupt

movlw d'25' ;drückzähler neu laden. 25 x 20 ms = 500ms
movwf druckcount

goto mainloop ;und eingang neu abfragen



;*************************
;********** Unterprogramme
;*************************

;***** Ports initialisieren
; Jeder Pin kann als input oder output programmiert werden.
; Jeder I/O-Port hat ein I/O control register. TRISA, TRISB
; Um einen pin als output zu programmieren, muß das entsprechende
; direktion control bit in TRISA, B 0 sein.
; Bei einer programmierung als input muss es 1 sein.
; 1 = input
; 0 = output

init: ;I/O - Ports initialisieren

bsf STATUS, RP0 ;auf Bank 1 umschalten
MOVLW b'00010000' ;nur bit 4 ist ein eingang
movwf TRISA ;Steuerwort in das Steuerregister für PORT A
MOVLW b'11111111' ;alles eingänge vom DIL-Schalter
movwf TRISB ;Steuerwort in das Steuerregister für PORT B
bcf STATUS, RP0 ;auf Bank 0 zurückschalten


;***** Timer0 initialisieren
; Belegung des OPTION - Registers:
;
; Bit 7-6 ?????????
;
; Bit 5 T0CS = Timer 0 Clock Selekt
; 0 = Internal instruktion Clock
; 1 = Takt am Pin T0CKI
;
; Bit 4 T0SE = Timer 0 Source Edge Select
; 0 = Low to high trigger an Pin T0CKI
; 1 = High to low trigger an Pin T0CKI
;
; Bit 3 PSA = Pre Scaler Assignmant
; 0 = Prescaler assignt to TIMER0
; 1 = Prescaler assignt to Watchdog Timer
;
; Bit 2-0 PS2, PS1, PS0 = Prescaler rate select bits
; 000 = 1 : 2 bei Timer0
; 001 = 1 : 4
; 010 = 1 : 8
; 011 = 1 : 16
; 100 = 1 : 32
; 101 = 1 : 64
; 110 = 1 : 128
; 111 = 1 : 256 bei Timer0
;
;Soll kein Vorteiler benutzt werden, ist bit 3 auf Watchdog zu setzen



;20ms-Timer-Interupt einstellen

bsf STATUS, RP0 ; auf Bank 1 umschalten

movlw B'10000111' ; internen Takt zählen, Vorteiler zum Timer0, 256:1
movwf OPTION_REG

bcf STATUS, RP0 ; auf Bank 0 zurückschalten

movlw D'178' ; 256-78=178 ((1MHz : 256 ): 78 = 50,08 Hz = 20 ms)
movwf TMR0


;variablen vorbelegen

movlw d'25'
movwf druckcount ;drucktimer laden (25 x 20 ms = 500ms)

movlw 19 ;6000 * 20 ms = 2 min.
movwf c2minh ;2min counter high byte 30 * 200 = 6000
movlw d'200'
movwf c2minl ;2min counter low byte

clrf messimp ;variablen vorbelegen
clrf trigimp ;mess- und triggerimpulslänge auf kurz

bsf INTCON, T0IE ; Timer0 interupt erlauben
bsf INTCON, GIE ; Interupt erlauben

return ;INIT beendet



;***** Trigger. Subroutine for controlling the delays of the Cameratriggering

trigger: ;Cameratriggering beginns here

messen: ;einlesen der impulslänge für messen

bsf IO,LED1 ;Led 1 einschalten = messen

movf Switch,w ;Tastenport lesen, bit 2 - 4 geben die impulsdauer für den messimpuls an

IF DEBUG
movlw b'11101101' ;testdata: entspricht dil-schalter stellung
ENDIF

movwf shiftreg
rrf shiftreg,f ;zweimal rechts schieben = wert zwischen 0 und 7 nun in bit 0 - 2
rrf shiftreg,f
movlw b'00000111' ;mask not used bits
andwf shiftreg,f
incf shiftreg,w ;the servo does a move of at least 50us if the switches are 000
movwf messimp ;in messimpuls ablegen. die int-routine erzeugt nun
;alle 20 ms den servoimpuls für die
;servoposition "Messen"



messzeit: ;einlesen der messzeit und so lange warten. Die messzeit besteht aus einem
;variablen teil (DIL-Schalter) und einem festen teil

movf Switch,w ;Tastenport lesen
andlw b'00000011' ;bit 0 und 1 geben die messzeit an, rest ausblenden
movwf x500ms ;in x500ms ablegen
call delmess ;messzeit = x 500ms

movlw 4 ;feste zeit 4 x 500ms = 2sec als minimalzeit
movwf x500ms ;noch hinten dranhängen

IF DEBUG
goto triggern
ENDIF

call delmess



triggern: ;einlesen der impulslänge für auslösen

bsf IO,LED2 ;LED 2 einschalten = triggern

movf Switch,w ;Tastenport lesen, bit 5 - 7 geben die impulsdauer für den
;triggerimpuls an

IF DEBUG
movlw b'11100101' ;testdata: entspricht dil-schalter stellung
ENDIF

movwf shiftreg
rrf shiftreg,f ;fünfmal rechts schieben = wert zwischen 0 und 7 steht dann in bit 0 - 2
rrf shiftreg,f
rrf shiftreg,f
rrf shiftreg,f
rrf shiftreg,f
movlw b'00000111' ;mask not used bits
andwf shiftreg,f
incf shiftreg,w ;the servo does a move of at least 50us if the switches are 000
movwf trigimp ;in triggerimpuls ablegen. die int-routine erzeugt nun
;alle 20 ms den servoimpuls für
;servoposition "Triggern"



Warten: ;nun noch den Auslöser für eine kleine zeit gedrückt halten
movlw 3 ;X x 500ms
movwf x500ms
call delmess

bcf IO,LED1 ;LED 1 aus
bcf IO,LED2 ;LED 2 aus

return ;UP triggern beendet



;***** 2minmess. Subroutine for Camera measuring, to prevent a camera timeout

xmess: ;einlesen der impulslänge für messen

bsf IO,LED1 ;Led 1 einschalten = messen

movf Switch,w ;Tastenport lesen, bit 2 - 4 geben die impulsdauer für den messimpuls an

IF DEBUG
movlw b'11101101' ;testdata: entspricht dil-schalter stellung
ENDIF

movwf shiftreg
rrf shiftreg,f ;zweimal rechts schieben = wert zwischen 0 und 7 nun in bit 0 - 2
rrf shiftreg,f
movlw b'00000111' ;mask not used bits
andwf shiftreg,f
incf shiftreg,w ;the servo does a move of at least 50us if the switches are 000
movwf messimp ;in messimpuls ablegen. die int-routine erzeugt nun
;alle 20 ms den servoimpuls für die
;servoposition "Messen"



xmesszeit: ;einlesen der messzeit und so lange warten. Die messzeit besteht aus einem
;variablen teil (DIL-Schalter) und einem festen teil

movf Switch,w ;Tastenport lesen
andlw b'00000011' ;bit 0 und 1 geben die messzeit an, rest ausblenden
movwf x500ms ;in x500ms ablegen
call delmess ;messzeit = x 500ms

movlw 4 ;feste zeit 4 x 500ms = 2sec als minimalzeit
movwf x500ms ;noch hinten dranhängen

IF DEBUG
goto triggern
ENDIF

call delmess

bcf IO,LED1 ;LED 1 aus

return ;UP messen beendet



;***** readymeldung an LED durch blinken ausgeben

readymeld: bcf IO,LED1
bsf IO,LED2
call del100ms

bsf IO,LED1
bcf IO,LED2
call del100ms

bcf IO,LED1
bsf IO,LED2
call del100ms

bsf IO,LED1
bcf IO,LED2
call del100ms

bcf IO,LED1
bsf IO,LED2
call del100ms

bsf IO,LED1
bcf IO,LED2
call del100ms

bcf IO,LED1
bsf IO,LED2
call del100ms

bsf IO,LED1
bcf IO,LED2
call del100ms

bcf IO,LED1
bcf IO,LED2

return



;************************
;***** Delayloops
;************************


;***** Messzeit. Anzahl der 500ms aufrufe steht in x500ms

delmess: movf x500ms,w ;Verzögerungswert nach w
movwf delms_1 ;wert in counter ablegen
incf delms_1,f ;mindestens ein schleifendurchlauf

delmes_2: decfsz delms_1,f ;decrement f, store in f, skip if zero
goto delmes_1 ;nächste schleife, wenn äussere schleife nicht 0
return ;return wenn äussere schleife 0
delmes_1: call del500ms
goto delmes_2



;***** delayloop aprox 500ms (4,219,255)

del500ms:

del500_1: movlw d'4' ;Verzögerungswert nach w
movwF count500_1 ;wert in counter ablegen, äussere schleife
del500_2: decfsz count500_1,f ;decrement f, store in f, skip if zero
goto del500_3 ;nächste schleife, wenn äussere schleife nicht 0
goto del500end;delay ende if outerloop 0

del500_3: movlw d'219' ;Verzögerungswert nach w
movwF count500_2 ;wert in counter ablegen, innere schleife
del500_4: decfsz count500_2,f ;decrement f, store in f, skip if zero
goto del500_5 ;nächste schleife, wenn wert nicht 0
goto del500_2 ;äussere schleife, wenn diese zu ende

del500_5: movlw d'255' ;Verzögerungswert nach w
movwF count500_3 ;wert in counter ablegen, innere schleife
del500_6: decfsz count500_3,f ;decrement f, store in f, skip if zero
goto del500_6 ;loop, wenn wert nicht 0
goto del500_4 ;mittlere schleife, wenn diese zu ende

del500end: return



;***** delayloop aprox 1700us

del1700us:

del17_1: movlw d'34' ;delay to w
movwf count17_1 ;store in counter, outer loop
del17_2: decfsz count17_1,f ;decrement f, store in f, skip if zero
goto del17_3 ;next loop, if outer loop is not 0
goto del17_end ;delay end, if outer loop is 0

del17_3: movlw d'15' ;delay to w. 15 must be 50us
movwf count17_2 ;store in counter, inner loop
del17_4: decfsz count17_2,f ;decrement f, store in f, skip if zero
goto del17_4 ;inner loop, if not 0
goto del17_2 ;outer loop, if inner loop is 0

del17_end: return



;***** delayloop approx 100ms

del100ms:

del100_1: movlw d'200' ;delay to w
movwf count100_1 ;store in counter, outer loop
del100_2: decfsz count100_1,f ;decrement f, store in f, skip if zero
goto del100_3 ;next loop, if outer loop is not 0
goto del100_end ;delay end, if outer loop is 0

del100_3: movlw d'150' ;delay to w. 150 must be 500us ######### chek it out!!!
movwf count100_2 ;store in counter, inner loop
del100_4: decfsz count100_2,f ;decrement f, store in f, skip if zero
goto del100_4 ;inner loop, if not 0
goto del100_2 ;outer loop, if inner loop is 0

del100_end: return



;***** camera ready delay: delayloop till camrea is ready

c_readydel: ;Pause bis Camera ready

movlw d'10' ;X x 500ms
movwf x500ms
call delmess
call readymeld
return



;***** Programmende

END ; Programmende


 

Home ] Up ]                                                                                                                                               

Send mail to ironsidz@hotmail.com with questions or comments about this web site.
Copyright © 2003 
Last modified: March 18, 2004