PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Motor soll bis zu einem Taster-Druck drehen



eIdea
20.10.2006, 12:03
Ich habe mal wieder ein Kleines Problem mit meiner Skinner-Box (Ich werde das Projekt dann euch dann auch vorstellen).
Ich habe einen Futterautomaten Angeschlossen, der genau eine Umdrehung machen soll (ist nen Getriebe mit bei) allerdings ist das ein Billig-Fernost-Motor, der nie gleich dreht. Momentan wird über nen wait-Befehl gewartet, bis der Motor etwa ne Umdrehung gemacht hat, das ist aber viel zu ungenau.
Bei der Original-Elektronik, die rausgeflogen ist, war ein Taster an der Motor-Welle, der durch die Welle in der Ausgangsposition gedrück wurde und der Elektronik verriet, wann schluss ist. Diesen Taster würde ich jetzt gerne wieder in BEtrieb nehmen, allerdings habe ich keine Ahnung, wie ich es meinem Bascom sagen soll, da der Taster ja auch bei dem nöchsten Starten noch kurzzeitig gedrück ist.



'Grundsätzliche Angaben zum Controller
$regfile = "2313def.dat"
$crystal = 8000000

'Variablen dimensionieren und nullen
Dim Ist As Integer , Soll As Integer , Startbs As Integer , Aux As Integer

'Port-Deklarationen
Config Pinb.0 = Input
Config Pind.1 = Input
Config Pind.2 = Input
Config Pinb.1 = Output
Config Pind.6 = Output
Config Pind.0 = Output


'Einstellungen
Aux = 1680 'Wie lang soll der AUX an sein (in ms)
Startbs = 3 'Wie lang soll der Startbildschirm angezeigt werden (in sec.)
Ist = 0 'Startwert für den Ist-Wert
Soll = 1 'Startwert für den Soll-Wert


'Den Ports Namen geben (nur fürs Layout)
Taster Alias Pinb.0
Ledtast Alias Portb.1
Ledaux Alias Portd.6
Lederr Alias Portd.0
Manual Alias Pind.1
Rst Alias Pind.2


'LED3 "Gerät nicht bereit / Fehler" aktivieren
Lederr = 1

'Display-Optionen
Cursor Off
Cls
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2 '

'Startbildschirm anzeigen
Locate 1 , 1
Lcd "Sebastian Rietig &"
Locate 2 , 1
Lcd " Tjark Radewaldt"
Locate 3 , 1
Lcd " SkinnerMaus 3000+"
Locate 4 , 1
Lcd " Skinner-Box"

'Startbs Sekunden den Startbildschirm aneigen, dann Anige löschen un Gerät freigeben
Wait Startbs
Cls

'Kleiner Fehlersucher
If Soll < Ist Then
Locate 1 , 1
Lcd " SkinnerMaus 3000+"
Locate 2 , 1
Lcd "Error: Soll < Ist"

Else
Lederr = 0

'Arbeitsbldschirm anzeigen
Locate 1 , 1
Lcd " SkinnerMaus 3000+"
Locate 2 , 1
Lcd "Soll:" ; Soll
Locate 3 , 1
Lcd "Ist :" ; Ist
Locate 4 , 1
Lcd "Waiting for Signal"

'Taster entprellen und bei High zu "Tasteran" springen
Entprell:
Debounce Taster , 1 , Tasteran
Debounce Manual , 1 , Manualan
Debounce Rst , 1 , Rstan

'Wenn der Taster gedrückt wurde, in diese Schleife springen
Tasteran:
Do
If Taster = 1 Then
Ledtast = 1
Locate 4 , 1
Lcd "Input high "
Ist = Ist + 1
Locate 3 , 1
Lcd "Ist :" ; Ist

If Ist = Soll Then
Locate 4 , 1
Lcd "AUX enabled "
Ledaux = 1
Ledtast = 0
Waitms Aux
Locate 4 , 1
Lcd "Waiting for Signal"
Ledaux = 0

Soll = Soll + 1
Ist = 0
Locate 2 , 1
Lcd "Soll:" ; Soll

Locate 3 , 1
Lcd "Ist :" ; Ist ; " "
End If

Do
Loop Until Taster = 0
Else
Locate 4 , 1
Lcd "Waiting for Signal"
Ledtast = 0
Goto Entprell

End If
Loop


'Bei Druck auf die Manual-Taste
Manualan:
Do
If Manual = 1 Then
Locate 4 , 1
Lcd "Manual Mode "
Ledaux = 1
Waitms Aux
Locate 4 , 1
Lcd "Waiting for Signal"
Ledaux = 0

