Go Down

Topic: Zwei ATmega, ein Taktgeber? (Read 5448 times) previous topic - next topic

MaFu

Für mein aktuelles Lichtschrankenprojekt stosse ich mit dem Duemilanove Board an die Grenzen. Primär mit den Pins, beim fertigen Programm aber vermutlich auch von der Flashgröße her.
Daher hatte ich zunächst vor, auf den Arduino mega zu wechseln.

Allerdings lässt sich das Ganze recht gut in zwei Hauptabschnitte teilen:
Auf der einen Seite habe ich die Programmverwaltung. Also Eingabe (Ziffernblock), Ausgabe (LCD), Menüsteuerung, Konfiguration, usw.
Auf der anderen Seite ist dann die Ausführungsschicht. Abfrage der Lichtschranke, Ansteuerung der Ventile, Kamera, Blitze.
Daher habe ich jetzt vor, es mit zwei ATmega 328 zu realisieren. Also keine fertigen Boards, sondern eine eigene Platine.
Grund: Erstens wesentlich geringere Kosten. Der Arduino mega kostet 50 Euro, der Eigenbau mit 2 ATmega 328 incl. Bootloader ungefähr 12 Euro. Den Preis für den USB Adapter lasse ich mal aussen vor, den kann ich ja auch für andere Projekte verwenden.
Und mit dieser Lösung wird das Projekt auch reizvoller und interessanter.

Um nun zum Kern der Sache und meiner eigentlichen Frage zu kommen: Kann ich problemlos beide ATmega an den gleichen 16MHz Quartz anschließen? Wenn ja, muss ich dabei noch irgendwas beachten?
Absoluter Gleichlauf ist zwar für mein Vorhaben nicht nötig, schadet aber auch nicht.  ;)
Zudem sind nochmal ein paar Cent eingespart.
_______
Manfred

andreasw

Ja, das geht. Allerdings nur mit unprogrammierten Controllern, da hier noch keine Fusebits gesetzt sind und der Controller daher mit dem internen Taktgeber läuft.
Einen AVR normal an ein Quarz anschließen und beim zweiten AVR XTAL1 mit XTAL2 vom ersten Chip verbinden:

Code: [Select]

         +---------
         |
   +-----|XTAL1
-------  |
|Quarz|  |   AVR-1 (Fuses: Full Swing Crystal)
-------  |
   +-----|XTAL2
   |     |
   |     +---------
   |
   |
   |     +---------
   |     |
   +-----|XTAL1
         |
         |   AVR-2 (Fuses: Ext. Clock)
         |
       --|XTAL2
         |
         +---------

MaFu

