Hallo beisammen, ich hab da so ein Problem. Ich experimentiere mit einem Atmega8 und möchte daraus eine Rolladensteuerung bauen. In einem Zimmer habe ich 5 Rolläden (gesteuert über Pb0-4, Pb6 ist auf oder ab)welche jedoch unterschiedlich schnell laufen. Mit meinem ersten Versuchen in Bascom habe ich den angehängten Code zum testen erzeugt, hier funktioniert das rauf und runter schon ganz gut, jedoch habe ich zwei Probleme. 1. Das mit dem Stopp unterbricht zwar das Programm, aber der Wait befehl blockiert mir den Ablauf, d.h. ich muß warten bis die Zeit abgelaufen ist befor ich wieder eine Taste drücken kann. 2. Die motoren laufen unterschiedlich schnell, jetzt suche ich nach einer Lösung, wie ich zu jedem Motor eine eigene Zeiteingabe machen kann. Die Sache nacheinander zu realisieren bekäme ich vielleicht noch hin, aber ich möchte daß die Motoren gleichzeitig anlaufen und nach unterschiedlichen Zeiten stehen bleiben. Könnt Ihr mir behilflich sein den richtigen Weg zu finden.
Mußt mal für jeden Rollladen einen eigenen Timer anlegen und jeden nacheinnander abfragen (so eine Art Multitasking) SG Josef
Hallo Josef, vielen Dank für Deine Antwort. Beim Wort Timer läufts mir kalt den Rücken runter, so ganz habe ich die Sache noch nicht gefressen, obwohl ich mich schon Stunden durch das Netz gewühlt habe. Wie ich einen einzelnen Timer aufrufe um zb. eine LED zum blinken zu bringen krieg ich noch hin, aber mehrere Timer gleichzeitig ?? Hast Du evtl. ein paar Code schnipsel aus einem anderen Programm dazu, vielleicht fällt der Groschen wenn ich mal ein Praxisbeispiel sehe. Danke Gruß Christian
Oder die Endlagenschalter der Rolladenantriebseinheiten korrekt justieren. Dann laufen sie auch nicht über das Ziel hinaus. Original-Rolladen-Schaltuhren schalten auch länger als der Rolladenantrieb zum Erreichen der Endstellung braucht. ...
Wait-Schleifen darf es keine mehr geben. Das ist kein guter Programmierstil. Wo fangen wir also an ? Du brauchst unbedingt einen Timer -Interrupt , der zB. alle sec aufgerufen wird. Dort decrementierst du zb. 10 Timer1-10 (Softwaretimer- char-Variablen) Diese lässt du maximal bis 0 herunterzählen. Toll wäre es, wenn du in C programmieren würdest. In Basic ist das alles viel schwieriger. Kannst du C ? SG Josef
Hallo zusammen, zu Hannes, das mit den endlagen Schalter ist klar, so läuft es ja momentan mit meiner analogen Relaisplatine. Das mit dem Timing ist eigentlich nur notwendig, weil ich verschiedene Programme haben will um automatisch zu beschatten. Also viertelt, halb, oder dreiviertelt runter zu fahren. Die Endpunkte sind Zeitlich unrelevant, da ja die internen Endschalter greifen. Zu Josef, das mit den Wait Schleifen habe ich schon gedacht, ist halt so ein Anfängerprogramm. C kann ich leider nicht, Basic war halt das die erste Wahl weil es mir als Anfänger verständlich schien und mit Bascom eigentlich einfach zu handhaben war. Meinst Du ich sollte noch umsatteln auf C, jetzt gehts noch. Aber wahrscheinlich gibt es dazu viele unterschiedliche Meinungen. Gruß Christian
C ist die Wahl der Profis. Basic ist eine gute Einsteigersprache. Sicher die beste, die es gibt. Aber mach den Umstieg jetzt. Lade dir Codevision herunter. Gibts eingeschr. als vollfunktionierende Demo. Natürlich geht es in auch in Basic. Da gibt sicher ein paar Leute, die dir da weiterhelfen. Für Codevision habe ich eine Menge an Softwareschnipsel. SG Josef
Ziel muss es sein, alle 5 Antriebe gleichzeitig zu steuern, jeder mit seiner zugewiesenen Zeit. Natürlich müßen auch alle Taster gleichzeitig abgefragt werden (aus Sicherheitsgründen). Überleg dir mal, wie das gehen könnte. SG Josef
Ok, mit den Endschaltern hätte ja sein können. Schon wieder Glaubensstreit der Programmiersprachen... Grins... Um die Möglichkeiten und Grenzen des Controllers zu erkennen, sollte man mit Assembler beginnen. Im Gegensatz zum "Computer" programmiert man beim MC nicht unter einem Betriebssystem, sondern direkt an der Hardware. Und da ist man mit einer Hochsprache zu weit weg. Jeder, der wirklich richtig gut mit C Mikrocontroller programmiert, wird bestätigen, dass man ein gewisses Maß an ASM-Kenntnissen braucht. Anders ist es schwer, die gesamte integrierte Peripherie (Timer, ADC, I/O, Ana-Comp, INT) zu verstehen. In ASM sucht man sich die Features im Datenblatt zusammen, setzt mittels I/O-Zugriff die richtigen Bits in den entsprechenden I/O-Registern und schon funktioniert das. Man braucht sich nicht mit irgendwelchen kryptischen Config's herumzuärgern. Für dein Programm würde ich einen Timer zur Erzeugung eines Zeittaktes nutzen und fast das gesamte Programm (Tasten entprellen, Sensoren einlesen, Software-Timer verwalten, Aktionen auslösen, PWM erzeugen...) im Timer-Int laufen lassen. Im Hauptprogramm wird der AVR dann schlafen geschickt, das erhöht die Timer-Genauigkeit, da der Int-Aufruf immer im gleichen definierten (Schlaf-) Zustand erfolgt. Sollten langwierige Berechnungen erforderlich sein, so kann man diese flaggesteuert in der Hauptschleife erledigen, dies ist aber selten der Fall. Warteschleifen gibt es dann garnicht, was jetzt nicht gemacht werden kann, wird eben beim nächsten Int. gemacht. Somit kann man auch LCDs so ansprechen. ...
Hallo Josef, habe mir gerade Codevision gesaugt um mir die Sache mal anzuschauen. Wie weit komme ich mit der demo Soft (beim Mega8) oder ist es unumgänglich früher oder später die Vollversion anzuschaffen. gruß Christian
Diese läuft bis ca. 1 Kbyte. Mehr als genug für dieses Projekt. SG Josef
Ich habe bei mir etwas ähnliches laufen - nur mit mehr Rolläden und auch einigen Lichtschaltern... Ich habe mir einen - nun, ich nenne es mal so - Sequenzer programmiert. Zeitbasis ist bei mir 1/10 Sekunde, das ist eine Auflösung, die für alle meine Aufgaben ausreicht. Die Sequenzen bestehen aus eine Anreihung von Befehlen und anschließenden Wartezeiten, ein Befehlsinterpreter setzt die Kommandos um. Das Hauptprogramm wartet eigentlich nur, bis der nächste 1/10-Sekunden Impuls kommt, dann werden nacheinander alle Sequenzen abgefragt, ob sie aktiv sind, welchen Wert der Timer hat und welcher Befehl momentan ansteht. Natürlich muß man für jede Seqzenz einen eigenen Timer (man kann es eher als Zähler sehen) anlegen. Eine Sequenz kann z.B. so aussehen: 1, 15, 250 2, 15, 1 0, 0, 0 Die erste Zahl ist der Befehl. "1" bedeutet: Setze den Ausgang. "2" = Lösche den Ausgang. Die zweite Zahl ist die Nummer des Ausgangs (bei mir sind es momentan 64), die dritte Zahl die Zeit in 1/10 Sekunden, bis der nächste Befehl ausgeführt werden soll. Übersetzt heißt das also: Setze Ausgang 15, warte 25 Sekunden, lösche Ausgang 15, warte 1/10 Sekunde, Ende der Sequenz. Ich kann mit dieser Methode bis zu 64 Sequenzen unabhängig voneinander ablaufen lassen, dies fängt bei der Rolladensteuerung an und hört beispielsweise bei der Steuerung des Lüfters im Bad auf. Neben diesem Sequenzer läuft noch ein weiterer Befehlsinterpreter, der die Zuordnung der Eingänge zu den Ausgängen übernimmt (z.B. welcher Lichtschalter schaltet welche Lampe, Dimmerfunktion, Wechselschalter etc.) Vielleicht ist das ja ein Denkanstoß.
die Sache mit der Programmiersprache wurmt mich seit dem Tag an dem mir der mega8 vom Briefträger übergeben wurde. Womit soll ich Ihn füttern?? Ich habe mir das Assembler tutorial angeschaut, dann bascom. Bei Bascom hatte ich aufgrund der verständlichen Sprache sofort kleine Erfolge, die Sache mit Assembler ist mir immer noch etwas ungeheuer. Nachdem ich jetzt aber ein gezieltes Projekt habe muß ich mich entscheiden. Wer übernimmt das für mich ... :-) Ich weis keiner. Code vision habe ich mittlerweile installiert, sieht nicht schlecht aus. Die Sache mit Assembler habe ich ja mitlerweile xmal gelesen, daß das als Grundlage nicht schlecht ist, aber jedesmal wenn ich so einen Code sehe gehen mir die Augen über. Für mich erscheint das sehr kompliziert und unübersichtlich, wahrscheinlich denke ich da etwas kompliziert, weil ich die Sache noch nicht verstehe. Gruß Christian
Hallo thkais, mit welcher Sprache hast Du das umgesetzt ? Gruß Christian
So könnte die Motorensteuerung aussehen (in C): //Jalousie 1 if (Timer_Rol1_auf > 0 ){ Motor1_Auf = 0; Motor1_Ab = 1;} if (Timer_Rol1_ab > 0 ) { Motor1_Ab = 0; Motor1_Auf = 1;} //Jalousie 2 if (Timer_Rol2_auf > 0 ){ Motor2_Auf = 0; Motor2_Ab = 1;} if (Timer_Rol2_ab > 0 ) { Motor2_Ab = 0; Motor2_Auf = 1;} //.... //Mit den Tastern kannst du den Timern beliebíge Zeiten zuweisen.zB: if (PINB.0 ==0) Timer_Rol2_auf = 100; //100 sec Jalousie 2 auf if (PINB.1 ==0) Timer_Rol2_auf = 50; //50 sec Jalousie 2 auf usw SO kannst du x Motoren und Taster gleichzeitig steuern. SG Josef
Der Code soll natürlich nur das Prinzip aufzeigen. In der Praxis müssen noch einige Sachen (Verriegelungen, Umschaltpausen, Tastenentprellung usw. ) eingebaut werden. SG Josef
@Christian: Das Ganze läuft auf einem MCS-51 (80C535 mit 32K RAM) seit ca. 5 Jahren 24h / 7 Tage. Geschrieben habe ich das damals in Assembler, das Ganze ist auf mehrere Dateien verteilt und in zig Subroutinen verwoben... Erstaunlicherweise verstehe ich auch nach 5 Jahren noch, was ich da getan habe... Ich würde Dir empfehlen, mit Assembler anzufangen. Assembler ist die einfachste und logischste Programmiersprache, und gerade beim Atmel ist es sehr einfach, da es 32 fast gleichberechtigte Register gibt. Bei anderen Prozessoren muß z.B. jede Rechenoperation über den Akku (ein spezielles Register) gehen und man hat wesentlich weniger weitere Register zur Verfügung - so müssen viele Speicherzugriffe gemacht werden. Ich stand vor einigen Wochen auch vor einem Problem, da ich ein größeres Projekt angefangen habe, das in Assembler einfach zu unübersichtlich werden würde. Ich muß dazu sagen, daß ich eingefleischter Hardcore-Assembler-Fan bin.... Basom habe ich mir angeschaut und fand es eigentlich ganz in Ordnung, Basic ist eine Sprache, die ich verstehe. Aber viele Dinge verschwinden in einer Blackbox - es kam mir vor, als ob ich eine Tastatur mit Bauhandschuhen bediene. Also fiel die Wahl auf C, das für mich immer nur eine Ansammlung von herumtanzenden Sonderzeichen war. Inzwischen fühle ich mich darin wohl, man hat die Möglichkeit auf den Controller voll zuzugreifen und kann trotzdem relativ gut nachvollziehbaren Code schreiben. (Vor ein paar Wochen noch hätte ich mir lieber einen Finger abgehackt, als etwas positives über C zu schreiben... ;) ) Wichtig ist: Nicht zuviel auf einmal wollen. Ich sehe immer wieder, daß Newbies gleich als erstes Programm eine menügesteuerte eierlegende Wollmilchsau programmieren wollen, am besten noch auf einem KS108 Grafik-Display. Da ist Frust vorprogrammiert. Es ist wichtig, Schritt für Schritt vorzugehen, sowohl beim Schreiben der Programme als auch beim Lernen von neuen Features. Erst mal ne LED einschalten, blinken lassen (Stichwort Timer), dann mal eine serielle Schnittstelle mit dem PC aufbauen usw. Vor allem ist es wichtig, sich vorher Gedanken zu machen, was das Programm können soll. Dann einen Ablaufplan (Struktogramm) aufmalen oder aufschreiben, dann schreibt sich das Programm ganz von allein.
@thkais "(Vor ein paar Wochen noch hätte ich mir lieber einen Finger abgehackt, als etwas positives über C zu schreiben... ;) )" Willkommen im Club. Da muß jeder MC-Programmierer mal durch. Peter
"In einem Zimmer habe ich 5 Rolläden (gesteuert über Pb0-4, Pb6 ist auf oder ab)welche jedoch unterschiedlich schnell laufen." Das schreit geradezu nach einem Scheduler (siehe Codesammlung). Damit kann man eine fast beliebige Anzahl zeitabhängiger Prozesse quasi parallel laufen lassen. Allerdings muß ich zugeben, daß die Funktionen nicht gerade einfach zu verstehen sind. Man muß sie aber nicht unbedingt verstehen, sondern nur, wie man sie aufrufen muß. Das Beispielprogramm realisiert z.B. 2 voneiander unabhängige Treppenlichtautomaten. Peter
@Peter: Ja, ja so kanns gehen g Was Du "Scheduler" nennst, deckt sich mit meinem "Sequenzer". Scheduler ist aber der treffendere Begriff ;) Wieder etwas gelernt.
Hi, ich hatte eine ähnliche Idee, eine Rolladensteuerung aufzubauen, bin aber als Maschinenbauer mit den Tiefen der angewandten Elektrotechnik nicht so vertraut. Daher meine Frage: Was benutze ich, um von den TTL-Ausgangssignale des AVRs meine 230V-Spannung schalten zu können? Wo finde ich prinzipielle Schaltungsbeispiele? Gibt es irgendwo Lösungen / Anregungen, die eine einstellbare Zeitschaltuhr integrieren? Danke für Hilfe, Gruß aus Berlin, Axel
Hallo Axeman, um den Laststromkreis der Rolläden zu steuern benutzte ich derzeit Relais, am besten nimmst Du relais mit 2 umschaltern, dann kannst Du die Versorgungspannungen der Antriebsmotoren gegeneinander Laststromseitig verriegeln. Durch die Verriegelung ist sichergestellt, daß der Motor auch bei einer Fehlansteuerung beider Relais nicht gleichzeitig das Auf und Ab Signal bekommt, denn das hätte kapputtmachende Auswirkungen. Die Ansteuerung der Relais via TTL Pegel ist nicht schwierig, ein Transistor, ein paar Widerstände und ne Diode, fertig. Schau mal da, dann brauch ichs nicht aufzuzeichnen www.franksteinberg.de/erel.htm Die Steuerung des ganzen kannst Du mit einem AVR wunderbar realisieren, dann gehts Dir aber genau wie mir. Du must ASSEMBLER lernen....... Die Ansteuerung meiner derzeitigen Relaiskarte beruht noch auf Umschaltern (up stop down). Aber vielleicht bekomm ich die Sache mit Hilfe dieses hervorragenden Forums doch noch hin, und mein Mega8 darf das künftig machen. Gruß Christian
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.