Hi Kasimir
Erst mal danke für deine blitzschnelle antwort, hut ab:smile:
was willst du denn verbessern?
sorry aber jetzt muss ich etwas ausholen (roman:smile:
Nun es ist so, ich habe ein programm zusammengeschustert der einen bipolaren steppmotor links und rechts treibt. Der motor stellt einen kleinen nadelwentil. Da der nadel ein gewindenadel mit sehr flachen konus ist darf nicht bis zum anschlag eingedreht werden sonst langt der drehmoment des mororst nicht mehr aus diesen wieder von seimem sitz loszudrehen.
Also ich brauche irgendwie ganz genau auf die position des nadels ahten und beim abschalten oder beim ausfall der stromversorgung wieder an diese position zurückfahren zu können. Das ding is sehr winzig der motor ist aus einem floppy, treib ohne untersetzung den nadel und ein endschalter ist nicht einbaubar, past nicht rein. Ich habe aber an der welle eine scheibe mit einem schlitz installieren können für eine auch vom floppy stammende kleine lichtschranke. Leider funkt nicht erwartungsgemess. Die schranke ist an into0 aber liefer manchmal unsinnige signale bzw. der zähler zählt dann auch wenn definitiv nicht sollte und umgekeht. das konnte ich im terminal feststellen. Woran es liegt weiss ich noch nicht aber vermute,dass es villeicht mit wibrationen beim anhalten/anfahren zu tun hatt wenn der schlitz grad dort steht. Wenn ich mit dem finger schubsche zählt brav. Das währe problem nr.1. Nr.2: wie konstruire ich eine schleife wo ich noch vor dem hauptprogramschleife aus der im eeprom abgelegte/geretteten schrittzahl (wo gerade stehengeblieben ist) wieder auf die 0 position zurükgefaren wird.
Bisher fahre ich im hauptprogramm immer alle vier schritte auf einen rutsch. Am anfang beim eincsaltener müsste ich aber beim beliebigen Schritten anfangen und anhalten (bei 0) können.
Das schaffe ich mit meinem paar wohchen grübelei leider nicht.
Hier ist das prog, ich hoffe, dass nicht sehr kaotisch ist:smile:
$regfile = „m32def.dat“
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Config Portc.6 = Output
A Alias Portc.6 'Spule 1 eingang
Config Portc.7 = Output
B Alias Portc.7 'Spule 1 ausgang
Config Portb.0 = Output
C Alias Portb.0 'Spule 2 eingang
Config Portb.1 = Output
D Alias Portb.1 'Spule 2 ausgang
Config Portd.4 = Output
E Alias Portd.4
Config Portd.5 = Output 'Enable L293D Treiber
F Alias Portd.5 'Enable L293D Treiber
Config Pina.0 = Input ’ Messwert für die Ventil zu stellen
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Lambda As Word
Config Pind.2 = Input 'INT0 (Lichtschranke) funkt aber nicht:smile:
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Isr_von_int0
Dim Dummy As Eram Byte 'Datenrettung, noch nicht ausprobiert:smile:
Dim Eek As Eram Byte 'braucht int1 noch
Dim Eez As Eram Byte
Dim G As Byte 'Zähler für die einzelne schritte
G = 0
Dim S As Bit 'für die Lichtschrankensignal. Man behauptet, dass hier ein byte schneller währe, keine ahnung:smile:
S = 0
Dim Z As Byte 'Zähler für einen Rutsch, 4 Schritte
Z = 10
Dim K As Byte 'Zähler für die tatsächliche Lichtschrankensignale die ich dann im Terminal sehen kann
K = 0
'If G Eeg Then G = Eeg (kommt noch irgendwann)
'If Z Eez Then Z = Eez
Do
Lambda = Getadc(0)
Wait 1
Print "Lambda = " ; Lambda
If Lambda 10 Then Gosub Zu
If Lambda > 600 And Z