Hallo, also ich habe ein kleines Projekt vor bei dem sich nun doch einige Fragen stellen. Ich fange mal mit dem ATMega32 und dem was ich benötige an, also: 2 PWMs (für LEDs über Transistoren) 3 ADCs (davon zwei mit Spannungsteilern für Mittelwert) 1 Zähler 1 Timer im µs bereich einige I/Os Die Frage die sich mir hier stellt ist, reicht ein ATMega32 dafür aus? Welchen Quarz nutze ich am besten? 8 und 12 Mhz habe ich da. Zur Erläuterung: Die zwei PWMs sollen LEDs über Transistoren dimmen. Es wird jedoch nur eine PWM gleichzeitig genutzt (den Rest im C-Code) 1 ADC soll konstant im 30 Sekunden Takt einen Fotowiderstand auswerten und ab einem Schwellwert dann einen PIN auf High bzw. LOW setzen. (stellt kein großes Problem dar) 2 weitere ADCs müssten "syncron" laufen. Diese werden mit je einem Spannungsteiler auf "mittelwert" also 512 +- 100 konstant gesetzt. Hier sollen dann je zwei zustände, also 1024 oder 0 erkennt und darauf dann entsprechende I/O PINs auf High bzw LOW gesetzt werden. 1 Zähler. Dieser soll Impulse zählen und nach Ablauf einer gewissen Zeit nachdem kein Impuls mehr kam einen entsprechenden PIN oder aber auch die die PWM starten. Nun zum Code: Der Code soll halt die oben genannten Aufgaben abarbeiten. Dies stellt so nach kein großes Hindernis dar, aber wie setze ich folgendes um?: Also sagen wir an PD0 und PD1 sind Taster angeschlossen die auf LOW ziehen. Nun soll, wenn PD0/1 auf LOW zieht die PWM von 0 -> 1024 starten. Bei High wieder von 1024 -> 0. Soweit sogut. Wenn jedoch PD0 die PWM schon gestartet hat, wie verhindere ich, das wenn PD1 dann auf LOW zieht die PWM erneut gestartet wird? Beim High das selbe. Ebenfalls bei dem Zähler. Wenn 2 Impulse kamen soll die PWM gestartet werden. Wenn nun einer der Taster auf LOW zieht soll dieser "unbeachtet" werden. Erst wenn der Taster dann auf High zieht soll die PWM wieder gestartet werden (also wieder "aus" dimmen) Dann suche ich noch eine Art "Master-Funktion". Also, ich habe einen PIN. Wenn dieser auf LOW liegt wird der Code ausgeführt. Ist dieser auf HIGH wird der ganze Code unbeachtet belassen (if/else), also wie ein AN/AUS schalter. Aber wie mache ich es nun, das der Controller den Code trotzdem ausführt und zwar nur dann, wenn der PIN auf High liegt und Daten per I²C herein kommen? Also eine Art "Superuser per I²C" die den "AN/AUS" Schalter "übergeht". Ich dachte mir, ok, da ich in der main Schleife ja prüfe ob der PIN LOW ist und dann in eine Variable 1 schreibe, schiebe ich dieses mittel I²C vor, und sage ihm "der PIN ist LOW". Klappt jedoch nicht, denn sobald die Schleife wieder beginnt und der PIN nicht LOW ist setzt der Code die Variable ja wieder auf 0. Habt ihr da ein paar Ideen für mich?
@ Rene Hov (ballibou77) >Ich fange mal mit dem ATMega32 und dem was ich benötige an, also: >2 PWMs (für LEDs über Transistoren) Gibt es in Hardware an mehreren Timern. >3 ADCs (davon zwei mit Spannungsteilern für Mittelwert) Einfach. >1 Zähler Gibt es drei. >1 Timer im µs bereich Was soll der genau machen? >Die Frage die sich mir hier stellt ist, reicht ein ATMega32 dafür aus? Wahrscheinlich schon. Was soll dein us Timer machen? >Welchen Quarz nutze ich am besten? 8 und 12 Mhz habe ich da. Dann nimm die 12 MHz. >Nun soll, wenn PD0/1 auf LOW zieht die PWM von 0 -> 1024 starten. Bei >High wieder von 1024 -> 0. Soweit sogut. >Wenn jedoch PD0 die PWM schon gestartet hat, wie verhindere ich, das >wenn PD1 dann auf LOW zieht die PWM erneut gestartet wird? Beim High das >selbe. Durch passenden Programmlogik, meist mit einer Statemachine. >Ebenfalls bei dem Zähler. Wenn 2 Impulse kamen soll die PWM gestartet >werden. Wenn nun einer der Taster auf LOW zieht soll dieser "unbeachtet" >werden. Klingt nach der Auswertung von einfach und mehrfach Tastendrücken. Dafür gibt es hier schon ein gutes Stück Software, siehe Entprellung. > Erst wenn der Taster dann auf High zieht soll die PWM wieder >gestartet werden (also wieder "aus" dimmen) Siehe oben, Statemachine. >Aber wie mache ich es nun, das der Controller den Code trotzdem ausführt >und zwar nur dann, wenn der PIN auf High liegt und Daten per I²C herein >kommen? Also eine Art "Superuser per I²C" die den "AN/AUS" Schalter >"übergeht". Alles per Statemachine.
Rene H. schrieb: > Die Frage die sich mir hier stellt ist, reicht ein ATMega32 dafür aus? > Welchen Quarz nutze ich am besten? 8 und 12 Mhz habe ich da. Die Forderung 3 ADCs erfüllt der Atmega32 nicht, er hat nur einen mit einem Multiplexer sodass man 7 Kanäle hat. Ansonsten erfüllt er alle anderen Anforderungen. Brauchst du also wirklich 3 ADCs oder genügen drei ADC-Kanäle? Auf der anderen Seite kann man problemlos mehrere ADCs an den Atmega32 anschließen. Die Frage, die ebenfalls noch im Raum steht: Wie schnell soll er diese Aufgaben bewältigen können? Das wird bestimmen ob er a. immer noch geeignet ist und b. welchen Quarz du verwenden musst ;)
:
Bearbeitet durch User
Also ein ADC muss im 30 sekundentakt, dafür auch der Timer einen Fotowiderstand auslesen und ab einem gewissen Schwellwert High bzw Low auf einen Pin schalten. Die anderen beiden ADCs die mit den Spannungsteikern auf dem Mittelwert gehalten werden, müssten eigentlich syncron zum restlichen Programm konstant ausgewertet und je nach zustand, also 5V oder 0V der entsprechende Pin auf High gesetzt werden. Der Timer sollte im 200us bereich laufen.
Rene H. schrieb: > Die anderen beiden ADCs die mit den Spannungsteikern auf dem Mittelwert > gehalten werden, müssten eigentlich syncron Was verstehst du unter synchron? Wie genau muss das sein? Muss die Auswertung alle millionstel Sekunden erfolgen? Alle 10 Millionstel Sekunden, alle ..... Da es sich hier ganz offenbar um eine Benutzereingabe handelt, reicht es wohl völlig aus, wenn ca. 1000 mal pro Sekunde nachgesehen wird, wie denn jetzt die Poti stehen. Und dann reicht es auch, wenn man sie hintereinander auswertet und nicht absolut gleichzeitig. Kein Mensch kann so schnell drehen. Für deinen Mega eine Aufgabe, die er mit links erledigt und sich dabei noch langeweilt.
:
Bearbeitet durch User
Karl H. schrieb: > Da es sich hier ganz offenbar um eine Benutzereingabe handelt, reicht es > wohl völlig aus, wenn ca. 1000 mal pro Sekunde nachgesehen wird, wie > denn jetzt die Poti stehen. Mach da 'ne 100 draus, das reicht auch.
Also an den zwei ADC Pins hängen zwei Wippschalter. Die Schalter sind aber "falschrum" angeschlossen. Also die Schalter kriegen 5V und GND und der "ausgang" geht dann zum ADC Pin. Daher soll der ADC auf Mittelwert "halten" und wenn man den Wippschalter oben drückt dann schaltet er 5V durch, drückt man ihn nach unten schaltet er GND durch und wenn man nichts drückt schaltet der Schalter nichts wodurch der ADC dann mit dem Spannungsteiler auf "mitte" gehalten werden muss wodurch man ja dann erkennen kann ob der Schalter in "mittelstellung" steht oder eben ob 5V oder GND fließen. Das ganze zwei mal. Diese schalten Motoren, Links oder Rechts herum. daher sollte das schon "syncron" laufen um ein "nachdrehen" des Motors zu verhindern. Der dritte ADC ließt einen Fotowiderstand aus und soll bei einem gewissen Dunkelwert Licht einschalten bzw. ein Relai was dann das Licht schaltet.
:
Bearbeitet durch User
@ Rene Hov (ballibou77) >aber "falschrum" angeschlossen. Also die Schalter kriegen 5V und GND und >der "ausgang" geht dann zum ADC Pin. Schalter sind digiatl, die misst man nicht mit einem ADC sondern einem normalen digitalen Eingang. > Daher soll der ADC auf Mittelwert >"halten" ??? >und wenn man den Wippschalter oben drückt dann schaltet er 5V >durch, drückt man ihn nach unten schaltet er GND durch und wenn man >nichts drückt schaltet der Schalter nichts wodurch der ADC dann mit dem >Spannungsteiler auf "mitte" gehalten werden muss wodurch man ja dann >erkennen kann ob der Schalter in "mittelstellung" steht oder eben ob 5V >oder GND fließen. AHA! Das ist natürlich was anderes! >Das ganze zwei mal. Diese schalten Motoren, Links oder Rechts herum. >daher sollte das schon "syncron" laufen um ein "nachdrehen" des Motors >zu verhindern. Was du mit "synchron" bezeichnest ist nicht viel mehr als "mit wenig Verzögerung". Das ist für den uC totlangweilg wie schon oben geschrieben. Wenn deine Statemachine mit 100 Hz aufgerufen wird und die Auswertung bzw. Ansteuerung vornimmt, ist der uC nicht mal ansatzweise ausgelastet. >Der dritte ADC ließt einen Fotowiderstand aus und soll bei einem >gewissen Dunkelwert Licht einschalten bzw. ein Relai was dann das Licht >schaltet. Trivial.
Rene H. schrieb: > Also an den zwei ADC Pins hängen zwei Wippschalter. Die Schalter sind > aber "falschrum" angeschlossen. Also die Schalter kriegen 5V und GND und > der "ausgang" geht dann zum ADC Pin. Daher soll der ADC auf Mittelwert > "halten" und wenn man den Wippschalter oben drückt dann schaltet er 5V > durch, drückt man ihn nach unten schaltet er GND durch und wenn man > nichts drückt schaltet der Schalter nichts wodurch der ADC dann mit dem > Spannungsteiler auf "mitte" gehalten werden muss wodurch man ja dann > erkennen kann ob der Schalter in "mittelstellung" steht oder eben ob 5V > oder GND fließen. Ah, danke, jetzt wird das klarer. Für eine solche Konstruktion braucht man nicht unbedingt einen ADC, es sollte auch mit einem hochohmigen externen Pull-Down-Widerstand gehen. Die Schwierigkeit besteht ja darin, herauszufinden, ob der zweiseitige Wipptaster in der Mitte steht, also der Eingang des Mikrocontrollers hochohmig ist. Wenn du einen externen Pulldown gegen GND schaltest, wird der Eingang bei geöffnetem Schalter immer dem Zustand des internen Pullups folgen: interner Pullup aus: Eingang auf GND interner Pullup ein: Eingang auf VCC Unabhängig davon bin ich mir nicht sicher, ob du wirklich einen so riesigen Baustein wie den Mega32 brauchst. Für die LEDs reicht Soft-PWN locker aus. Wahrscheinlich reicht dann z.B. ein ATtiny85 oder ein ATtiny84A. Und falls es keine Hochleistungs-LEDs sind, brauchst du keinen Transistor zur Ansteuerung. Vielleicht brauchst du nicht einmal ein Quarz, der interne Oszillator ist gar nicht so schlecht.
Also es handelt sich um zwei mal 90 LEDs. Da brauche ich schon einen Transistor :) Und da ich dann noch knapp 18 I/Os brauche und nicht mit Schieberegistern arbeiten möchte und hier eh noch 5 ATMega32 rumliegen kann ich diese auch "verbraten" ansonsten hätte ich noch ATMega128L da, der erscheint mir aber definitiv zu "überdimensioniert". PWM möchte ich schon Hardware mäßig.
Rene H. schrieb: > Das ganze zwei mal. Diese schalten Motoren, Links oder Rechts herum. > daher sollte das schon "syncron" laufen um ein "nachdrehen" des Motors > zu verhindern. machen wir das doch mal an ein paar konkreten Zahlen fest. Angenommen dein Motor dreht mit 60-tausend Umdrehungen pro Minute. Das ist schon recht heftig. Dann dreht der Motor 1000 Umdrehungen pro Sekunde. Oder anders ausgedrückt: er dreht 1 Umdrehung in 1 Millisekunde. Wenn du also spätestens nach 100µs auf den Schaltvorgang reagierst, dann kann der Motor in dieser Zeit keine 1/10 Umdrehung machen. 100µs sind für einen Mega aber immer noch Kinderkram. Nun ist es aber so, dass dein Motor sehr wahrscheinlich keine 60-tausend Umdrehung dreht. Des weiteren wird es auch nicht so sein, dass dein menschlicher Bediener auf 1/10 Millisekunden genau den Zeitpunkt erwischt, an dem der Motor abschalten soll. Selbst wenn eine Mechanik auf den Wippschalter drücken würde, sind die mechanischen Ungenauigkeiten so gross, dass ein reproduzierbarer Schaltvorgang im Milliesekundenbereich eine Herausforderung darstellt. Bei einem menschlichen Bediener sind wir in der Größenordnung von Zehntel-Sekunden und selbst da muss der sich schon extrem konzentrieren. Millisekunden oder gar Zehntelsekunden sind aber für einen µC eine halbe Ewigkeit. Umgelegt auf dich als Mensch (und selbst der Vergleich hinkt) würde das bedeuten, dass du im Jannuar den Schaltvorgang bemerkst und spätestens bis Weihnachten geschaltet haben musst. Das ist nichts was dich irgendwie beunruhigen würde. Oder? > > Der dritte ADC ließt einen Fotowiderstand aus und soll bei einem > gewissen Dunkelwert Licht einschalten bzw. ein Relai was dann das Licht > schaltet. Wieder umgelegt auf dich und deine Geschwindigkeit: Wenn du irgendwann im Juni oder Juli mal kurz nachsiehst, ob das Licht einzuschalten ist oder nicht, dann bringt dich das nicht wirklich ins schwitzen. Eines sei noch angemerkt: Die Übertragung auf dich als Person hinkt hinten und vorne. Denn im Relation dazu, bist du mit deinem Zeitgefühl immer noch schnarchlangsam. Dein µC kann selbst ohne Quarz rund 800-tausend Befehle pro Sekunde abarbeiten. Was denkst du, wie sehr der damit ausgelastet ist, alle heiligen Zeiten mal 10 oder 20 Befehle für die Motoren bzw. das Licht aufzuwenden? Um diese Aufgabe so zu versauen, dass den Motoren deinem Gefühl nach nicht sofort die Spannung bei einem Schaltvorgang weggenommen wird bzw. zugeschaltet wird, da muss man sich schon gewaltig anstrengen. Das ist ohne Delays gar nicht so einfach.
:
Bearbeitet durch User
Ich sehe das, nachdem klar ist was "gleichzeitig" bzw. "synchron" hier in der Anforderung bedeutet genauso wie Karl Heinz. Der Quarz ist IMO nicht mal notwendig, da kann man auch super mit dem internen Oszilator, der bis 8 MHz geht beim Atmega32 wenn ich mich recht entsinne, arbeiten. Die Aufgabe ist Pille-Palle, könnte auch ein Atiny2313 locker übernehmen. Wie kommt also die Wahl auf Atmega32? Lag der nur grade in der Schublade? Wenn er noch gekauft werden muss ist das auch nicht sinnvoll für diese Aufgabe.
:
Bearbeitet durch User
Rene H. schrieb: > Und da ich dann noch knapp 18 I/Os brauche und nicht mit > Schieberegistern arbeiten möchte und hier eh noch 5 ATMega32 rumliegen > kann ich diese auch "verbraten" ansonsten hätte ich noch ATMega128L da, > der erscheint mir aber definitiv zu "überdimensioniert".
Rene H. schrieb: > Rene H. schrieb: >> Und da ich dann noch knapp 18 I/Os brauche und nicht mit >> Schieberegistern arbeiten möchte und hier eh noch 5 ATMega32 rumliegen >> kann ich diese auch "verbraten" ansonsten hätte ich noch ATMega128L da, >> der erscheint mir aber definitiv zu "überdimensioniert". Du willst also nicht mit Schieberegistern arbeiten und statt dessen lieber in die 'Hölle' gehen, dir eine Kommunikation zwischen mehreren Megas aufzubauen. Viel Spass damit. Nur Narren glauben, dass der Einsatz von mehreren µC simpler ist, als einen µC alles machen zu lassen, wenn es keine technologischen Gründe dafür gibt (wie Laufzeiten oder räumliche Distanz). Mehrer Prozessoren einzusetzen, wo einer alleine locker ausreicht, ist immer ein Fehler. Mehrere Prozessoren machen die Dinge nicht einfacher, sondern komplizierter. Dagegen sind Schieberegister pillepalle.
:
Bearbeitet durch User
Wieso mehrere? Ne, ein ATMEGa32 ist was die PINs und die I/Os angeht ausreichend. Ein ATMega8 wäre zuklein. Ein ATMega128L finde ich überdimensioniert. Also es soll nur EIN ATMega32 zum einsatz kommen.
Rene H. schrieb: > Wieso mehrere? Sorry. Da habe ich deine Aussage mit den 5 Megas dann fehlinterpretiert. Ich dachte schon ..... (Zur Ehrenrettung: Hatten wir alles schon)
:
Bearbeitet durch User
Rene H. schrieb: > wodurch man ja dann > erkennen kann ob der Schalter in "mittelstellung" steht oder eben ob 5V > oder GND fließen. Geht aber auch mit einem Digitaleingang und Widerstand gegen einen Ausgangspin, spart sogar einen Widerstand ein. Out In Out In 0 0 1 1 offen 0 0 1 0 GND 0 1 1 1 VCC
Peter D. schrieb: > Geht aber auch mit einem Digitaleingang und Widerstand gegen einen > Ausgangspin, spart sogar einen Widerstand ein. > Out In Out In > 0 0 1 1 offen > 0 0 1 0 GND > 0 1 1 1 VCC Ja... oder eben ohne zusätzlichen Ausgangspin: > Wenn du einen [hochohmigen] externen Pulldown gegen GND schaltest, > wird der Eingang bei geöffnetem Schalter immer dem Zustand des > internen Pullups folgen: > > interner Pullup aus: Eingang auf GND > interner Pullup ein: Eingang auf VCC Wobei je nach Umgebung die Hochohmigkeit nicht immer so geschickt ist, da ist deine Lösung natürlich robuster.
Rene H. schrieb: > Rene H. schrieb: >> Und da ich dann noch knapp 18 I/Os brauche und nicht mit >> Schieberegistern arbeiten möchte und hier eh noch 5 ATMega32 rumliegen >> kann ich diese auch "verbraten" ansonsten hätte ich noch ATMega128L da, >> der erscheint mir aber definitiv zu "überdimensioniert". Hatte ich übersehen. Noch 18 weitere I/Os? Was hängt denn da alles dran? Nicht das da noch ein Detail ist…oder ist das nur für Display und Co gedacht?
Ein Pin ist für On/Off. Also
1 | while(1) |
2 | { |
3 | |
4 | if (PIN_PA1 == High) { onoff = 1; } else { onoff = 0; } |
5 | |
6 | if (onoff == 1) |
7 | { |
8 | // Hier dann der gesamte Programmcode |
9 | } else { |
10 | // Tu nichts |
11 | } |
12 | } |
Die anderen müssen je nach den Auswertungen nur auf High oder Low geschaltet werden. 4 Pins alles für die 2 Motoren. 1 Pin für Licht (also Transistor der dann ein Relai schaltet) Nur sowas halt.
Rene H. schrieb: > Ein Pin ist für On/Off. Also > > while(1) > { > > if (PIN_PA1 == High) { onoff = 1; } else { onoff = 0; } > > if (onoff == 1) > { > // Hier dann der gesamte Programmcode > } else { > // Tu nichts > } > } gibt es dafür nicht einen Reset Pin? der uC wird dann natürlich komplett zurück gesetzt, jedoch klingt die Anwendung nicht nach etwas hoch speziellem... aber das weiß wie immer nur die Glaskugel ;-)
:
Bearbeitet durch User
Rene H. schrieb: > Ein Pin ist für On/Off. Also > >
1 | > |
2 | > while(1) |
3 | > { |
4 | > |
5 | > if (PIN_PA1 == High) { onoff = 1; } else { onoff = 0; } |
6 | > |
7 | > if (onoff == 1) |
8 | > { |
9 | > // Hier dann der gesamte Programmcode |
10 | > } else { |
11 | // Tu nichts |
12 | } |
13 | > } |
14 | > |
15 | > |
> > Die anderen müssen je nach den Auswertungen nur auf High oder Low > geschaltet werden. 4 Pins alles für die 2 Motoren. 1 Pin für Licht (also > Transistor der dann ein Relai schaltet) > > Nur sowas halt. Und warum nicht gleich :
1 | |
2 | while(1) |
3 | { |
4 | if (PIN_PA1 == High) |
5 | { |
6 | // Hier dann der gesamte Programmcode |
7 | } |
8 | } |
?? Die erste If-Schleife ist eigentlich Quatsch. Noch besser, und bei dir sogar recht simple umsetzbar da zwischen zwei Aktionen dein µC ja quasi eine halbe Ewigkeit Zeit hat: Den µC schlafen schicken und nur aufwecken wenn es etwas zu tun gibt. Karl Heinz hat da sicher den ein und anderen Tipp für dich. EDIT: Mal Rausgesucht den Artikel zu den Sleepmodes hier auf der Seite: https://www.mikrocontroller.net/articles/Sleep_Mode
:
Bearbeitet durch User
egbert schrieb: > "If-Schleife"?!? Ja. Nähere Informationen hier: http://if-schleife.de/ ;-) Aber Michael hat trotzdem Recht.
:
Bearbeitet durch User
Okey, ich kenne keinen Programmierer, der bei Begriff "if-Schleife" nicht weiß was damit gemeint ist. Und macht das while(1) davor die if-Abfrage nicht automatisch zur Schleife? :D
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.