Hallo Gemeinde,
ich glaub ich komm noch öfters... leider. Ich hab vor einer guten Woche
angefangen mit mich einem atmega32 zu beschäftigen. Mein erstes Projekt
soll eine Kamera für Langzeitaufnamhmen steuern. Zusätzlich zur
Kamerasteuerung muss ein Schrittmotor für eine Nachführung gesteuert
werden. Der Aufbau ist Hardwareseitig bis auf ein paar optimierungen
abgeschlossen. Probleme bereiten mir jetzt allerdings Zeitkritische
Programmabläufe. Bin leider nicht so der Bascom Held, da auch erst eine
Woche.... naja, folgendes Problem:
Über ein Menü kann ich belichtungszeiten einstellen. Das was aus dem
Menü ausgewählt wird, wird an eine Routine übergeben (Sekunden). Diese
Routine löst die Kamera aus, und hält die Auslösung solange, bis die
Zeit T vorüber ist. Und während dieser Zeit muss ein Motor um x Schritte
kontinuirlich bewegt werden. Der Stepper macht 1,8°, also 200 Schritte.
Bei einer Auslösezeit von 60 Sekunden soll der Stepper genau diese 200
Schritte machen. Bei einer Auslösezeit von 1 Sekunde soll der Stepper
genau 3.3333 Schritte machen.
Die Anzahl der Schritte habe ich noch gar nicht im griff, der Rest
vermutlich auch nicht. Folgende Teile sind dabei relevant:
In main wird geprüft, ob an einer geiwssen Stelle Enter gedrückt wird
(Menü für Belichtungszeiten):
1 | If Kp = Keye And Submnu(i) > 1300 And Submnu(i) < 1399 And Sekmnu = 0 Then
|
2 | T = Val(mnutext(i))
|
3 | Call Ausloesen(t)
|
4 | Return
|
5 | End If
|
Wenn wahr, werden die sekunden an die subrutine übergeben. Diese macht
folgendes:
1 | Sub Ausloesen(byval T As Word)
|
2 |
|
3 | Wartezeit = Val(sftime)
|
4 | If T = 999 Then
|
5 | Fokus = 1
|
6 | Waitms Wartezeit
|
7 | Ausloesung = 1
|
8 | End If
|
9 | If T < 999 Then
|
10 | Locate 1 , 1 : Lcd Chr(5) ; " mit " ; T ; " sek."
|
11 | Fokus = 1
|
12 | Waitms Wartezeit
|
13 | Ausloesung = 1
|
14 | Do
|
15 | Locate 2 , 1 : Lcd " "
|
16 | Locate 2 , 1 : Lcd "Noch " ; T ; " sek."
|
17 | Gosub Tstq
|
18 | Call Vollschrittvor()
|
19 | T = T - 1
|
20 | If T = 0 Then
|
21 | Call Motoraus()
|
22 | Exit Do
|
23 | End If
|
24 | Loop Until Kp > 0
|
25 | End If
|
26 | End Sub
|
Wenn Tastq aufgerufen wird, wird lediglich geprüft, ob eine Taste
während der ausführung gedrückt wird. Der interessante Teil ist in do zu
finden, und zwar Vollschrittvor():
1 | Sub Vollschrittvor()
|
2 | For Sti = 1 To 4
|
3 | Incr Vollschrittindex
|
4 | If Vollschrittindex > 4 Then
|
5 | Vollschrittindex = 1
|
6 | End If
|
7 | A1 = Vollschrittarray(vollschrittindex).1
|
8 | B1 = Vollschrittarray(vollschrittindex).2
|
9 | A2 = Vollschrittarray(vollschrittindex).3
|
10 | B2 = Vollschrittarray(vollschrittindex).4
|
11 | Waitms 250
|
12 | Next Sti
|
13 | End Sub
|
Vollschrittarray(vollschrittindex) beinhaltet die Matrix um den Motor zu
steuern. Dummerweise benötige ich hier extrem exakte wait angaben, da
das ding auch schonmal ne halbe stunde oder auch stunde laufen kann am
stück.
Dummerweise macht der Motor jetzt noch zuviel schritte pro minute, weill
ich die 4 Ports immer 4 mal unterschiedlich schalten muss, also pro
impuls eigentlich 4 schritte mache... ich glaub ich hab mich da in was
verrant, das muss doch anders und besser, vor allem genauer gehn? Wer
noch mehr Infos braucht findet das ganze Programm in Anhang. Über die
ein oder andere Hilfe würde ich mich sehr freuen.
Danke und Grüße
Manfred