Also geht es bei zwei ATmegas mit Arduino Bootloader nicht. :(
Auch kein Problem, dann bekommt jeder seinen eigenen Quartz.
Danke für die Info.
_______
Manfred

Nachtwind

Hm... du koenntest die beiden Arduinos auch anders 'synchron' halten. Du koenntest beide Arduinos via I2C verbinden und dir kurzerhand eine Art Protokoll basteln mit deren Hilfe du eine 'Zeitvariable' vom einem zum anderen hin aktualisierst.. damit koenntest du zumindest beide gleichschalten...

MaFu

Wie schon gesagt, synchronität ist nicht wichtig. War nur so eine Idee mit einem Quartz. In Relation zu den Gesamtkosten ist es eigentlich eh egal.

Verbunden werden die beiden über I2C, das ist bereits so geplant. Der "Manager" muss schließlich dem "Arbeiter" sagen was er tun soll.
_______
Manfred

udoklein

Das hört sich nach Hochgeschwindigkeitsfotografie an.

Wieso passt das nicht in 32k ? Hört sich ja nicht so schlimm an. Das mit den Pins verstehe ich auch nicht ganz.

Wenn Du das vorhast was ich auch gerade bastle sollten die Pins reichen.

Mal schauen:
Kamera: 2 Pins
Blitzansteuerung 1 Pin
Lichtschranken 2 Pins
LCD 2 Pins

Fragt sich wieviele Pins Du für Deine Tasten und die Ventile brauchst. Da das aber alles eher langsame Signale sind könnte man die auch problemlos multiplexen. Wäre jedenfalls einfacher als ein zweiter Arduino.

Was für Ventile nimmst Du?

Grüße, Udo
Check out my experiments http://blog.blinkenlight.net

MaFu

Hallo Udo
Richtig geraten. Meine alte Steuerung ist noch analog mit ein paar Timerbausteinen und vielen Potis. Jetzt ist es langsam Zeit für eine etwas modernere Version.

Für das Display brauche ich schon 6 Pins.
Drei für alle Tasten (16 Stück).
Drei Magnetventile, jeweils ein Pin.
Kamera reicht einer.
Sensoren gibt es aber mehrere: Licht (Laser), Schall, Kontakt (= 4 Pins)
Blitzt: 1 Pin
Da bin ich bei 18 Pins, damit ist der Duemilanove ausgeschöpft.
Ich würde mir gern was für eventuelle Erweiterungen offenhalten.

Das Ganze mit zwei Arduino aufzubauen sollte nicht problematisch sein.
Der "Master" ist für den ganzen Input/Output zuständig. Also LCD, Tastatur, Menüsteuerung, Eingabe verarbeiten.
Beim Start bekommt der "Slave" alle relevanten Informationen über I2C und kümmert sich dann ausschließlich um das Verarbeiten der Sensordaten und das Ansteuern von Ventile, Kamera und Blitz.
_______
Manfred

udoklein

Wie machst Du das mit den Tasten? 3 Pins scheinen mit da wenig. Wie liest Du 16 Tasten mit 3 Pins?

Bei den Magnetventilen könntest Du 1 Pin sparen falls Du weisst, daß irgendwelche nie zusammen angesteuert werden. Sagen wir das sind Ventil A und B. Wenn Du A bei High ansteuerst und B bei Low, und bei Tristate keins von beiden, dann sparst Du da nochmal einen Pin. Weiterhin gibt es Displays (z.B. die Nokia Handydisplays) die nur 2 Pins verbrauchen.

Bei den Sensoren könntest Du auch mit weniger Pins auskommen. Ich nehme mal an Du hast Licht 2 Pins, Schall 1 Pin und Kontakt 4 Pins.
Sagen wir die Pins sind A,B,C,D. Dann könntest Du die auch umbelegen und zwar so:

1) Alle Inputs zeigen den Triggerzeitpunkt durch ein Low an.
2) Falls C High ist werden A und B mit den Lichtschranken versorgt
3) Falls C Low ist kommt auf A der Schall und B der Kontak

--> noch ein Pin gespart


Was ich nicht verstehe: wozu brauchst Du 3 Ventile?

Und was für Ventile nimmst Du?

Gruß, Udo
Check out my experiments http://blog.blinkenlight.net

MaFu

Hallo Udo

Ist schon klar, dass man hier und da mit ein paar Tricks was einsparen kann. Aber wozu, wenn sich mit minimalem Programmieraufwand und ein paar kleinen Bauteilen das Ganze problemlos umschiffen lässt?

Das LCD hab ich schon (20x4).
Bei den Ventilen kann es durchaus sein, dass alle drei gleichzeitig in Betrieb sind. Ich kanns nicht sagen und will mir auf keinen Fall Möglichkeiten verbauen.
Das Gleiche bei den Sensoren. Unter Umständen ist mehr als einer gleichzeitig aktiv. Ev. kommt auch noch eine zweite Lichtschranke dazu.

Und für 16 Tasten reichen wirklich 3 Pins, ich verwende 2 8bit Schieberegister.

Was die Ventile betrifft: Die hab ich noch nicht, muss ich erst noch bestellen. Vielleicht bestell ich auch erst mal nur zwei und später mal ein drittes dazu.
Es werden auf jeden Fall die hier: http://www.esska.de/cgi-bin/esska_de/iboshop.cgi?showd13420!0,267261893121473,M2X000000000
Dort das Modell M21812Vgl000

