PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega32 Pins/Ports : Welchen am "besten" für was



Somebuddy
08.05.2009, 16:31
Hey ho,

Ich bin gerade am aufbauen einer kleinen Prototyp Platine. Die gewünschte funktion später ist erstmal egal. Ich bräuchte nur ein wenig hilfe bei den Anschlüssen der entsprechenden Komponente an den Atmega32.

Nicht dass ich mir durch evtl. Layout fehler selbst steine in den Weg lege wie zum beispiel einen wichtigen " Timer Interrupt "Eingang" durch einen Taster belegen usw.

Ich bin auf diesem Gebiet noch nicht ganz so bewandert daher meine Frage an euch:

http://www.futurlec.com/Pictures/ATMega32.gif

Angeschlossen an den Atmega sollen:

6 x Taster
1x LCD Display in 4 Bit Mode
1x Mosfet für PWM Motorreglung
1x Ausgang um Lüfter zu schalten ( Transistor ) evtl. SIL Relays.
1x ICP Schnittstelle zur Programmierung wenns geht ohne Multiplexen ;)
1x Eingang zum auslesen eines Tachosignals eines PC Lüfters.
4x Ausgänge zur Servo Steurung
4x Ausgänge für 2 Farbige LED also für 4 Leds eher 8 Ausgänge um sie zweifarbig zu schalten ? oder sehe ich das falsch ?


jetzt die erste Frage ? ist das überhaupt alles mit einem einzigen Atmega32 zu bewältigen bei 16MHz ?

Ich brauche ja je einen Timer für Servos , Motor PWM , das Display und um das Tachosignal auszulesen ? Oder brauche ich für das Display keinen Timer ? hätte ja sonst einen zu wenig !? oder !?
Nur welchen Timer für welche Komponente ? und an welchen Pin schließe ich das Tachosignal des Lüfters an ?


im moment habe ich folgende Konfiguration:

PC0-PC5 : LCD Display

alles weitere ist "offen"

wo würdet ihr den Rest anschließen ? sodass ich alle Pins richtig vergeben habe ?


Vielen Vielen Dank schonmal,

Grüße,

Teslafan
08.05.2009, 16:45
Ich bin zwar auch noch Neuling im Bereich Microcontroller, habe aber mein Board mit Hilfe der schon fertigen im Download Bereich befindlichen Schaltpläne erstellt.
Einfach alle ausdrucken nebeneinander legen und dann wird einem das meißte auch klar. Dort findet man auch einige Boards mit Servo und LCD Anschlüssen.
Kannst sie dir ja mal ansehen :)

Gruß Andi

Somebuddy
08.05.2009, 17:06
danke schonmal :)
ja das ist mir schon klar :) wie ich alles einzeln irgendwie zum laufen bekomme..
aber bei den vielen komponenten wirds problematisch :)
ich weiß zum beispiel nicht welchen pin ich brauche um das tacho signal vom pc lüfter auszulesen..
welchen timer ich dazu am besten verwende und inwiefern sich das mit der servo ansteurung , dem lcd und der motor pwm verträgt..

usw..

bräuchte im prinzip eine anweisung die mir sagt.. lcd --> pd0-pd4 usw...
tacho --> pc1 z.B.

Teslafan
08.05.2009, 17:51
OK das ist noch zu hoch für mich, würde mich aber auch interessieren da ich auch noch ein board für meine servos erstellen muß :)

mycroc
08.05.2009, 20:08
Da hatt sicher jeder andere vorstellungen wie es am besten ist. Aleine das Tachosignal kann man z.b. mit den Tx pins oder den INTx pins oder dem ICP1 pin auswerten. Wenn das "Hauptprogramm" nicht zu lang wird kann auch jeder andere pin genutzt werden. Wenn du AVR technisch noch am anfang stehst mein tip. Alle möglichkeiten einmal austesten.

Klingon77
08.05.2009, 23:41
hi,

bin auch Neuling bei den AVR´s.

Einen Hinweis hätte ich doch für Dich:

Mach zwei mögliche Ausgänge und Treiberstufen für Motor-PWM.

Die meisten Robby´s laufen mit zwei Motorsteuerungen.


Evtl. gäbe es eine Möglichkeit die markanten PIN´s über ein oder zwei "Mäuseklaviere" oder Steckbrücken auf unterschiedliche Ausgänge zu schalten?
Dann bleibst Du flexibel.

liebe Grüße,

Klingon77

