PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Virtueller megaxx uC



Hellmut
23.11.2005, 16:35
Hallo Freunde

Im Rahmen meines Projektes basierend auf stupsis Motorregler Know-How einen Motorregler zu entwickeln der die Funktion einer Winde mit Positionssteuerung übernehmen kann komme ich an die Grenzen eines mega8. Aus diesem Grund möchte ich auf einem Entwicklungsboard welches die diskrete Endstufe von stupsis Motorrregler einsetzt 2 mega8 parallel einbauen und über die Bits einiger Ports kommunizieren lassen. Die beiden mega8 sind dann mein "virtueller uC"!

Die beiden mega8 müssen die PWM für die Endstufe des Motorreglers erzeugen, sollen den Steuerimpuls vom RC-Empfänger auswerten, sowie das Impulstripel vom Inkrementtalwertgeber RE30 der eingesetzten Dunkermotoren auswerten. Aus der Auswertung der Impulse vom RC-Empfänger und des Inkrementalwertgebers pflegen sie Steuerungsdatentabellen die eine auf ihnen laufende Applikation in die Lage versetzen "intelligent" z.B. eine Winsch zu steuern um das Hauptsegel, oder das Genua an meinem Modellsegelboot zu betreiben.

Hier die Fragen:

1. Kann ich einen Ausgang eines mega8 1:1 direkt mit einem Eingang eines 2. mega8 verbinden?.

Meine Sorge basiert auf den Gedanken das beim Einschalten, oder nach einem Reset, oder nach einer Neu-Programmierung einzelne Ports vielleicht in einem undefinierten Zustand sind und die beiden verbundenen Port.pins dann auf Ausgang geschaltet sein könnten?

2. Ich würde gerne beide mega8 vom gleichen externen 16MHz Quarz takten lassen. In diesem Fall müsste ich doch die entsprechenden Anschlüsse, XTAL1 und XTAL2, parallel an den Quarz direkt anschliessen.
Geht das und wenn ja sind dann die zwei 22pF Keramikkondenstatoren dann noch die geeigneten?

Ich möchte die beiden mega8 parallel an einen Quarz anschliessen damit beide synchron getaktet werden.

Mit freundlichem Gruß

Hellmut

Bernhard667
23.11.2005, 19:01
Hallo,

1)
Überhaupt kein Problem. Nach dem Einschalten gehen alle Pins per Default auf Ausgang, d.h. die Treiber kämpfen nicht gegeneinander.

Sollte es dir mal wegen Softwarefehler passiern, geht auch nichts kaput. Nu der Stromverbrauch steigt in dieser Zeit.

2) Das kannst Du nicht machen.
Lass doch einen der beiden Controller mit dem Quarz die Frequenz erzeugen. Den anderen Schaltest Du mittels Fuse auf externen Takt und speist ein (Fusesetup und Pin im Manual beschrieben).
Ich glaube man muß auch Controller 1 auf große Signalamplitude am Oszillator schalten

Bernhard

Hellmut
23.11.2005, 20:28
Hallo Bernhard

Danke für deine Auskunft. Ich habe befürchtet wenn ich 2 Ausgänge aufeinander schalte das die Pins einen Schaden erleiden könnten. Gute Nachrichten!

Betreff meiner Frage 2 meine Problemstellung aus einer anderen Perspektive. Ist es überhaupt von Vorteil wenn ich die beiden mega8 über Pins kommunzieren lassen will das sie beide synchron mit dem 16MHz Takt versorgt werden?

Marco78
23.11.2005, 20:57
Den gleichen Takt für beide kann man mit einem Quarzosszilator viel besser erzeugen als das einer mit einem Quarz getaktet wird und der andere dann einen Takt erzeugt.
Der Quarzoszi ist etwas größer und etwas teurer als ein Quarz und zwei Kondensatoren, aber dafür auch genauer und kann mehrere AVRs versorgen.

Zur Kommunikation: Es ist nicht nötig, das beide die gleiche Amplutide haben, wenn es um I²C oder RS232 oder so geht.
Diese Protokolle lesen das Signal mit einer x-fachen Auflösung von der eingestellten ein und erkennen damit sicher die Signale.
Dein PC ist ja auch nicht übers Netzwerkkabel mit dem Internet synchronisiert ;)

Wenn du aber softwaremässig Daten übertragen willst und die Rate sehr schnell sein soll (vier Millionen Bits pro Sekunde), ist das fast nur möglich, wenn beide den gleichen Takt haben.

Marco78
23.11.2005, 20:59
Sorry für's Doppelpost!


Danke für deine Auskunft. Ich habe befürchtet wenn ich 2 Ausgänge aufeinander schalte das die Pins einen Schaden erleiden könnten. Gute Nachrichten!
einen oder keinen?
Schalte doch einfachen sicherheitshalben einen Widerstand in Reihe. Der Strom ist so klein, das es kaum einen Spannungsfall gibt und wenn es zu einer Feststellung der Parameter gekommen ist, wird der Strom begrenzt.
4,7kOhm sollten da ok sein.

Hellmut
23.11.2005, 23:03
Hallo Marco

