Archiv verlassen und diese Seite im Standarddesign anzeigen : Gabellichtschranke ink Inkrementierungsscheibe
Hy
hab ein Problem und zwar möchte ich einen Motro wo hinten eine Inkrementierungsscheibe mit einem gabellichtschranke sitzt steuern.
Funktionen "Taste an"
Motor beginnt sich zu drehn bis zu einem definierten wert (zb. Gabellichtschranke nach 800 impulsen) dann motor stopp!
Funktion "Taste aus"
Motor dreht in die andere richtung (wieder bis zu 800 impulsen ) dann stopp.
also motoransteruern und gabellichtschranke auslesen ist kein problem, aber wie sag ich
stopp nach 800 impulsen vom Gabellichtschranke?!
hab schon bisschen im forum gestöpert und das gefunden was mir helfen könnte
----------------------------------------------
$regfile = "2313def.dat"
$crystal = 7372800
$baud = 19200
Dim Zaehlerirq0 As Long
Config Pinb.2 = Output
Portb.2 = 0
Zaehlerirq0 = 0
On Int0 Irq0
Enable Int0
Config Int0 = Falling
Enable Interrupts
'------------------------------------------------------------
Do
If Zaehlerirq0 > 120 Then
Portb.2 = 1
Wait 2
Portb.2 = 0
Zaehlerirq0 = 0
End If
Waitms 50
Loop
End
'------------------------------------------------------------
Irq0:
Incr Zaehlerirq0
Return
--------------------------------------------------
EDIT: Bitte um Code-Tags ! (PicNick)
leider blick ich nicht ganz durch
(is aus https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=17088&highlight=gabellichtschranke)
danke für eure hilfe
bei interesse könnt ich euch noch ein foto vom motor mit inkrementierungsscheibe reinstellen
mfg
piri
ok werd das nächste mal den code so reinstellen.
hmm
wo könnt ich mich über die funktionen informieren die ich brauche?!
brauch nen timer der nach einer gewissen zeit sagt stopp
aber der timer müsst abhängig sein vom optokoppler der an irgeneinen pin hängt.
steh echt irgendwie an!
bitte um hilfe
mfg
Willst Du das jetzt nach 800 Impulsen stoppen oder über den Timer?
Stell mal Dein Programm hier rein das Du bis jetzt schon hast.
So hab mal alles zusammengefasst was ich bis jetzt hab
nur diese schleifen machen mir kopfzerbrechen, immer diese abfragen
und woher weiß ich ob die ifschleife dann richtig springt?!
sorry für so fragen aber ich bin recht neu auf diesem gebiet, für mich wär das programm im ganzen recht logisch bis auf diese spünge, oder irre ich?!
hab das ganze mal so ausgelegt damit das rolo bei tastendruck mal hochfährt bis zu einen festgelegten wert (800 zählimpulse vom Gabellichtschranken)
für ne 2.taste brauch ich eigentlich auch noch nen 2. ausgang weil ein knopf is rauf der andre runter, und da ein ausgang nur 0 bzw 1 hat würd er ja eventuell irgendwas machen wenn keine taste gedrückt is
d.h. wird dann ein 2. ausgang verwendet der den motor in die andre richtung fahren lässt.
was meint ihr daweil zu diesem programm?!
hab es noch nicht aufn avr gespielt weil ich mir auch noch über die beschaltung des gabellichtschranken ein bisschen gedanken machen muss
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinb.1 = Input
Config Pinb.2 = Output
Do
If Pinb.1 = 1 Then / / Taste Gedrückt
Portb.2 = 1 / / Rolo Fährt Hoch
Else
Portb.2 = 0 / Rollo Macht Nichts Da Keine Taste Gedrückt
Loop
Irq0 = 0 / / Zähler Wird Initialisiert
inc irq0
Do
If Irq0 > 800 Then / / Wenn Der Zähler 800 Erreicht Hat
Portb.2 = 0 / / Motor Stopp
Irq0 = 0 / / Zähler Wird Zurückgesetzt
Loop
End
danke für jeden tipp bzw verbesserungsvorschlag
mfg
piri
Also im jetzigen Zustand funktioniert da gar nichts.
Hast Du schon einmal versucht das Programm mit Bascom zu compilieren?
Da kommt eine ganze Latte von Fehlermeldungen.
Fangen wir mal mit dem wichtigsten an:
Bemerkungen musst Du mit ' eintragen
Die erste Do-Loop-Schleife wird nie verlassen da eine Bedingung fehlt wann die Schleife verlassen werden soll (DO-LOOP-UNTIL).
Im jetzigen Zustand würde sich der Motor nur bewegen solange Du die Taste gedrückt hältst.
Wäre es nicht vernünftiger Du machst die ganze Sache mit Endlagenschalter statt mit einer Gabellichtschranke? So funktionieren nämlich normalerweise Tor- und Rolladensteuerungen.
danke für das mitwirken, hab dadurch schon einiges verbessern können!!!
das mit den endtastern hab ich mir anfangs auch überlegt!
da aber das nur eine nachrüstung von so sstandraad rolos sind die in der scheibe liegn und nur durch ein seil mechanisch betätigt werden ist es technisch bisschen schwieriger zu realisieren.
sicherer ist sicher der motor & inkrementierungsscheibe! bekomme die motoren noch von einem freund aus technischen geräten gratis zu verfügunggestellt.
hab mir das mit den kommentaren und den schleifen noch mal angeschaut und eventuell auch ein bisschen verbessert
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinb.1 = Input
Config Pinb.2 = Output
Config Int0 = Rising
Do
Abfrage: 'hier wird abgefragt ob eine taste gedrückt ist
If Pinb.1 = 1 Then ' wenn pinb.1 gedrückt dann in die Rauf routine
Goto Rauf
Else
Portb.2 = 0
Goto Abfrage
End If
Rauf:
Pinb.2 = 1 'motor fährt rauf
Incr Irq0
If Irq0 > 800 Then
Portb.2 = 0 'wenn 800 impulse ereicht sind dann stop TIRQ0
Else
Goto Rauf
Loop
habs mal compeliert
4 fehler
you can not write to a pin register // hab doch pinb.2 als ausgang definiert?!
Invalid datatype?!
wrong datatype (irq0) // das es probleme mit diesem zähler gibt hab ich mir schon gedacht
hat noch wer tipps übrig
+
mfg
piri
[edit zeilenumbruch]
Portb.2 = 0
ersetze mal mit
reset Pinb.2
ebenso
mit Set,
statt mit direkter Zuweisung, dann sowieso mit "Pin" nicht mit "Port"
Bedenke:
Pin Operationen mit PinX.x nicht mit PortX.x !!!!
Die Variable irq0 haste nicht defeniert, muss Word sein, weil grösser 255 werden kann.
Gruß
so danke für die info
aber wieso ist pinb.1=1 & set pinb.1 nicht das selbe?!
naja wurscht hab wieder was gelernt nehm mal an befehle gehn nur so abfragen gehn mit pinb.1=x
sollt eigentlich passen!!
hab das fehlende end if auch richtig gesetzt.
hab da noch fragen:
1. bei der rauf routine
ist pinb.2 solange gesetzt bis die 800 impulse über den irq0 reinkommen oder is das eher so ne rucklige sache, stopp go oder fährt der motor ganz flüssig?!
2. hab die zähler init routine implementiert bzw definiert, bin mir jetzt nur nicht ganz sicher ob die in die rauf routine ghört oder überhaupt am anfang in die komplette schleife, weil sonst wird sie ja nur einmal abgefragt und sonst nie wieder
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinb.1 = Input
Config Pinb.2 = Output
Dim Irq0 As Word
Irq0 = 0
On Int0 Irq0
Enable Int0
Config Int0 = Rising
Enable Interrupts
Do
Abfrage: 'hier wird abgefragt ob eine taste gedrückt ist
If Pinb.1 = 1 Then ' wenn pinb.1 gedrückt dann in die Rauf routine
Goto Rauf
Else
Reset Pinb.2
Goto Abfrage
End If
Rauf:
Set Pinb.2 'motor fährt rauf
Incr Irq0
If Irq0 > 800 Then
Reset Pinb.2 'wenn 800 impulse ereicht sind dann stop TIMER0
Else
Goto Rauf
End IF
Loop
danke für tipps und anregungen
fühl mich mit meinen avr schon so gut O:)
mfg
piri
Also 'ne Interupt-Serviceroutine kann ich irgendwie nicht erkennen, dazu müßte ein eigener Ablaufcode stehen.
Hier wird eine Variable mit dem Namen Irq0 erhöht, hat das was mit dem Eingang Int0 zu tun, [-( nööööööö
so hab das ganze nochmal überarbeitet
der inc irq0 is aus der abfrage geflogen, weil irq0 ja sowieso immer ausgelöst wird wenn was anliegt! (denk ich halt mal so war das vorher gemeint)
also eigene "routine" für irq0
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinb.1 = Input
Config Pinb.2 = Output
Dim Irq0 As Word
Irq0:
Incr Irq0
Return
Do
Abfrage: 'hier wird abgefragt ob eine taste gedrückt ist
If Pinb.1 = 1 Then ' wenn pinb.1 gedrückt dann in die Rauf routine
Goto Rauf
Else
Reset Pinb.2
Goto Abfrage
End If
Rauf:
Set Pinb.2 'motor fährt rauf
If Irq0 > 800 Then
Reset Pinb.2 'wenn 800 impulse ereicht sind dann stop TIMER0
Else
Goto Rauf
End IF
Loop
mfg
piri
Jetzt ist der Interupt nicht Declariert und nicht freigegeben. Dann muß die Interuptserviceroutine hinter, unter dem eigentlichem Program stehen, sonst wird sie , wie hier, im Program mit aufgerufen.
Sieht man im Simulator : Int0 nicht anwählbar. Wieder [-( nöööööö :-)
so hoff ich hab dich richtig verstanden
int0 routine in der schleife!
und init fürn interrupt is auch wieder drinnen
----------------------
also fürs verständnis bei programmstart wird der interrupt sozusagen freigeschalten bzw initaliert damit er überhaupt anwählbar ist
und in der schleife wird er immer abgefragt
aber wird er jetzt immer abgefragt?!
dachte int0 gibt bei jedem signal selbst zur int0 routine weils ja ein interrupt ist?!
könnt ja dann auch gleich nen eingang die ganze zeit abfragen und erhöhen lassen oder ist das zu unsicher bezüglich der frequenz?!
---------------------
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinb.1 = Input
Config Pinb.2 = Output
Dim Irq0 As Word
Irq0 = 0
On Int0 Irq0
Enable Int0
Config Int0 = Rising
Enable Interrupts
Do
Irq0:
Incr Irq0
Return
Abfrage: 'hier wird abgefragt ob eine taste gedrückt ist
If Pinb.1 = 1 Then ' wenn pinb.1 gedrückt dann in die Rauf routine
Goto Rauf
Else
Reset Pinb.2
Goto Abfrage
End If
Rauf:
Set Pinb.2 'motor fährt rauf
If Irq0 > 800 Then
Reset Pinb.2 'wenn 800 impulse ereicht sind dann stop TIMER0
Else
Goto Rauf
End If
Loop
mfg
Und geht das Program im Simulator? Schätze mal nicht ausprobiert.
Wenn ich Prozessor bin, starte ich in der ersten Zeile, laufe weiter komme dann irgendwie auf die Routine :
Do
Irq0:
Incr Irq0
Return
Nur, wohin soll ich dann springen wenn ich Return gefunden habe, Return bedeutet: springe zurück an die nächste Anweisung nach dem Aufruf, (steht im Stack), nur mich hat niemand aufgerufen, also steht nichts im Stack.....
also stop ich die Prorammausführung, bzw springe nach Nirwana...
deshalb gehört die IRQ-Routine, wie alle Unterprogramme hinter, bzw. nach dem Hauptprogram im Code
aber mach dich nicht fertig, das übt, und das vergißt man dann auch nicht so schnell wieder. :-)
ok stimmt return ist das fehl am platz
war da glaub ich zu schnell
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinb.1 = Input
Config Pinb.2 = Output
Dim Irq0 As Word
Irq0 = 0
On Int0 Irq0
Enable Int0
Config Int0 = Rising
Enable Interrupts
Do
Irq0:
Incr Irq0
Abfrage: 'hier wird abgefragt ob eine taste gedrückt ist
If Pinb.1 = 1 Then ' wenn pinb.1 gedrückt dann in die Rauf routine
Goto Rauf
Else
Reset Pinb.2
Goto Abfrage
End If
Rauf:
Set Pinb.2 'motor fährt rauf
If Irq0 > 800 Then
Reset Pinb.2 'wenn 800 impulse ereicht sind dann stop TIMER0
Else
Goto Rauf
End If
Loop
jetzt müsst der interrupt aber funktionieren?!
noch ne frage die ich vorher vergessen hab
wo simulierst du das ganze
gibts da ein eigenes programm oder geht das auch mit bascom
wo ich dann taster und zb leds für die ausgänger hab?!
großes dank an euch!!!
mfg
Nee, Return ist schon nicht schlecht :-) Die Interuptroutine steht insgesamt falsch.
Den Simulator findest du als 4tes Icon neben dem Fernglas.
Das ist das Werkzeug schlechthin, das mußt du benutzen, läuft es im Simulator, läuft es auch im wirklichem Leben :-) , meistens.
Beachte: Ports, LCD usw findest du oben in der Zusatzauswahl. Damit mußt du dich auskennen lernen.
Schonmal aufgemerkt: Ports nur in den grünen LED's betätigen, und das Ergebniss dessen, nur im Einzelschritt ist "DIRECKT" im Sprungverhalten des Codes erkennbar.
So, das mußt du erst einmal ausprobieren. Nimm aber Codes die funktionieren, sonst verwirt dich noch ALLES.
Simulator ist ein MUSS, das Werkzeug schlechthin !!!!
hy ich nochmals
hab schon wieder das gefühl einen funktionstüchtigen code produziert zu haben, hab mich nochmal im datenblatt schlau gemacht
hab mal die ein/ausgänge auf die pinc verlegt
und pind2 also int0 (was eh so is, aber bisschen neu)
hab alle teile vom code übersichtlichkeitshalber total getrennt, is glaub ich so einfacher & richtiger?!
hab das ganze auch getestet springt richtig
also vom programmablauf richtig
meine einzige sorge der irq0:
also bei jeden interrupt also impuls auf pind.2 erhöht irq0 um 1 bis irq0 800 erreicht hat und springt zum sprung halt!? würd das so passen?!
hier mal der aktuelle code
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinc.1 = Input
Config Pinc.2 = Output
Config Pind.2 = Input
Dim Irq0 As Word
'' Interrupt Int0 config
On Int0 Irq0
Config Int0 = Rising
Enable Int0
Enable Interrupts
Do
''abfrage ob taste gedrückt
Abfrage:
If Pinc.1 = 1 Then
Goto Rauf
Else
Goto Halt
End If
Loop
'' bei interrupt auf pinb.2 dann erhöhen bis 800 erreicht ist
Irq0:
Incr Irq0
If Irq0 > 800 Then
Goto Halt
Else
Goto Rauf
End If
'' wenn 800 impulse ereicht dann motor stopp
Halt:
Reset Pinc.2
Return
'' wenn 800 interruptimpulse noch nicht erreicht sind motor läuft weiter
Rauf:
Set Pinc.2
Return
;-)
danke fürs durchschauen
eventuell werd ich das ganze für die funktion runter morgen erweitern.
Simulator benutzt =; ? ----> dann hättest du Fehler bemerkt.
Setze mal vor '' wenn 800 impulse ereicht dann motor stop
ein Return
und
ersetze mal Goto mit Gosub
dann läuft das Program wenigstens, ob es deine Aufgabe richtig abarbeitet::: =P~ =P~ =P~ Simulieren Simulieren
Nachtrag:
Habe mal durchsimuliert, IRQ0 >1 gesagt, funzt, nur würde ich diesen Vergleich in die Hauptschleife legen, und nicht in die IRQ-Routine zumal die Variable ja auch nirgendwo wieder zu 0 gemacht wird.
schau mir das ganze nochmal an
aber bei goto hat der simulater bei mir zumindest funktioniert und is vom hauptprogramm in die rauf oder halt routine gesprungen?!
oder hab ich was falsch gmacht
bei timer hab ich nicht wirklich gwußt wie ich den testen kann
gibt es dafür ne abhilfe in bascom?!
mfg
piri
aber bei goto hat der simulater bei mir zumindest funktioniert und is vom hauptprogramm in die rauf oder halt routine gesprungen?!
Dein Programm hat aber nur einen Durchlauf gemacht und ist dann stehen geblieben. Normalerweise muss ein Programm in einem Microcontroller eigentlich immer irgend etwas machen und sollte nie stehen bleiben.
Ein Return-Befehl macht übrigens nur nach einem Gosub einen Sinn, nicht nach einem Goto.
danke an die vielen nützlichen zeit, hab in kürzerster zeit schon eine menge über bascom & mega8 gelernt ;-))))
hab das programm nochmals ein wenig verändert, und zwar hab ich mir den tipp mit irq abfrage ins hauptmenü zu herzen genommen, macht eigentlich auch mehrs sinn das der mega8 ständigt schaut ob 800 impulse erreicht sind und nicht nur nach einem int0 impuls
hier mal version neu
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinc.1 = Input
Config Pinc.2 = Output
Config Pind.2 = Input
Dim Irq0 As Word
'' Interrupt Int0 config
On Int0 Irq0
Config Int0 = Rising
Enable Int0
Enable Interrupts
Do
''abfrage ob taste gedrückt & Kontrolle ob irq0 noch nicht über 800
Abfrage:
If Pinc.1 = 1 Then
Gosub Rauf
Else
End If
If Irq0 > 800 Then
Gosub Halt
End If
Loop
'' bei Int0 wird irq0 um 1 erhöht
Irq0:
Incr Irq0
Return
'' wenn 800 impulse ereicht dann motor stopp
Halt:
Reset Pinc.2
Irq0 = 0
Return
'' wenn 800 interruptimpulse noch nicht erreicht sind motor läuft weiter
Rauf:
Set Pinc.2
Return
hab es auch simuliert, hat zwar einige zeit gedauert bis ich die sache mit int0 simulieren draußen hatte, aber! es funktioniert!
hab es testweise 800 durch 5 ersetzt und siehe da es funktioniert nach den impulsen wird irq0 gesetzt sonst is ja blöd wenn irq0 ins endlose zählt und nach tastendruck immer gleich wieder stopt.
so werd mich demnächst ans zamstöpseln der teile machen
motor mit gabellichtschranke & mega8 hab ich ja schon
muss mir nur anschaun wie ich die teile am besten beschalte
mfg
piri
Naja, bist auf einem guten Weg.
Wenn du den Simulator richtig anwenden kannst, dann ist schon viel gewonnen, die meisten Fehler kann mann da schon gut erkennen. Die Einzelstep und Schleifenfunktion ist schon geil.
hy hab das programm in den mega8 geladen
nur es funktioniert nicht?!
taster is ein kleiner taster
ausgang derzeit ne led an 200ohm gegen masse
interupt eingang noch nicht getestet.
so, jetzt zu den fehler.
hab alles mögliche probiert sogar ne zusätzliche abfgae eingebaut damit der taster echt nur bei gegen masse funktion hat
mit pullup widerstand gegen +5 am taster auch schon probiert
port & pin getestet, wobei ich noch immer nicht genau weiß was der unterschied is, funktioniert jedenfalls im simulator ohne probleme!!!
sogar ne debounce eingebaut, aber hat nie richtig im simulator funktioniert.
bitte hilfe, es kann ja nicht sein das programm im avr richtig funkt & im mega 8 nicht.
led leuchtet nie!!!!!!!!!!!!!!!!!
mega 8 sollte funktioniern da schon ein testprogramm für display ansteuerung gefunkt hat
hier das aktuelle programm
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinb.2 = Input
Config Pinb.1 = Output
Config Portb.2 = Input
Dim Irq0 As Word
'' Interrupt Int0 config
On Int0 Irq0
Config Int0 = Rising
Enable Int0
Enable Interrupts
Do
''abfrage ob taste gedrückt & Kontrolle ob irq0 noch nicht über 800
Abfrage:
If Pinb.2 = 0 Then
Waitms 250
End If
If Pinb.2 = 0 Then
Gosub Rauf
End If
Waitms 20
If Irq0 > 5 Then
Gosub Halt
Else
End If
Loop
'' bei Int0 wird irq0 um 1 erhöht
Irq0:
Incr Irq0
Return
'' wenn 800 impulse ereicht dann motor stopp
Halt:
Irq0 = 0
Reset Pinb.1
Waitms 100
Return
'' wenn 800 interruptimpulse noch nicht erreicht sind motor läuft weiter
Rauf:
Set Pinb.1
Waitms 100
Return
mfg
piri
kleines update
hab da programm jetzt so geändert damit es auf tastendruck funktioniert.
nur der gabellichtschranke macht probleme, led (motor) geht nach x impulsen nicht aus.
wenn ich den int0 mit finger berühre funktionierts, also dürft vielleicht das ganze nicht mit gabellichtschranke funktionieren?!
gabellichtschranke gp1a73e http://document.sharpsma.com/files/gp1a73a_e.pdf
hab sie mit ausgang (47k) gegen 5v und vcc (330ohm) gegen 5v beschalten
vielleicht funkt das gar nicht mit gp1a73
mfg
piri
danke für tips
aktuelle code, mit veränderungen, hab die veränderungen teilweise aus andren codes kopiert, weil mit denen zumindest die led an funkt!
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinc.2 = Input
Config Portb.1 = Output
Dim Irq0 As Word
'' Interrupt Int0 config
On Int0 Irq0
Config Int0 = Falling
Enable Int0
Enable Interrupts
Do
''abfrage ob taste gedrückt & Kontrolle ob irq0 noch nicht über 800
Abfrage:
If Pinc.2 = 0 Then
Gosub Rauf
End If
Waitms 100
If Irq0 > 2 Then
Gosub Halt
Else
End If
Loop
'' bei Int0 wird irq0 um 1 erhöht
Irq0:
Incr Irq0
Return
'' wenn 800 impulse ereicht dann motor stopp
Halt:
Irq0 = 0
Portb = &B00000000
Waitms 100
Return
'' wenn 800 interruptimpulse noch nicht erreicht sind motor läuft weiter
Rauf:
Portb = &B11111111
Waitms 100
Return
Config Pinb.2 = Input
Config Pinb.1 = Output
Config Portb.2 = Input
Warum Portb.2 nochmal konfigurieren?
Laut Datenblatt hat der VCC-Anschluss 5 Volt - ohne 330 Ohm, hat eigene Stromquellenschaltung.
'' Interrupt Int0 config
On Int0 Irq0
würde ich vor " Do " setzen.
Probier mal aus.
hy
so hab ma das nochmal angschaut also
@ stromi
' Interrupt Int0 config
On Int0 Irq0
steht doch eh vor do
oder muss man die flanke nicht nehmen falling/rising?
jedenfalls hab ich ma mal dacht wenn ich schon ein lcd hab, dann lass ich mal den irq0 anzeigen, gut ein paar programmzeilen eingebaut:
hängt nix & berührung mit finger zählt er hoch teilweise schon wenn ein kabel hängt.
häng ich den optokoppler ausgang dazu, bleibt er stehen und zählt nix, auch dann nicht wenn impulse kommen sollten
häng ich den widserstand von int0 gegen vcc tut sich das selbe nichts
also überhaupt keine zählung
ich denk mal es liegt an dem optokoppler, wie könnte man den am besten ohne avr testen, hab leider nur so ein mist messgerät das ströme >30ma nur schlecht anzeigt oder gar nicht, bzw beim diodentest bin ich mir auch nicht sicher
aber müsste eigentlich mit einer led am ausgang vomoptokoppler funktionieren?! led dann wieder mit47k gegen vcc??
mfg
piri
aja hier code inklusive int0 auswertung am display
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Config Pinb.2 = Input
Config Portb.1 = Output
'LCD-Ausgabe
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcd = 16 * 2
'' Interrupt Int0 config
Config Int0 = rising
On Int0 Irq0
Enable Interrupts
Enable Int0
Dim Irq0 As Word
Do
Cls
Cursor Off
Lcd Irq0
Print
''abfrage ob taste gedrückt & Kontrolle ob irq0 noch nicht über 800
Abfrage:
If Pinb.2 = 0 Then
Gosub Rauf
End If
Waitms 100
If Irq0 > 250 Then
Gosub Halt
Else
End If
Loop
'' bei Int0 wird irq0 um 1 erhöht
Irq0:
Incr Irq0
Return
'' wenn 800 impulse ereicht dann motor stopp
Halt:
Irq0 = 0
Portb = &B00000000
Waitms 100
Return
'' wenn 800 interruptimpulse noch nicht erreicht sind motor läuft weiter
Rauf:
Portb = &B11111111
Waitms 100
Return
Kann es sein dass du verschiedene Betriebsspannungen hast, oder nicht die gleiche Masse?
Verdrahtung:
Von 5Volt=Vcc-->[=4,7k=]-->Collektor_Lichtschranke ; Emitter an Masse.
Der Anschluß Collektor_Lichtschranke ist der IRQ-Anschluß, Emitter ist auch an der Controller-Masse.
Program:
On Int0 Irq0
habe ich "nach der Interuptfreigabe schreiben" gemeint.
Dein IRQ ist bei der Subroutine Halt zu 0 gemacht, dann wird aber ein neuer Durchlauf gemacht, dabei wird festgestellt, dass IRQ< 800 ist also: Motor wieder an. Wirst du nicht wollen :-)
Bei dem Unterprogram Halt muss dann dein Motor dauerhaft aus bleiben, oder der Motor dreht dann um, oder oder anders....
Ich würde auch nicht so etwas schreiben
Config Pinb.2 = Input
Config Portb.1 = Output
entweder die Methode oder eine andere, aber dann dabei bleiben, nicht mischen:
bei Config Pind.1=..... verwende ich Set oder Reset Pind.1, nicht mit binären Zuweisungen von ganzen Ports
das "mischen" ist einfach zu Fehlerbehaftet.
Aber ich bin auch kein Profi...nur Bastler.
ok bin jetzt 2 abende gesessen und hab gemessen und mich im web auf diversen seiten informiert.
aber irgendwie find ich auf meine anomalie keine lösung.
diese beschriebene gabellichtschranke arbeitet irgenwie ganz komisch!!!!!
hängt auf vcc und gnd//
+5v am ausgang
wenn man jetzt zwischen die scheiben was durchschiebt ändert sich nix
+v5 am ausgang
verdunkel ich aber die umgebung oder schließ die gabellichtschranke in eine box is am ausgang fast
0V?! am ausgang
wie is das möglich, falsch beschlaten?! vout & vcc vertauscht?! ?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!
Laut deinem geposteten Datenblatt gibt es zwei Anschlussmöglichkeiten:
GP1A73A hat an 1 Gnd 2 Vout 3 VCC
GP1A73A1 hat an 1 Vcc 2 Vout 3 Gnd
Haste das kontrollettie?
hy danke für die schnelle info.
aber das mit den licht hat mich so verunsichert das ich im web nochmal nach datenblätter gsucht hab. und siehe da es gibt auf eine gp1s73 http://www.ortodoxism.ro/datasheets/Sharp/mXvtxwx.pdf und die verändert natürlich alles.
es funktioniert!!! ;-)
jedenfalls der timer zählt jetzt nur wenn der motor läuft! (also lichtschranke arbeitret)
muss glaub ich noch das programm ein bisschen verbessern, es wird teilwiese der ausgang gesetzt ohne den taser gedrückt zu haben, komische sache, werd mal ne doppelte tastenabfrage einbaun (störsicherheit)
sowie die abfrage für taste runter fehlt auch noch
werd mich bei weiteren erfolg wieder bei euch melden und posten wie es weitergangen is!
;-)
danke @ll für die hilfe!
mfg
piri
molleonair
18.05.2006, 21:37
no show...........
hab jetzt eigentlich nur noch ein problem & zwar wird der ausgang ab & zu selber gesetzt ohne das ne taste gedrückt wird bzw ein interrupt impuls auslöst?!
hat wer ne idee
aktuelle code, hab sogar ne doppelte abfrage drinnen aber komischer weise gehts noch immer nicht.
hilft da vielleicht der debounce befehl?
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Set Pinb.2
Config Pinb.1 = Output
'LCD-Ausgabe
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcd = 16 * 2
'' Interrupt Int0 config
Config Int0 = Falling
On Int0 Irq0
Enable Interrupts
Enable Int0
Dim Irq0 As Word
Do
Cls
Cursor Off
Lcd Irq0
Print
''abfrage ob taste gedrückt & Kontrolle ob irq0 noch nicht über 800
Abfrage:
If Pinb.2 = 0 Then
Waitms 250
If Pinb.2 = 0 Then
Gosub Rauf
Else
Gosub Halt
End If
End If
Waitms 100
If Irq0 > 6 Then
Gosub Halt
Irq0 = 0
Else
End If
Loop
'' bei Int0 wird irq0 um 1 erhöht
Irq0:
Incr Irq0
Return
'' wenn 800 impulse ereicht dann motor stopp
Halt:
Portb = &B00000000
Waitms 100
Return
'' wenn 800 interruptimpulse noch nicht erreicht sind motor läuft weiter
Rauf:
Portb = &B11111111
Return
Hast Du womöglich irgendeine Störeinstrahlung z.B. von einem Handy oder Schnurlostelefon das in der Nähe liegt?
hy leute
hab mir gestern den l293d vom c geholt und heute alles mal zusammengestöpselt.
http://focus.ti.com/lit/ds/symlink/l293d.pdf
der en eingang vom 293 hängt über 10k auf vcc (5v)
die motoransteuerung erfolgt über pd5/ pd6
in das programm hab ich ne zusätzliche abfrage für einen 2. taster eingebaut bzw das programm mit einer "rolo runter" subroutine erweitert
das ganze arbeitet eigentlich so wie es soll, nur ab & zu schaltet sich der motor ein, hab mal ein handy hingehalten und nen anruf getätigt aber da tut sich nichts, denk mal es liegt eventuell an der verdrahtung, da noch alles ein bisschen kreuz & quer liegt.
jedenfalls es funktioniert mal im groben so wie ich mir das seit langem gedacht hab.
taste 1 // motor links
taste2 // motor rechts
hier mal das programm
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000
Set Pinb.2
Set Pinb.1
Config Pind.5 = Output
Config Pind.6 = Output
'LCD-Ausgabe
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcd = 16 * 2
'' Interrupt Int0 config
Config Int0 = Falling
On Int0 Irq0
Enable Interrupts
Enable Int0
Dim Irq0 As Word
Do
Cls
Cursor Off
Lcd Irq0
Print
''abfrage ob taste gedrückt & Kontrolle ob irq0 noch nicht über 800
Abfrage:
If Pinb.2 = 0 Then
Waitms 250
If Pinb.2 = 0 Then
Gosub Runter
Else
End If
End If
Waitms 100
If Pinb.1 = 0 Then
Waitms 250
If Pinb.1 = 0 Then
Gosub Rauf
Else
End If
End If
Waitms 100
If Irq0 > 10 Then
Gosub Halt
Irq0 = 0
Else
End If
Loop
'' bei Int0 wird irq0 um 1 erhöht
Irq0:
Incr Irq0
Return
'' wenn 800 impulse ereicht dann motor stopp
Halt:
Reset Portd.5
Reset Portd.6
waitms 100
Return
'' wenn 800 interruptimpulse noch nicht erreicht sind motor läuft weiter
Rauf:
Set Portd.5
Reset Portd.6
Waitms 100
Return
Runter:
Reset Portd.5
Set Portd.6
Waitms 100
Return
werd dem nächst den motor aufs fenster montieren und das rolo montieren, muss mir noch ein bisschen gedanken machen über die montierung.
eventuell werd ich vielleicht doch noch endschalter einbaunen sicherheitshalber, oder vielleicht genügt es ja wenn ich abgeschiermte leitungen verwende um störsignale zu vermeiden.
jedenfalls ein dank an alle die mir bei der realisierung geholfen haben!!!
hab in einem monat echt viel über meinen mega8 dazugelernt!!!! ;-))))
mfg
piri
ps. weitere dokumentation folgt!
Sind das fertige Rolladenmotore oder baust du die Motorengeschichte selbst?
Käufliche Motoren sind Wechselstrommotore.
War das dein fertiges Program oben, die Irq-Variable paßt?
Gibt einiges zu verbessern:
Also, die Tasterabfrage würde ich mit
DEBOUNCE Px.y , state , label [ , SUB]
machen, da der Taster dadurch entprellt wird.
Dann würde ich den Watchdog benutzen:
CONFIG WATCHDOG = time
steht einiges in der Hilfe über die Befehle.
Gibt immer was zu verbessern :-)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.