for_ro
09.05.2009, 01:01
Zunächst ist es einmal wichtig, dass du dir überlegst, welche Funktionen du mit Hardware unterstützen willst oder musst.
Die AVRs haben Hardware an Bord, die dir erlaubt, unabhängig vom Programm bestimmte Aktionen auszuführen.
Willst du z.B. ein oder mehrere PWM Signale ausgeben, dann ist es sinnvoll, dafür die Ausgänge OC0, OC1A, OC1B und OC2 zu benutzen. Dann können diese Signale von den Timern ausgegeben werden, ohne dass du in deinem Programm dauernd dafür etwas tun musst.
Ebenso beim Tacho Signal. Dafür kannst du den ICP1 nehmen.
Die ADC Eingänge musst du nehmen, wenn du analoge Signale auswerten willst.
Falls du schnelle Signale hast, auf die du unmittelbar reagieren willst, dann nimmst du dafür die externen Interrupt Eingänge INT0 - INT2.
Hardware SPI über MISO, MOSI, SS und SCK.
Für I2C sind es die Pins SDA und SCL.
Wenn du das alles abgeklopft hast, kannst du für ein LCD die dann noch frei bleibenden Pins nehmen. Bei den Graphik LCDs müssen diese allerdings häufig auf einem Port liegen.
LEDs und Taster kannst du sowieso über jeden beliebigen Pin steuern.

Gruß

Rolf

Somebuddy
09.05.2009, 11:12
danke danke danke :)
echt super community hier was hilfsbereitschaft angeht :) bin begeistert :)

okay.. dann werde ich mal alles verkabeln und schauen ob dann am ende alles so geht wie ich will :)


kann ich denn mit den 3 timern des atmega 32 gleichzeitig : LCD , 4 Servos , 1 Motor PWM , und lüfterdrehzahl auslesen ?

for_ro
09.05.2009, 12:25
Für das LCD brauchst du keinen Timer.
Die Servos gehen über Timer0 oder Timer1.
Für PWM brauchst du auch einen Timer. Da kommt es auf die Auflösung an. Timer1 ist 16bit, du kannst also 65536 verschiedene Ein/Aus Verhältnisse einstellen. Beim Timer2 (8bit) sind es nur 256, was aber in der Regel auch reicht. Dies kann vollkommen in Hardware laufen, also ohne ISR. Dann kannst du den Timer allerdings nicht mehr für etwas anderes benutzen.
Ansonsten kannst du in der ISR des Timers Variablen hochzählen, Flags setzen oder Ausgänge schalten. Da könntest du dann auch das Tachosignal einlesen, wenn die Abtastrate mit der Frequenz des Signals passt. Minimum wäre 3 mal schneller abtasten als das schnellste Signal, damit du sicher jede Pegeländerung mitbekommst. Also bei 3000 U/min (50U/sec) abtasten mit min. 150Hz.
Möglichst wenige Befehle in der ISR ist übrigens die Grundregel.
Das Aufrufen einer ISR ist allerdings eine zeitaufwändige Sache. Daher ist es meist nicht so gut, eine ISR sehr schnell aufzurufen. Als absolutes Maximum würde ich etwa $crystal/100 sehen.
Timer0: Servos
Timer2: PWM
Timer1: Alles andere

Gruß

Rolf

Somebuddy
09.05.2009, 14:55
vielen dank.. das hat mich wirklich weitergebracht..

wenn ich timer2 für die pwm nehme muss ich dann mit dem gate des mosfet an OC2 ( PD7 ) meine atmega32 wenn ich es komplett in hardware laufen lassen will ? habe ich das richtig verstanden ?

ist dann nur PD7 für die pwm reserviert oder kann ich dann den kompletten PORTD nicht mehr anderweitig nutzen ?

also wäre es möglich timer 0 für servos
timer 1 = drehzahl auslesen
timer 2 = pwm ?

die "standart" delay() funktion !? nutzt die nicht auch einen timer ? muss ich da etwas beachten ?

grüße,

for_ro
09.05.2009, 15:22
Denk dran, dass auf PD.0 und PD.1 die RS232 Pins liegen. Falls du mit dem PC oder so kommunizieren willst, solltest du die freilassen. Also wären dann noch PD.2 bis PD.6 übrig. Wenn du nur ein Text LCD hast, kannst du normalerweise die Pins vollkommen beliebig legen.
Delay oder Wait benutzt man nur, wenn es nicht anders geht. Lieber die Kontrolle im Timer1 lassen und dort nur Flags zur richtigen Zeit setzen und die in der Haupt-Schleife abfragen und zurücksetzen.

Gruß

Rolf

Somebuddy
09.05.2009, 15:38
ja aber die vorgefertige lcd routine von mikrokontroller.net nutzt doch auch die delay oder ?
also brauche ich dafür doch einen timer !?

rs232 brauche ich bei diesem projekt nicht.

for_ro
09.05.2009, 17:02
ja aber die vorgefertige lcd routine von mikrokontroller.net nutzt doch auch die delay oder ?

Die kenne ich nicht.
Du programmierst wahrscheinlich in C, da kann ich dir eh nicht helfen.

