-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Atmega 8 Timer

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    16.09.2009
    Ort
    Haltern am See
    Beiträge
    9

    Atmega 8 Timer

    Anzeige

    Hallo Experten,
    bin Neuling. Habe das Buch von Roland Walter gelesen (alles bis auf Timer auch verstanden).

    Hier mein Problem:
    Ich habe einen Atmega 8 mit 12 MHz Quarz zwischen PC und Steppertreiber
    geschaltet (Parallelport).

    Sinn??

    Der PC liefert Takt und Richtung für X,Y,Z getrennt, Enable
    jedoch nur einmal. Problem, wenn ein Motor läuft bekommen die anderen
    beiden Strom und werden heiß.

    Lösung:

    Signal Takt über ATMEGA

    Takt Eingang X=PD0; Y=PD3; Z=PD5
    Takt Augang X=PD7; Y=PC1; Z=PC4

    Enable X=PB0 ;Y=PC2; Z=PC4

    Je ein Timer soll bei jedem Takt neu gestartet werden und Enable bis 200 mS nach dem letzten Takt auf H halten (aber nicht nach
    jedem Takt abschalten, sondern nur, wenn nach 20 ms keinneuer Takt folgt).

    Für einen Lösungsansatz mit Bascom wäre ich dankbar.

    Gruß

    Kalle

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Habe das Buch von Roland Walter gelesen
    Sehr gut - m.E. das Beste für den ersten Einstieg, was zur Zeit erhältlich ist

    Wenn Enable für 200 ms nach dem letzten Takt auf H gehalten werden soll, aber auf L gehen soll wenn nach 20 ms kein neuer Takt kommt - widerspricht sich das nicht? Vielleicht stehe ich ja auch nur auf der Leitung, denn ich hatte bisher noch keinen nennenswerten Kontakt zu Steppern...

    Vielleicht kannst Du´s ja nochmal etwas genauer erklären - eine Lösung gibt´s bestimmt!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    16.09.2009
    Ort
    Haltern am See
    Beiträge
    9
    Sorry, Tippfehler, natürlich muss es heissen "wenn nach 200 ms kein neuer Takt kommt"

    Gruß

    Kalle

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Okay - also nochmal zusammengefasst:

    Das Signal an D.0 soll an D.7 ausgegeben werden, D.3 an C.1 und D.5 an C.4.

    Jedesmal wenn ein Ein- bzw. Ausgang H wird, soll der korrespondierende Enable-Pin (B.0, C.2 und C.4, der ist allerdings schonmal verwendet...) auf H gehen, und wieder auf L, wenn der dazugehörige Ein- bzw. Ausgang für 200ms L ist.

    Korrekt?

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    16.09.2009
    Ort
    Haltern am See
    Beiträge
    9
    o.k. ich merke schon, das man beim programmieren genau sein muss und die Fragen nicht so nebenbei formuliert werden können.

    Hier noch einmal die richtige Zuordnung (hat praktische Gründe, um beim Layout Kreuzungen zu vermeiden)

    Takt Eingang X=D1;Y=D3;Z=D5

    Takt Ausgang X= D7;Y=C1;Z=C4

    Enable (Ausgang) X=B0;Y=C2;Z=C5

    also keine Doppelbelegung.

    die 200 ms sind zunächst ein Schätzwert, kann auch 500 ms oder 1 S sein.


    Enable muss also so lane H sein, wie der Motor läuft. Den Ausgang wollte ich bei jedem Takt um n ms verzögern damit die Motortreiber aufgrund von Enable freigeschaltet werden.

    Ich wollte für alle Richtungen folgendes ausprobieren:

    If Eingang ungleich Ausgang dann Timer zurücksetzen und Ausgang gleich Eingang; nächste Abfrage. Danke , dass du dir Gedanken machst.

    Gruß

    Kalle

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Okay - so langsam nimmt´s Formen an.

    Sicherlich gibt´s viele Wege die nach Rom führen. Ich würde mir als Kernstück einen Timer so einstellen, dass er z.B. alle 10ms überläuft und ein Signalbit setzt. Also z.B. Timer 1 mit einem Prescaler von 16, d.h. einer Zählfrequenz von 1MHz, vorgeladen mit einem Wert von 55535.

    Neben dem Signalbit wirst Du 3 Zeit-Variablen brauchen, die die vergangene Zeit seit dem letzten H-L-Wechsel zählen. Nennen wir sie ZeitX, ZeitY und ZeitZ, jeweils als Byte dimensioniert.


    Die Hauptschleife würde ich immer damit beginnen, die Ausgänge gleich den Eingängen zu setzen, also
    Code:
    PORTD.7 = PIND.1
    PORTC.1 = PIND.3
    PORTC.4 = PIND.5
    Dann müssen die Enables auf H gesetzt werden, wenn die Eingänge H führen:

    Code:
    If PIND.1 = 1 then
    PORTB.0 = 1
    End if
    
    If PIND.3 = 1 then
    PORTC.2 = 1
    End if
    
    If PIND.5 = 1 then
    PORTC.5 = 1
    End if

    Alle 10ms, wird gecheckt, ob einer der drei Takte schon abgelaufen ist, der Enable-Ausgang aber noch H ist. In diesem Fall wird die dazugehörende Zeitzähl-Variable alle 10ms um 1 erhöht:

    Code:
    If Signalbit = 1 then
      Signalbit = 0  
      If PIND.1 = 0 AND PORTB.0 = 1  then  'Takt ist vorbei, aber enable noch H
      ZeitX = ZeitX + 1  'ZeitX erhöht sich alle 10ms um 1
      End if
     
     If PIND.3 = 0 AND PORTC.2 = 1 then
     ZeitY = ZeitY + 1
     End if
    
     If PIND.5 = 0 AND PORTC.5 = 1 then
     ZeitZ = ZeitZ + 1
     End if
    
    End if
    Am Schluss der Hauptschleife checkst Du dann, ob eine der drei Zeitzähl-Variablen 20 erreicht hat (für 200ms, ansonsten entsprechend höhere Werte). Ist dies der fall, wird der Enable-Ausgang auf L gesetzt und die Zeitzähl-Variable auf 0 zurückgesetzt:

    Code:
    If ZeitX = 20 then
    PORTB.0=0       'Enable-Ausgang auf L
    ZeitX=0           'Zeitzähl-Variable rücksetzen
    End if
    
    If ZeitY = 20 then
    PORTC.2 = 0
    ZeitY = 0
    End if
    
    If ZeitZ = 20 then
    PORTC.5 = 0
    ZeitZ = 0
    End if
    Zu guter Letzt noch die Timer1-ISR:

    Code:
    Timer1_ISR:
    Signalbit = 1
    Timer1=55535
    Return
    Vorausgesetzt dass ich dein Problem richtig verstanden habe, könnte es so klappen. Ich hoffe, es ist nicht allzu verwirrend...

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    16.09.2009
    Ort
    Haltern am See
    Beiträge
    9
    Hallo und vielen Dank,
    ich habe die Antwort überflogen und im Kopf sehe ich den Programmverlauf. Leider komme ich erst am WE dzu, das ganze auszuprobieren.

    Ich gebe Montag eine Info, was das Programm mit den Treibern macht.

    Gruß
    und ein schönes WE

    Kalle

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    War schon spät gestern Abend... Natürlich müssen die Zeitzähl-Variablen auch wieder auf 0 zurückgesetzt werden, wenn ein neuer Takt anfängt. Also am besten dort, wo die Enables auf H gesetzt werden, wenn der entsprechende Eingang H ist.

    Schönes WE - bin gespannt, ob´s klappt

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    16.09.2009
    Ort
    Haltern am See
    Beiträge
    9
    o.k.
    da bin ich wieder. Leider hat die Herstellung der Platine länger als geplant gedauert. Klappt leider noch nicht. Ich sehe das Problem in der Zuordnung der Ausgänge. Die Enables müssen auf H gesetzt werden, wenn der Eingang von L auf H wechselt. Also die steigende Flanke ist entscheident. Gibt es einen Befehl, der die Flanke abfragt und dann die Enables auf H setzt.

    Ich hoffe, wir kommen weiter.

    Gruß

    Kalle

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Klar kommen wir weiter!

    Aber die Enables sollen doch (wenn ich alles richtig verstanden habe) nicht nur während der L/H-Flanke auf H gehen, sondern während der gesamten H-Phase des Eingangssignals und noch etwa 200 ms darüber hinaus H bleiben, oder?

    Deshalb würde ich es qualitativ so machen:

    1. Wenn Eingang=H, dann Ausgang=H, Enable=H und Anzahl der "Zeitticks"=0.
    2. Wenn Eingang=L, dann Ausgang=L.
    3. Wenn Eingang=L und Enable=H, dann 10ms-"Zeitticks" zählen
    4. Wenn Eingang=L und Enable=H und 20 "Zeitticks" gezählt sind, dann Enable=L.

    Kannst Du meine Gedanken ansatzweise nachvollziehen?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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