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 ;)
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.
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.
@ 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.
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.
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.
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)
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?
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 ;-)
>> 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
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