- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: Atmega32 Pins/Ports : Welchen am "besten" für was

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Anzeige

    Powerstation Test
    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

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2006
    Ort
    Gründau
    Alter
    37
    Beiträge
    19
    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.

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von Somebuddy
    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

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2006
    Ort
    Gründau
    Alter
    37
    Beiträge
    19
    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 ?

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    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.

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test