Do
Loop Until Manual = 0
Else
Locate 4 , 1
Lcd "Waiting for Signal"
Goto Entprell
End If
Loop

' Bei Druck auf die Reset-Taste
Rstan:
Do
If Rst = 1 Then
Wait 3
If Rst = 1 Then
Locate 4 , 1
Lcd "Resetting Data "
Lederr = 1
Ist = 0
Soll = 1
Locate 2 , 1
Lcd "Soll:" ; Soll ; " "
Locate 3 , 1
Lcd "Ist :" ; Ist ; " "
End If
Do
Loop Until Rst = 0
Else
Lederr = 0
Ledaux = 0
Locate 4 , 1
Lcd "Waiting for Signal"
Goto Entprell
End If

Loop

End If
End


Das ist der bisherige, komplette Code.
Für den Taster im Automaten würd ich gerne PD.5 nehmen.

Also ich möchte jetzt, das der Mtor bis zum Tasterdruck dreht, aber mein Problem ist, dass beim nächsten Motor-Start der Taster ja immernoch gedrückt wäre.

Vielen Dank

jojo3
20.10.2006, 12:26
Du kannst das mit einem Interrupt-Eingang lösen.
Einfach als Flanke parametrieren, dann machts nichts aus wenn
der Motor auf dem Taster stehen bleibt, gestoppt wird
dann ja nur bei der nächsten Flanke. Die Stop-Bedingung
für den Motor einfach in die Interrupt-Routine packen.
Schau in der Bascom-Hilfe nach "config int",
da gibts auch Beispiele.

eIdea
20.10.2006, 12:34
Danke!
Ich werds mal probieren

eIdea
20.10.2006, 22:05
Ich kriegs ums verrecken nicht hin.
Sobald Ledaux (der Motor) gestartet wird, stopt das Programm sofort wieder und startet komplett neu (inkl. dem Startbildschirm).
Ich habe hin und her probiert, aber es gab keine Änderung.
Der Schließer hängt an INT1 (PD.3)

Mein Code:


Enable Interrupts
Enable Int1
On Int1 motoraus

[...]

Motoraus:
Ledaux = 0
Return

jojo3
21.10.2006, 12:20
Hast du den Taster auch gegen Masse gescgaltet, Pullup ein
und den Interrupt richtig konfiguriert?

Config Int1 = Falling

Hast auch ausreichend Stack, Frame- Speicher reserviert?

eIdea
21.10.2006, 13:32
hab nen 10kOhm gegen Masse Frame und Stack-Size hab ich Bascom-Stanard (HW Stack 32, Software Stack 8 und und Framesize 16)


Config Int1 = Falling hab ich noch nicht

Dirk
21.10.2006, 15:23
Hallo eIdea,


Sobald Ledaux (der Motor) gestartet wird, stopt das Programm sofort wieder und startet komplett neu (inkl. dem Startbildschirm).


Nicht immer ist's die Software! (Obwohl mir der Software-Stack auch zu niedrig aussieht!)
-> Stromversorgung ok?
Der Anlaufstrom des Motors könnte die Betriebsspannung des AVR vorübergehend soweit in die Knie zwingen, dass ein Reset ausgelöst wird.

Abhilfe:
1. Getrennte Spannungsversorgung
2. Größere Elektrolyt-Kondensatoren
3. Mehr Blockkondensatoren 100nF
4. Stärkeres Netzteil

Gruss Dirk

eIdea
21.10.2006, 15:47
Naja, die alte Version, so wie ich sie oben gepostet habe, funktioniert.
Versorgt wird die Schaltung über nen 1,2A-Netzteil mit 6V und nem 7805, der Motor bekommt die 6V direkt vom Netzteil und der AVR schaltet nurn Reed-Relais, um den MOtor zu aktivieren

Dennoch vielen Dank für den HInweis ;-)

Dirk
21.10.2006, 17:35
Hallo eIdea,


Dennoch vielen Dank für den HInweis

Da habe ich gleich noch einen:

Wenn du einen "normalen" 7805 genommen hast, sollte die Differenz Eingang-Ausgang mind. 2V betragen.

Wenn der 7805 nur 6V am Eingang zur Verfügung hat und diese 6V noch durch den Anlaufstrom des Motors belastet werden, könnte auf der AVR-Seite ein deutlicher Spannungseinbruch die Folge sein.
Das könnte ein Reset auslösen.
Also: Nicht so weit wegschieben, messen!

Gruß Dirk

eIdea
21.10.2006, 18:05
Ist praktischerweise nen Universal-Netzteil und ich habs mal auf 9V hochgeschoben - Immernoch