Gruß
Manfred
_______
Manfred

LC_Data

Du könntest ja die 3 Pins für die Taststatur wieder für digitale Steuerungszwecke frei bekommen in dem Du die Tastatur analog abfragst.
Dazu benötigst Du nur noch ein paar Widerstände und einen analogen Eingang.
Ich habe das auf anraten eines Freundes bei mir so realisiert und es läuft sicher und stabil.

LC

MaFu

Klar, würde auch gehen. Ist bei ein paar Tasten auch kein Problem, aber bei 16 Tasten schon nicht mehr ganz unproblematisch.
Mit den beiden Schieberegistern hab ich mit ein paar Zeilen Code den kompletten Zustand aller 16 Tasten.

Leute, es ist wirklich nett, wie Ihr mir zu mehr Pins verhelfen wollt. Aber es ist wirklich nicht nötig. Ich hab mir das genau überlegt, mein Entschluss 2 328er zu verwenden steht fest. Von der Implementierung ist es ja überhaupt kein Problem und ich hab damit genügend Reserve für alles was mir ev. noch so einfällt. Zudem gefällt mir die Idee von der Trennung zwischen Bearbeitungs- und Ausführungslogik recht gut.

Gruß
Manfred
_______
Manfred

udoklein

Ah verstehe, Du hast schon 2 Schieberegister damit werden die Taster gelesen. Das mit den 2 Arduinos verstehe ich auch. Wenn Du eine komplett saubere Trennung willst. Die Programmierung wird dann wohl einen Tick aufwendiger, aber man kann halt nicht alles haben :)

Nochmal zu meiner Frage: für was brauchst Du dabei 3 Ventile? Ich meine wozu man 1 Ventil braucht leuchtet mir ein. Aber 3 - das finde ich interesant. Verrätst Du das?

Zum Kommentar von LC_Data --> das hatte ich auch. War bei einem LCD Shield so verbaut. Funktioniert aber nicht zuverlässig. Grund: wenn die Temperatur sich weg von den 20-25 C Zimmertemperatur bewegte wurden bei mir plötzlich Tasten falsch erkannt. Deshalb bin ich von der Methode nicht mehr so erbaut.
Check out my experiments http://blog.blinkenlight.net

LC_Data

@Udo Klein,

das Problem hatte ich bemerkt da ich mit einem Widerstandswert ein Signalflattern hatte...
Eine kleine Mittelwertsbildung kann Dir diese Störungen zuverlässig vom Hals schaffen
Guckst Du hier:
Code: [Select]
void TastenLesen()
{
 unsigned char i;                                    //lokale Zählvariable
//Funktionsinterne Variablen
 taste = 0;

                                                   // Mittelwertbildung und Tastenfindung
 for (unsigned char i = 0;i< 8; i++)                 // for Schleife zum 8-fachen aufsummieren
 {                                          // des Tastaturwertes.
   taste = taste + analogRead(0);                    // Einlesen und Mittelwertbildung
 }                                          // durch mathem. Teilung durch
 taste = taste >> 3;                                // die Anzahl der Schleifendurchläufe >>3 = binär 8

 if (taste > 1020)                                   // Ab hier beginnt die Auswertung :
 {                                                   // Welche Taste wurde denn nun gedrückt ?
   tastegedr = 0;// keine Taste                      // Abgefragt werden die Spannungswerte
 }                                                   // die durch einen Spannungsteiler
 if (taste > 970 && taste < 976)//973                // an den analogen Eingang (Pin 0)
 {                                                   // geführt werden.
   tastegedr = 1;  // Set-Taste                      // Der Spannungswert wird durch verschiedene
 }                                                   // Widerstände an den Tasten variiert.
 if (taste > 894 && taste < 900)//897                // Je nach Analog-Wert bekommt die Variable
 {                                                   // tastegedr einen Wert von
   tastegedr = 2;  // Up-Taste                       // 0 = Keine Taste,
 }                                                   // 1 = Set oder Enter-Taste
 if (taste > 346 && taste < 352)//349                // 2 = Up-Taste
 {                                                   // 3 = Down-Taste
   tastegedr = 3; //Down-Taste                       // 4 = Links-Taste
 }                                                   // 5 = Rechts-Taste
 if (taste > 716 && taste < 722)//719
 {
   tastegedr = 4; // Links-Taste
 }
 if (taste > 936 && taste < 942)//939
 {
   tastegedr = 5; // Rechts-Taste
 }

 if(tastegedr != 0)                                    // Wenn eine Taste gedrückt wurde, hier weiter abarbeiten
 {
   analogWrite(Soundpin,beep);                              //Tastenpieps
   delay(10);
   analogWrite(Soundpin,nobeep);                      //Sound aus
 }
}


