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.
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
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.
Die kenne ich nicht.Zitat von Somebuddy
Du programmierst wahrscheinlich in C, da kann ich dir eh nicht helfen.
Gruß
Rolf
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 ?
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
Das kannst Du sicher machen, ratsam ist es aber nicht.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 ?
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.
Lesezeichen