zur Kommunikation. Ich möchte diese zwischen den 2 mega8 nicht über I2C, RS232, usw. ausführen, sondern indem ein I/O Pin des einen mega8 direkt mit dem I/0 Pin des zweiten mega8 verbunden ist. Ausgetauscht werden keine Daten, sondern nur Signale! Hierfür muß der eine mega8 nur den Pegel an dem Pin ändern, der andere mega8 erkennt den neuen Pegel, bzw. die Flanke an seinem I/O Pin und ist damit informiert. So wird die schnellst möglich Reaktion erreicht. Bei RS232 oder I2C, usw. ist der ganze Protokollaufwand erfoderlich. Hier ein Beispiel. Der Inkrementalwertgeber meines Dunkermotors gibt 512 Impulstripel pro Umdrehung. Bei 60 Umdrehungen pro Sekunde 30720 Impulstripel pro Sekunde! Da bleiben zwischen Impulstripel und Impulstripel 520 Takte bei 16MHz. In dieser Zeit die Impulstripel auswerten, die internen Datentabellen pflegen und eine RS232 oder I2C Datenübertragung ausführen. Dann beim 2. mega8 die erhaltenen Daten auswerten und darauf hin die notwendige Reaktion auszuführen ist sicher nicht möglich.

Nach meiner Methode muß der erste mega8 statt eine RS232 oder I2C Kommunikation auszuführen nur den einen Befehl ausführen den Pegel am Pin z.B. von Low auf High zu setzen. Beim anderen mega8 kann ich entweder im Kode eine regelmäßige Abfrage einbauen, oder ich löse auf den Pegelwechsel ein Interrupt aus. Dieses Interrupt weiss dann weshalb es ausgeführt wurde und löst die gewünschte Aktion aus!

Da beide mega8 physikalisch auf einer Platine nah bei einander sind entsteht so der "virtuelle super mega8" mit wesentlich mehr I/O´s, 2 Ausführungseinheiten, usw! Klingt das schlüssig?

super_castle
24.11.2005, 07:12
Es geht so.
Die Sofwareuarts laufen genauso ab.
Mit einem Interrupt abfragen und fertig.

Castle

SprinterSB
24.11.2005, 09:50
2. Ich würde gerne beide mega8 vom gleichen externen 16MHz Quarz takten lassen. In diesem Fall müsste ich doch die entsprechenden Anschlüsse, XTAL1 und XTAL2, parallel an den Quarz direkt anschliessen.
Geht das und wenn ja sind dann die zwei 22pF Keramikkondenstatoren dann noch die geeigneten?

Ich möchte die beiden mega8 parallel an einen Quarz anschliessen damit beide synchron getaktet werden.

Dazu wird ein AVR auf Quarz eigestellt wie gewohnt und die Fuses auf 'noisy', um die XTAL-Treiberstufe mit höherer Leistung zu fahren.
Der zweite AVR bekommt als XTAL1 das XTAL2 des ersten und wird auf external clock eingestellt.

Um die Ports gegen Kurzschluss (bei Softwarefehlern) zu schützen, kannst du Widerstände dazwischen hängen, die tun den Signalen nicht weh. Nimm einfach 10kOhm. Wenn deine Software korrekt arbeitet geht die direkte Verbindung, weil die Ports nach RESET alle hochohmig sind.

Hellmut
24.11.2005, 09:55
Hallo SprinterSB

Die 10kOhm in Serie in die Verbindungsleitung einfügen, da die Leitung ja weder zu vcc noch gnd gezogen werden soll, richtig?

SprinterSB
24.11.2005, 10:44
Ja, einfach ein R in die Signalleitung.

Falls tatsächlich Daten zu übertragen sind, ist SPI am schnellsten und einfachsten.

Wenn ein AVR nix zu tun hat während der andere arbeitet und nur auf das Handshake vom andern wartet bzw die Kontrolle abgibt und danach idle ist, hast du nicht viel gewonnen durch die Parallelisierung... Mehr Ports kannst du auch mit nem grösseren Bruder haben.

Hellmut
24.11.2005, 16:43
Hallo SprinterSB

Es geht im zeitkritischen Teil nicht um Datenübertragung. Die Motorsteuerung, mit der Endstufe basierend auf der diskreten Lösung von stupsi, soll eine intelligente Winde ergeben. Damit muß diese die Impulslängen vom RC-Empfänger auswerten können, soll über I2C mit anderen Motorsteuerungen und der RN-Control kommunizieren können und soll die PWM erzeugen. Zu guter Letzt auch noch die Impulstripel vom Inkrementalwertgeber auswerten und eigenständig den Motor steuern. Die anspruchvollste Anwendung wird die Steuerung meiner Genua sein. Da müssen 2 Motor gesteuert werden, einer für jede Winsch. Die Steuerung soll z.B. auf einen Befehl von einem 3-Positionen Kippschalter das Genuasegel z.B. von Steuerbord nach Backbord bringen und dort die gleiche Trimmung herstellen die zuvor anlag! Dabei will ich testen ob ich das Genuasegel nicht auch "asymetrisch" steuern kann und damit quasi wie einen asymetrischen Spinnaker betreiben. Hierzu muß die Motorsteuerung die Stellung von 2 Kippschaltern und einem Proportionalkanal auswerten und das von mir gewollte tun. Die Steuerung muß also "Positionen" kennen, die aktuelle Position gleichfalls, und geziehlt Positionen berechnen und anfahren können. Als kleiner Schmankerl am Rande auch noch ein Relai der bei jedem Motor einen mechanische Bremse lüften wenn er eine Position verändern will!

Das alles geht definitiv nicht mit einem mega8, deshalb für den Versuchsaufbau dieser "virtuelle super mega8"!