Und der µC wird ja resettet, sobal ich den Taster im Futterautomaten drücke und nciht, sobald der Motor anspringt

eIdea
22.10.2006, 22:03
Inzwischen hab ich zwar rausgefunden, dass der Taster als Öffner fungierte, hab ihn jetzt auf Schließer umgestellt, aber funktionieren tut das alles immernoch nicht.

Naja, notfalls muss ich mir was anderes einfallen lassen, den Motor immer wieder in die Ausgangsstellung zu bringen

jojo3
23.10.2006, 06:52
Bei deiner Konfiguration muss es so heissen: Config Int1 = rising,
da du ja von 0 auf 1 schaltest. Ansonsten poste doch etwas mehr code,
vielleicht liegt der Fehler wo anders?

eIdea
23.10.2006, 10:19
Hier mal der ganze Code, wie ich ihn momentan habe:


'Port-Deklarationen
Config Pinb.0 = Input
Config Pind.1 = Input
Config Pind.2 = Input
Config Pind.3 = Input
Config Pinb.1 = Output
Config Pind.6 = Output
Config Pind.0 = Output

'Einstellungen
'Aux = 1680 'Wie lang soll der AUX an sein (in ms)
Startbs = 3 'Wie lang soll der Startbildschirm angezeigt werden (in sec.)
Ist = 0 'Startwert für den Ist-Wert
Soll = 1 'Startwert für den Soll-Wert



'Den Ports Namen geben (nur fürs Layout)
Taster Alias Pinb.0
Ledtast Alias Portb.1
Ledaux Alias Portd.6
Lederr Alias Portd.0
Manual Alias Pind.1
Rst Alias Pind.2
Motor Alias Pind.3


'LED3 "Gerät nicht bereit / Fehler" aktivieren
Lederr = 1

'Display-Optionen
Cursor Off
Cls
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2 '

'Startbildschirm anzeigen
Locate 1 , 1
Lcd "Sebastian Rietig &"
Locate 2 , 1
Lcd " Tjark Radewaldt"
Locate 3 , 1
Lcd " SkinnerMaus 3000+"
Locate 4 , 1
Lcd " Skinner-Box"

'Startbs Sekunden den Startbildschirm aneigen, dann Anige löschen un Gerät freigeben
Wait Startbs
Cls

Lederr = 0

'Arbeitsbldschirm anzeigen
Locate 1 , 1
Lcd " SkinnerMaus 3000+"
Locate 2 , 1
Lcd "Soll:" ; Soll
Locate 3 , 1
Lcd "Ist :" ; Ist
Locate 4 , 1
Lcd "Waiting for Signal"
Do
'Taster entprellen und bei High zu "Tasteran" springen
Entprell:
Debounce Taster , 1 , Tasteran
Debounce Manual , 1 , Manualan
Debounce Rst , 1 , Rstan

'Wenn der Taster gedrückt wurde, in diese Schleife springen
Tasteran:
Do
If Taster = 1 Then
Ledtast = 1
Locate 4 , 1
Lcd "Input high "
Ist = Ist + 1
Locate 3 , 1
Lcd "Ist :" ; Ist

If Ist = Soll Then
Locate 4 , 1
Lcd "AUX enabled "
Ledaux = 1
Ledtast = 0
' Waitms Aux
' Locate 4 , 1
' Lcd "Waiting for Signal"
' Ledaux = 0

Soll = Soll + 1
Ist = 0
Locate 2 , 1
Lcd "Soll:" ; Soll

Locate 3 , 1
Lcd "Ist :" ; Ist ; " "
End If

Do
Loop Until Taster = 0
Else
Locate 4 , 1
Lcd "Waiting for Signal"
Ledtast = 0
Goto Entprell

End If
Loop


'Bei Druck auf die Manual-Taste
Manualan:
Do
If Manual = 1 Then
Locate 4 , 1
Lcd "Manual Mode "
Ledaux = 1
' Waitms Aux
' Locate 4 , 1
' Lcd "Waiting for Signal"
' Ledaux = 0

Do
Loop Until Manual = 0
Else
Locate 4 , 1
Lcd "Waiting for Signal"
Goto Entprell
End If
Loop

' Bei Druck auf die Reset-Taste
Rstan:
Do
If Rst = 1 Then
Wait 3
If Rst = 1 Then
Locate 4 , 1
Lcd "Resetting Data "
Lederr = 1
Ist = 0
Soll = 1
Locate 2 , 1
Lcd "Soll:" ; Soll ; " "
Locate 3 , 1
Lcd "Ist :" ; Ist ; " "
End If
Do
Loop Until Rst = 0
Else
Lederr = 0
Ledaux = 0
Locate 4 , 1
Lcd "Waiting for Signal"
Goto Entprell
End If