Das Erkennungsfenster kann dann natürlich erweitert werden.
Ich bin mit +- 3 Zahlenwerten absolut auf der sicheren Seite und habe noch keine Fehlerkennung gehabt.
Die Erweiterung auf mehr Tasten sollte auch kein Problem darstellen.
( Ich hab bei mir wahllos in die Kiste gegriffen und verlötet was da war....)
Vielleicht macht Dir das die 1Pin-Tastatur wieder attraktiv.

LC

udoklein

Flattern war bei mir noch nie ein Problem weil ich gleich zu Anfang für alle Tasten Entprellung eingebaut habe. Das Problem war definitv, daß es dem Teil zu warm war und dann die Sapnnungswerte nicht mehr gepasst haben. Wenn Du keine Probleme damit hast ist das gut für Dich. Bei mir war es aber ein Problem. Seitdem nehme ich lieber wieder digitale Inputs (und Schieberegister oder Mutliplexen).

Und dann gibt es noch ein weiteres Problem: analogRead braucht sehr lange. Deshalb funktioniert auch Deine Mittelwertbildung so gut. Dumm ist nur, daß ich die Tasten per ISR auslesen will (ich habe nicht nur entprellt sondern sogar einen Tastenpuffer :) )und da kann ich sowas wie analogRead nicht wirklich brauchen. OK, das habe ich hingekriegt, aber es nervt schon wenn man extra Runden drehen muß um aus einer zeitkritischen ISR Analogpins zu lesen.
Check out my experiments http://blog.blinkenlight.net

MaFu

Servus Udo

Der Programmieraufwand für die Kopplung der zwei ATmega dürfte sich sehr in Grenzen halten.

Bei einem Arduino würde es ja grob vereinfacht gesehen so ablaufen:

Einstellungen mittels Tastatur und LCD machen, die Werte werden in Variablen gespeichert.
Wenn die Starttaste gedrückt wird, arbeitet der Arduino das Programm ab, wobei er sich die Werte aus den Variablen holt.
Während der Laufzeit (sind ja maximal ein paar Sekunden) wird keinerlei Rückmeldung über das LCD benötigt.

So, und nun das Ganze mit zwei Arduinos:

Am Master die Einstellungen mittels Tastatur und LCD machen, die Werte werden in Variablen gespeichert.
Wenn die Starttaste gedrückt wird, schickt der Master die Einstellungen über I2C an den Slave, dieser speichert die Werte in identische Variablen.
Gleichzeitig ist die Übertragung das Signal für den Slave, das Programm abzuarbeiten.

Wie Du siehst, wird der Mehraufwand voraussichtlich minimal.

Heute waren übrigens meine zwei bestellten ATmega 328 in der Post. Am Wochenende werde ich also den ersten Verbindungstest durchführen.


Was die Ventile betrifft: Meine Vorstellung wäre, die Schlauchauslässe nach den Ventilen so zur Deckung zu bringen, dass die Tropfenposition nahezu identisch ist. So kann ich mit mehreren Farben gleichzeitig arbeiten. Ob sich die Sache wirklich so realisieren lässt, wie ich mir das vorstelle, ist allerdings noch absolut offen.
_______
Manfred

Go Up