Hallo ne FRage zu einem kleinen projekt und zwar möchte ich mit einen mega8 meine rolos rauf und runter fahren lassen! zur hardware 4 Motoren (12V) die hinten einen optokoppler obensitzen haben d.h. bei jeder drehung kann man messen wo der motor steht. mein problem: wie sag ich das dem mega8?! also die motoren könnt ich jeweils mit einen transistor bzw relais auf +12 bzw -12V ziehen jenachdem obs rauf oder runter gehn soll, aber wie sag ich dem mega8 das er angenommen nach zb 800impulsen vom optokoppler stehen bleibt (also in meinem fall optokoppler auf der rückseite sind gleichzeitig endwertschalter) hat wer nen tipp?! mfg piri
L293 oder ähnliches zur Motorsteuerung, die Impulse zählen damit man die Rollos zu einem definierten Punkt fahren kann, die Endschalter sind ja klar. Wenn du L293E nimmst ist ein Shunt bereits vorgesehen zur Auswertung falls ein Rollo mal klemmt damit der Motor nicht abbrennt. Der Hardwareaufwand hält sich da in Grenzen und die Software ist ohne zeitkritische Punkte. Fallst du Anfänger bist etwas viel aber mit etwas Geduld und einigen Übungsbeispielen aus dem Tutorial doch zu schaffen. Am besten in Teile zerlegen, z.B. Endschalter auswerten, Impulse zählen, Motor ansteuern, Shunt auswerten usw. und dann zusammenfügen.
@Alex Piri >aber wie >sag ich dem mega8 das er angenommen nach zb 800impulsen vom optokoppler >stehen bleibt du koenntest z.B den Input Capture Pin des Atmel benutzen; in Deinem Programm dann eine passende Interrupt-Routine erstellen und dort eine Variable hochzählen. Du kannst über Register einstellen wann der InputCapture Interrupt aktiv werden soll (steigende, fallende Flanke); so kannst Du dann z.B. bei jedem positiven Flankenwechsel Deine Variable hochzählen --> bei 800 bleibt der Motor stehen ..... Beim Atmega8 wäre dies PIN PB0 (ICP1) Mehr dazu Atmega8 Datenblatt (complete) S.81 -fs-
Mit welcher Frequenz kommen denn die Signale vom Motor? Sind die Signale garantiert prellfrei? Das entscheidet nämlich darüber, auf welche Art die Impulse gezählt werden können. ...
danke für die tipps, der l293 schaut schon mal gut aus, hab mir eh schon gedanken gmacht wenn irgendwas blockiert oder so das dürfte dann mit dem ic kein problem sein. die frequenz vom optokoppler is immer gleich da die scheibe genau hinterm motor sitzt und der mit konstanter drehzahl dreht; entprellt?! kann ich nicht sagen is ein optokoppler wo so eine reasterscheibe durchläuft (einmal schwarz dann durchsichtige (20fenster)) und der motor dreht in 10sek einmal . also dürft das so ca ne frequenz von 0,5 haben; eventuell irgendsoeinen bauteil der die signale glättet (weiß jetzt nimmer genau wie das heißt integrator oder so) oder direkt auswerten vom optokoppler?! weiß leider nicht ob sie eintprellt sind oder nicht hab mir das mal im datenblatt angeschaut mit INPUT CAPTURE UNIT. also wenn ich das richtig verstanden hab dann is das so ne art zähler der dann bis zu einer definierten variablen zählt, ohne zusätzlich externe beschaltung, da is das datenblatt leider ein bissi zu konfus für mich ;-) das problem mit dem input capture unit is eventuell dass ich insgesamt 4 rolos hab die teilweise unterschiedlich lang laufen d.h. entweder 4 MEGA8 oder ne lösung wie ich jeden Motor einzel messen kann. ziel wäre es alle rolos einzel zu betätigen alle rolos gemeinsam zu betätigen eventuell nen knopf wo die rolos zur hälfte fahrn (das is aber das kleinste problem-- softwaremäßig) bin offen für jeden tipp, weil ich bin schon seit längerem an dieser idee dran und motoren und mega8 hab ich schon nur wären da nicht diese kleinen oder auch großen hürden ;-)) mfg piri
Na wenn die Impulse so langsam kommen, dann kannst du sie im Timer-Interrupt pollen oder besser noch mit der PeDa-Entprellung (im Wiki nach "entprellung" suchen). Damit stehen dir Flags zur Verfügung, mit denen du ganz einfach Softwarezähler steuern kannst. ICP ist dafür eher ungeeignet, ICP ist mehr dazu da, Impulsdauer bzw. Periodendauer zu messen und nicht um Ereignisse zu zählen. ...
ich hab mir das ganze mal angeschaut: 1. da der mega8 2 interrupts hat könnt ich höstens 2 rolos mit einem mega8 betreiben, bzw nur eines da wenn 1 interrupt ausgelöst ist der zweite nicht verarbeitet wird da schon ein interrupt läuft -- hab ich das so richtig verstanden 2. wenn jetzt der interrupt läuft könnt ich gleich über INT0 also PD2 (pin4) die Impulse vom optokoppler auslesen und nach 800 impulsen sagen jetzt is stopp für den motor -- bis jetzt noch richtig?! 3. aber wie kann man jetzt die impulse zählen, immer 1 impuls in ein register dazuaddieren und gleichzeitig abfragen ob das register schon bei 800 ist?! 4. ist es ein problem das ganze in bascom zu programmieren oder is es ratsamewr asembler oder c zu verwenden?! danke für antworten mfg alex
1. Falsch... Denn bei der geringen Frequenz kann man die Lichtschranken pollen. Das gescheiht am besten mit der Entprellroutine von PeDa (Peter Dannegger), aif die ich dich schon weiter oben aufmerksam gemacht habe. Diese Routine entprellt so im Vorbeigehen innerhalb weniger Takte bis zu 8 Eingänge und stellt Flags zur Verfügung, die einen neuen Impuls melden. Daraufhin kann die Mainloop sehr einfach die Impulse zählen. Diese Routine ist eigentlich für das Einlesen und Entprellen von Tastern gedacht, macht dies aber so effizient, dass man auch andere Aufgaben damit erschlagen kann. 2. Falsch... Während eines Interrupts einen Interrupt abfragen? Damit kann ich nicht viel anfangen. Um diese Aufgabe (dein gesamtes Projekt) zu lösen, brauche ich einen Timer-Interrupt. 3. Im Prinzip ja, aber trotzdem falsch, denn ein Register (oder eine SRAM-Zelle) kann nur bis 255 zählen, nach 255 kommt wieder Null. Das ist halt so, wie man mit einem zweistelligen Dezimalzähler auch nur bis 99 zählen kann, danach kommt wieder 0. 4. Für mich wäre das in BASCOM oder C ein Problem, in Assembler aber nicht. Das liegt aber nicht an BASCOM oder C, sondern an mir. ...
Das ganze ist absolut zeitunkritisch. 1. Man arbeitet in einem Interrupt nichts ab, man setzt ein Flag oder dergleichen, verlässt den Interrupt und arbeitet das in der Main-Schleife ab 2. Du kannst sicher jeden Optokoppler aus der main-Schleife abfragen ohne in Zeitprobleme zu geraten. 3. genau so und der Endschalter stellt immer auf 0 oder 800 4. was du am besten kannst, wobei dir hier im Forum bei Assembler und C am schnellsten geholfen werden kann.
ich hab mir die routine einmal angeschaut http://www.mikrocontroller.net/forum/read-4-20549.html#new nur nochmal zum verständnis ich drück angenommen eine taste , in meine fall zb die taste "rollo rauf" gleichzeitig mit diesem tastendruck fährt der motor an also rauf und 2. die interrupt routine zählt die impulse vom optokoppler bis 3. die routine sagt gnug impulse motor aus aber komisch find ich das du meinst die impulse werden in der mainroutine gezählt oder verdreh ich da jetzt was?!
damit ihr mal sehts von welchem motor mit rückseitiger drehscheibe inklusiver optokoppler ich arbeiten möchte hier mal ein foto. wenn sich der motor dreht, dreht sich auch die drehscheibe und fährt die ganze zeit durch den optokoppler, d.h. ich kann die impulse zählen die dann den motor nach x impulsen zum stopp bringt. mfg alex
Ich meinte damit das man keine langen Abläufe in der Interruptroutine durchführt, einen Zähler inkrementieren ist schon OK, die Auswertung des Zählers und eine eventuelle Aktion erfolgt jedoch sinnvoller Weise schon wieder in der mainroutine.
Diese Routine zählt garnix. Sie stellt dir nur Flags (key_press) und Status (key_state) der entprellten Tasten zur Verfügung, die du in der Mainloop in aller Ruhe auswerten kannst. Deine Fragen zeigen mir aber, dass das alles absolutes Neuland für dich ist. Vielleicht solltest du erstmal ein paar kleinere Projekte realisieren. Fang am besten mit dem Tutorial auf dieser Seite an (zweiter Link oben links). Das ist jetzt nicht bös gemeint, aber ich habe den Eindruck, dass wir aneinander vorbei reden. ...
Hubert, wir meinen beide das gleiche. Ich glaube aber nicht, dass Alex das momentan nachvollziehen kann, er denkt noch zu "objektorientiert". Meim AVR sollte man aber etwas dichter an der ("real existierenden") Hardware denken... ...
ja ich weiß selber das ich noch nicht so ein avr wissen hab kann aber schon kleine projrekte aufweisen ausgabe auf ein 2x16 lcd diplay und so standard sachen wie ein blink led, jedoch die mit warte funktion also zeitverschwendung in der rechenroutine. ich denk jedoch ich hab nicht soviel ahnung von c oder asembler hab das bis jetzt mit bascom gelöst . . . ---------- aber zu meinem projekt was mir eigentlich gar nicht so schwer vorstell: zähler inkrementieren und auswertung in der hauptroutine sagt mir schon mehr. also der befehl/tastendruck "rauf" löst (motor und) einen interrupttimer aus und der zählt bis x und gibt es weitrer an die hautroutine die dann daraufhin sagt motor aus ----------- habt ihr vielleicht tipps für übungsbeispiele die mir eventuell den projektaufbau erleichtern
BASCOM ist ein Baukasten. Solange deine Hardware von diesen Bausteinen unterstützt wird, siehst du den schnellen Erfolg. Unterm Strich hast du aber nicht viel gelernt, da dir BASCOM keine hardwarenahe Programmierung erlaubt. Interrupts kannst du fast vergessen, durch das Sichern aller Register wirds arg langsam. Ich programmiere auf anderen Systemen auch in BASIC (QBASIC, VB, Commodore-BASIC 3.5), beim AVR aber nur in Assembler. Mit BASCOM kann ich mich nicht anfreunden. > habt ihr vielleicht tipps für übungsbeispiele die mir eventuell den > projektaufbau erleichtern Das hättest du nicht fragen sollen, bist also selbst schuld. Wenn du ein paar ASM-Programme analysieren willst, dann schau mal hier rein: www.hanneslux.de Mit einer Rollosteuerung kann ich (noch) nicht dienen, aber eine Rolladensteuerung für 12 Rolläden mit Display und Schaltuhr ist in Arbeit (Mega32). ...
Ich habe es schon anfangs geschrieben, zerlege dein Projekt in einzelne Teile. Beginne mit Taste drücken, entprellen, LED leuchtet, ein Zähler zählt langsam hoch bis zu einem Wert, LED geht dann aus und so weiter bis du alle Teile beisammen hast. So kannst du dir alle Übungsbeispiele Projektnahe selbst zusammenstellen und wenn alles funktioniert zusammenfügen. Das ganze lässt sich sicher auch in Bascom lösen, allerdings kann ich dir dabei dann nicht helfen, es wird sich aber sicher jemand finden.
so hab mich noch ein bisschen informiert und nach einiger zeit auch einen halbwegs vernüftigen code zusammengebracht der in bascom fehlerfrei compeliert wird wollt mal eure meinung dazu hören?! $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 mfg alex p ps mir is es bewusst das ich anfangs sehr blöd gefragt hab, aber ich denk ich schau schon langsam durch die ganzen sachen ;-)
Ich bin zwar BASCOM-Muffel, aber schau dir mal den Befehl debounce an. Unabhängig davon stellt sich die Frage, wie das Ding wieder runter fährt... ;-D ...
befehl debounce, versteh ich nicht ganz?! ja ich weiß runterfahrn tut es noch nicht hab mir mal dacht ein programm das mal nur rauf fahrt is mal ein anfang. kann man sich ja dann so in module zamstopseln raufabfrage runterabfrage interruptabfrage
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
so hab das programm wieder leicht geändert und mit bascom getestet und es schaut so aus als würde alles funktionieren. werd demnächst das ganze zamschließen und in echt testen. natürlich fehlt die erweiterung noch für runter ;-) mfg alex p danke für eure mithilfe ;-))
Du hast weiter oben geschrieben, dass sich der Motor mit einer festen Drehzahl dreht und dass die Frequenz der Lichtschrankenimpulse (unter Optokoppler verstehe ich was Anderes) konstant ist. Daher erübrigt sich die Zählung der Impulse, es genügt, wenn man die Zeit misst. ...
Die Zeitmessung reicht bei den Rollos völlig aus, bei meinen Rolladen mache ich es auch so, wobei die Zeit die der Motor des Rollos zum Hochziehen benötigt etwas länger ist als die beim Runterfahren, das kann man aber dem entsprechend anpassen.
hab vorher das programm vergessen ---------------------------------------------- $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 > 5 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 ------------------------------------------------------ der motor dreht relativ langsam also müsste prinziepell beides funktionieren! stimmt mit zählen wärs eigentlich einfacher gewesen ;-) mfg piri
Hier mal meinen Senf zum Thema Gurtwickler (ich hab grade meinen repariert) schau mal unter Rollotron 9600 (z.B. bei ebay). Die Beschaltung ist wie folgt: Sicherung, Eingangsbrücke (4*1N4007), Entstörkondensatoren, Gleichstrommotor (230V). Der Wickler "zieht" im Lastbetrieb ca. 100 Watt. Ein ziemlich starkes Überstzungsgetriebe bringt die Kraft und Drehzahl auf ein erträgliches Maß. Die Richjtungsumkehr erfolgt durch 2 kleine Print-Relais (12V) welche dann die Spannung geeignet auf den Motor durchschalten. Die Stromversorgung des Prozessors und des Relais erfolgt über einen kleinen print-Trafo (Ruhelast ca. 2 Watt) Nun meine Anmerkungen: Je nach Jalousiengewicht dreht der Motor natürlich schneller oder weniger schnell. Darüber hinaus: Rauf hat der Motor ordentlich zu schaffen, und runter muß er abgebremst werden, damit er nicht zu schnell runterrasselt. An der Umlenkrolle ist ein kleiner Magnet, dahinter (Platine) 2 Hallsensoren. Sie messen ob sich da überhaupt was dreht (kann ja auch grade jemand seine Finger irgendwo zwischen haben) und stoppt eventuell. Mir ist nun nicht klar bei der Anordnung des Ursprungsposters: Wieso 4 Motoren wieso 12 Volt welchen Strom soll denn das Teil ziehen, und wie kommt der an den Motor Welches Getriebe Wie erfolgt die Richtungsumkehr
hy also dans ganze ist eine nachrüstung es geht um rolos in den scheiben die mit einen seilzug zu betätigen sind also per hand, dranziehn und festbinden damit sie oben bleiben d.h. relativ wenig kraft! 4 rolos da ich 4 fenster habe. 12V da der motor 12V betriebsspannung hat bei dem schon das getriebe eingebaut ist! der hat so ne welle drinnen, damit er ohne spannung nicht zurückrollt! und mit viel power, den kann man nicht mal mit der hand stopen! aja und auf dem motor is hinten so ne rasterscheibe (inkrementierscheibe) für nen optokoppler, die die ganze zeit durch nen gabellichtschranke läuft. wieviel strom, was der strom zieht weiß ich nicht genau, is daweil am 2a netzteil glaufen . angsteuert wird das ganze über nen l293 muss ich mir noch überlegen bzw relais. ich weiß das keine treiberstufe daweil in mein programm eingebaut! naja mit nen 5V/12V relais müsst zumindest das aktuelle programm funktionieren. oder hast du eine andere idee für mein projekt.
> der motor dreht relativ langsam also müsste prinziepell beides > funktionieren! > stimmt mit zählen wärs eigentlich einfacher gewesen ;-) Zählen von Impulsen benötigt aber zusätzliche I/O-Pins. Zeitmessung erreicht man ganz einfach, indem man sich mit einem Timer ein Zeitnormal schafft. In dieser ISR können dann die Bedientaster entprellt werden, mehrere Software-Timer behandelt werden usw... Das Intervall legt man sinnvollerweise so, dass man mit dem Wertebereich eines Bytes die Zeit zum Öffnen oder Schließen zählen kann. Genauer ist nicht erforderlich. Dein "Engpass" ist dann aber die begrenzte Anzahl I/O-Pins des Mega8. Daher solltest du entweder auf einen 40-Pinner AVR ausweichen oder über Porterweiterung mittels Schieberegister nachdenken. Denn ich habe hier irgendwo gelesen, dass du mit einem AVR mehrere Rollos steuern willst. Das schafft ein Mega8 mit 1MHz spielend, nur mit den I/Os wird es schnell knapp, denn jedes Rollo erfordert 2 Eingänge für die Taster und 2 Ausgänge für die Relaistreiber. Die Eingänge sollten möglichst auf einen Port geführt werden, das erleichtert die Entprellung. ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.