Gruß

Rolf

Somebuddy
09.05.2009, 22:50
kann ich eine 4 servo steurung mit dem timer0 ( 8 bit Timer ) meines Atmega32 bei 16Mhz realisieren oder muss ich den 16 bit timer nehmen ?
laut meiner rechnung macht der ja bei einem vorteiler von 1024 bei einer MS schon 156 schritte da bekomme ich ja nie 20ms hin !? oder versthe ich da was falsch ?

wkrug
10.05.2009, 09:43
Bei einigen Compilern ist die Zuordnung der Pins für das LCD Display nicht frei wählbar.
Es wird dann ein kompletter Port benötigt.
Ich verwende da am liebsten immer den kompletten Port.C.
Da liegt allerdings die JTAG Schnittstelle und der i²C Bus drauf, wenn Du also eines von diesen beiden nutzen willst, kannst Du diesen Port nicht verwenden.
Denk bitte daran die JTAGEN Fuse zu disablen - Die ist im Auslieferungszustand immer aktiv und beeinflusst die Funktion von Port.C

Die A/D Wandler liegen ja auf dem Port.A.
Du kannst aber ohne weiteres z.B. nur 3 A/D Wandler verwenden und an die verbliebenen 5 Pins Taster anschließen.

Alles was mit Impulsen angesteuert wird, deren Zeiten erfasst werden sollen, werden sinnvollerweise über ICP oder einen Interrupteingang abgewickelt.
Dabei kann z.B. der Timer 1 notfalls auch mehrere Aufgaben übernehmen, wenn der Prescaler passt und der gewünschte Modus das Register TCNT1 nicht beinflusst.
Also ICP1 + die meisten PWM Modes gehen nicht, weil dabei der Zähler TCNT1 entweder rauf und wieder runter zählt, oder TCNT1 immer wieder auf 0 gestellt wir. Das gleiche gilt für den CTC ( Clear Timer on Comparematch ) Mode.
Ein fast PWM Mode mit TOP Value 0xFFFF geht mit ICP, weil dort das TCNT1 Register frei läuft und nur aufwärts zählt.

Ich würde solche Doppelbelegungen mit PWM aber nur machen wenn nichts anderes mehr geht.
Comparematch Interrupts + ICP laufen dagagen problemlos, wenn man den CTC Modus nicht nutzt und das TCNT Register in Ruhe lässt.

Der Rest wurde hier schon gesagt - das möchte ich nicht nochmal wiederholen.

@Somebuddy

kann ich eine 4 servo steurung mit dem timer0 ( 8 bit Timer ) meines Atmega32 bei 16Mhz realisieren oder muss ich den 16 bit timer nehmen ?
Das kannst Du sicher machen, ratsam ist es aber nicht.
Wenn du eine einigermassen vernünftige Auflösung kriegen willst musst Du mit mindestens einem Überlaufregister arbeiten.
Die Routinen werden dann sehr schnell aufwändig und damit Rechenintensiv.

Ich nehm dafür lieber den Timer1 mit Prescaler 8 ( bei 8MHz ) und die beiden Comparematches A + B.
Der Comparematch A Interupt Routine schaltet dabei nach der gewünschten Servolänge den jeweiligen Ausgang ab und setzt das Register für Comparematch B ( das bestimmt die Pausenzeiten zwischen 2 Impulsen TCNT1 + PauseZeit ). Der Comparematch B Interrupt setzt den nächsten gewünschten Ausgang und stellt die gewünschte Impulszeit für den Comparematch A Interrupt wieder ein ( TCNT1+ ImpulsZeit )
Comparematch A Register.
Die Länge der Pausezeit ist von den gewünschten Kanälen abhängig.
Je mehr Kanäle bearbeitet werden, umso kürzer muß diese Werden, damit jedes Servo nach ca. 20ms wieder einen neuen Impuls kriegt.

Schema also.
Kanal1 + Pause(4ms) + Kanal2 + Pause(4ms) + Kanal3 + Pause(4ms) + Kanal4 + Pause(4ms)
dann geht es wieder von vorne los.

Bei 2 Kanälen würde nur die Pause länger.
Kanal1 + Pause(9ms) + Kanal2 + Pause(9ms).

Diese Methode benötigt nur ein paar Zählvariablen, Port Setz- und Clear Befehle, läuft komplett im Interrupt und kann notfalls sogar in Assembler geproggt werden.
Die Auflösung beträgt dabei 1000 Schritte für einen Servo Vollausschlag.
Die Methode ist sehr einfach erweiterbar auf bis zu 8...9 Servos.
Dann werden die Pausenzeiten schön langsam zu kurz.
Noch ein Vorteil:
Das TCNT1 Register wird dabei ja nicht beeinflusst.
ICP ist somit also auch noch Problemlos machbar.