Loop



Motoraus:
Ledaux = 0
Locate 4 , 1
Lcd "Waiting for Signal"
Return

Loop
End

ledaux schaltet ein Reed-Relais, an dem Der Motor hängt
motor ist der Taster an der Achse, er ist mitm 10k-Ohm-Widerstand zu GND gezogen

Sobald ich das Programm auf dem µC starte (egal ob faling oder rising) und die "Manual"-Taste drücke, zuckt der Motor und beim dritten Male zeigt das Display nur noch irgendwelche Sonderzeichen an, die sich bei irgendwelchen Taster-Impulsen munter verändern.

jojo3
23.10.2006, 16:32
spontan fällt mir auf, das die Ein und Ausgänge mit
config portx.x =output nicht pinx.x= output konfiguriert werden
das gilt auch für die Inputs, den Rest muss ich noch anschauen

Bluesmash
23.10.2006, 17:21
ich denke nicht dass dies mit dem interrupt so funktioniert... durch das prellen des tasters werden auch beim anfahren des motors, wenn der taster wieder freigegeben wird einige flanken am interrupt ankommen und das programm sofort wieder anhalten...

sorry wenn es schon erwähnt wurde... habe nicht den ganzen tread genau gelesen...

gruss bluesmash

eIdea
25.10.2006, 09:46
Ich habe jetzt mal komplett die INTs weggelassen und die Wait-Routinen, die bestimmten, wie lange ledaux high bleiben soll, durch folgenden Schnipsel ersetzt:
Debounce Motor , 1 , Motoraus1
Motoraus1:

an der 2. Stelle heißen die Label motoraus2, damit es eindeutig bleibt.
Aber ncihtmal dies funktioniert.. Obwohl es ohne problemlos funktioniert.. die Batteriespannung ist ok (9V Netzteil) der Anlaufstrom kann nicht zu hoch sein (Netzteil schafft 1,2A, es funktioniert ohne Taster ja)...

Ich habe keine Ideen mehr, muss ich mich halt damit abfinden, dass es nicht klappt

Vielen dank für eure Hilfe =D>

Bluesmash
25.10.2006, 21:19
probier doch mal folgendes (pseudocode):



do
if start=0 then
motor=1
waitms 200
end if

if motor = 1 and taster=0 then
stop motor
end if
loop

Vitis
26.10.2006, 02:12
wie schauts aus mit Freilaufdioden?
Wie haste den Brown out eingestellt, evtl. diefer
setzen?

eIdea
27.10.2006, 13:45
Hab jetzt ne Freilaufdiode (1N4007 antiparallel zum Motor) eingebaut und das Programm stürzt nicht mehr so leicht ab, aber dennoch zuckt der Motor nur, sobald er was machen soll.

BoD steht auf 1,7V

Vitis
27.10.2006, 14:14
Man müsste in den Schaltplan schauen ob sich da noch was
eingeschlichen hat ... haste zufällig n Speicheroszi
um die Eingangsspannung mal anschauen zu können?
Einbrüche, Spitzen etc. Auch die Beschaltung des Reset währ wichtig
zu sehen ... oder mal einfach Bilder vom Gesamtaufbau hier rein
stellen, evtl. sieht man da nen Schwachpunkt

eIdea
27.10.2006, 15:03
Ich habe zwar nen Oszi, aber leider kein Speicheroszi...

Hier ist der Schaltplan (ohne LCD):

haus51
03.11.2006, 13:01
Dumme Frage
Warum sind die Taster auf + und die Widerstände auf GND ?
Normal ists andersrum
Intern sind die Pullups auf + - extern auf -
Oder hab ich was überlesen?
Gruß
Günther

Movie85
07.08.2008, 21:45
Hi,
man könnte doch einfach etwas warten, bevor der Taster eine Reaktion auslösen kann.
Wenn der Motor z.B. um die 4sec braucht, um sich einmal zu drehen, könnte man ja erst 1 Sekunde warten, und dann, wenn der Taster gedrückt wird, den Motor stoppen.




If Starttaster = 1 then
Motorport = 1
Wait 1
Do
Motorport = 1
Loop Until Stoptaster = 1
Motorport = 0
Else
Motorport = 0
End If


Oder etwas ähnliches.

MFG

Movie

Edit: Ach du schei**! Hab das Verfassungsdatum völlig überlesen! Sorry!