- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Atmega 8 Timer

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

    E-Bike
    Ja, kann ich nachvollziehen. Wobei nicht unbedingt 200 ms nachdem Takt auf L gegangen ist sondern 200 ms nach der letzten steigenden Flanke. Dürfte aber in der Realität keine Auswirkungen haben.

    Ich werde das ganze heute abend mal zusammenlöten und die Enable auf H setzten. Dann kann ich überprüfen ob Takt und Richtung durchgereicht werden (Richtung hatte ich nicht erwähnt, weil in diesem Zusammenhang nicht relevant).

    Danke und bis später.

    PS: Aufgrund anderer Aktivitäten (Familie, Job, andere Hobbys) probiere ich einiges erst mit Verzögerung aus. Ich gebe aber auf jeden Fall ein Feedback.

    Gruß

    Kalle

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    16.09.2009
    Ort
    Haltern am See
    Beiträge
    9
    sooo, langsam kommen wir der Lösung näher.

    Hier mein Entwurf (allerdings nur für die X-Achse. Wenn das läuft ziehe ich Y und Z nach).

    Da der Takt im Ruhezustand auf H liegt, musste die Abfrage angepasst werden.

    Meine Idee:

    Wenn Ausgang auf L (von der letzten Schleife gleich Eingang gesetzt) und Eingang auf H dann liegt eine steigende Flanke also neuer Takt vor und Enable geht auf H und der Zähler für X wird auf 0 gesetzt.

    Hier mein Programm. Bitte einmal den Syntax chekken. Da bin ich nicht Sattelfest, da ich mich im wesentlichen mit der Hardware beschäftge und nur im Problemfall zu einem Programm greife (kann sich aber ändern )

    Gruß

    Kalle

    Hier das Programm
    Angehängte Dateien Angehängte Dateien

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Moin Kalle!

    Kannst du das Programm bitte nochmal reinstellen, und dabei mit "Code-Tags" kennzeichnen? (die kleinen Schaltflächen neben "Nachrichtehtext"...). Dann kann man auch ohne installiertes Bascom den Code lesen

    Gruß,

    Daniel

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    16.09.2009
    Ort
    Haltern am See
    Beiträge
    9
    Ist ja genial,

    Ich glaube, es liegt an den "If then" Abfragen. Besonders den Codeschnipsel "If Signalbit =1 then Signalbit = 0 habe ich nicht verstanden. Werden die weiteren Abfragen nur ausgeführt, wenn die bedingung erfüllt ist? (also If PIND.1 =0 usw. nur wenn die erste Bedingung erfüllt ist?

    Hier der Code


    Code:
    'CNC Stepper.bas
    'Stepperdriver
    '____________________________________________
    'Der Atmega wird zwischen Centronics und L 297 geschaltet, um je Richtung
    ' Enable (H aktiv) aus dem Takt zu generieren.
    'Taklt wird bei Ansteigender Flanke aktiv
    $regfile = "m8def.dat"
    $crystal = 10000000                                         'Quarz 10 MHz
    '
    
    
    Dim Signalbit As Bit
    Dim Zeitx As Byte
    
    Config Timer1 = Timer , Prescale = 8
    
    
    Timer1_isr:
    Signalbit = 1
    Timer1 = 55535
    Return
    
    Ddrd = &B11000000                                           'Port D-Pins 0-5 Eingang
    Ddrb = &B11111111                                           'Port B Ausgang
    Ddrc = &B11111111                                           'Port C Ausgang
    
    
    Portc.3 = Pind.0                                            'Richtung X
    Portc.0 = Pind.2                                            'Richtung Y
    Portd.6 = Pind.4                                            'Richtung Z
    
    Portd.7 = Pind.1                                            'Takt X
    Portc.1 = Pind.3                                            'Takt Y
    Portc.4 = Pind.5                                            'Takt Z
    
    Main:
    
    If Pind.1 = 0 And Portd.7 = 1 Then                          'Wenn seit dem letzten Loop Ausgang noch auf 0 und Eingang auf 1 dann Steigende Flanke
    Portb.0 = 1
    ZeitX=0
    End If
    
    If Signalbit = 1 Then
    Signalbit = 0
    
    If Pind.1 = 1 And Portb.0 = 1 Then                          'Takt vorbei, aber enable noch H
    Zeitx = Zeitx + 1
    End If
    End If
    
    
    
    Portd.7 = Pind.1
    
    
    If Zeitx = 20 Then
    Portb.0 = 0
    Zeitx = 0
    End If
    
    
    Goto Main

    Gruß und danke

    Kalle

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Genau so ist es: Alles zwischen "If...then" und "end if" wird nur ausgeführt, wenn die Bedingung erfüllt ist, und übersprungen, wenn sie es nicht ist.

    Ein paar Fehlerchen sind mir noch aufgefallen:

    1. Die Hauptschleife kennzeichnet man am besten mit "Do" und "Loop" anstatt mit Main und Goto main.

    2. Diese Zeilen:
    Code:
    Portc.3 = Pind.0                                            'Richtung X
    Portc.0 = Pind.2                                            'Richtung Y
    Portd.6 = Pind.4                                            'Richtung Z
    
    Portd.7 = Pind.1                                            'Takt X
    Portc.1 = Pind.3                                            'Takt Y
    Portc.4 = Pind.5                                            'Takt Z
    müssen unbedingt in die Hauptschleife - sonst wird der Eingangs-Status ja nur ein einziges mal auf die Ausgänge weitergegeben, und alle Änderungen an den Eingängen würden ins leere laufen.

    3. Interrupt-Routinen sollten eigentlich immer hinter dem "Loop" stehen

    4. Damit der Timer-Überlauf-Interrupt ausgeführt werden kann, musst Du

    a. definieren, wie die Timer-ISR heißt
    b. den speziellen Timer-Interrupt freigeben, und
    c. die Interrupts allgemein freigeben.

    Und das ganze am Besten VOR der Do-Loop-Schleife. In Code sähe das etwa so aus:

    Code:
    Config Timer1 = timer, Prescaler = 8
    On Timer1 Timer1_ISR          'so heißt die Timer1-ISR. Kann auch jeder andere Name sein!
    Enable Timer1                'aktiviert NICHT den Timer, sondern den Timer-Interrupt!!
    Enable Interrupts       'aktiviert Interrupts allgemein

    Das ganze Schritt für Schritt zu programmieren ist sicher eine gute Idee - erstmal bei fest stehenden Enables die Eingangssignale auf den Ausgängen auszugeben, und dann Funktion für Funktion dazuprogrammieren.

    Gutes Gelingen - bin gespannt auf feedback!

    Gruß,

    Daniel

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    16.09.2009
    Ort
    Haltern am See
    Beiträge
    9
    Sooo, langsam wird es was. Ich habe mir noch einmal das Buch zur Hand genommen und augehend von einem dort beschriebenen Programm das Ganze angepasst.

    Wie gesagt nur für X (Yun Z folgen ggf noch am WE

    Hier der Code:

    Code:
    'CNC Stepper.bas
    'Stepperdriver
    '____________________________________________
    'Der Atmega wird zwischen Centronics und L 297 geschaltet, um je Richtung
    ' Enable (H aktiv) aus dem Takt zu generieren.
    'Taklt wird bei Ansteigender Flanke aktiv
    $regfile = "m8def.dat"
    $crystal = 10000000                                         'Quarz 10 MHz
    '
    
    
    Dim Signalbit As Bit
    
    Dim Zeitx As Word
    
    On Timer0 Ontimer0                                          'Interrupt-Routine für Timer0-Overflow
    Config Timer0 = Timer , Prescale = 1024                     'Timer-Takt ist Quarz/1024
    Enable Timer0                                               'Timer0-Overflow-Interrupt ein
    Enable Interrupts                                           'Interrupts global zulassen
    
    
    Ddrd = &B11000000                                           'Port D-Pins 0-5 Eingang
    Ddrb = &B11111111                                           'Port B Ausgang
    Ddrc = &B11111111                                           'Port C Ausgang
    
    
    Portd.7 = Pind.1                                            'Takt X
    Portc.1 = Pind.3                                            'Takt Y
    Portc.4 = Pind.5                                            'Takt Z
    
    Do
    
    
    
    
    If Pind.1 = 1 And Portd.7 = 0 Then Zeitx = 0
    If Pind.1 = 0 And Portd.7 = 1 Then Zeitx = 0
    If Zeitx < 10 Then Portb.0 = 1 Else Portb.0 = 0
    If Zeitx > 1000 Then Zeitx = 100
    
    Portc.3 = Pind.0                                            'Richtung X
    Portc.0 = Pind.2                                            'Richtung Y
    Portd.6 = Pind.4                                            'Richtung Z
    
    Portd.7 = Pind.1
    
    Loop
    
    Ontimer0:
    Zeitx = Zeitx + 1                                           'Timer0-Overflow-Interrupt-Routine
    
    Return
    Ich setzte einfach bei unterschiedlichem Ein und Ausgang die Zeit auf Null.

    Bei Zeit kleiner n (im moment 10) ist Enable auf H.

    Damit nicht beim Überlauf Enable auf H geht setze ich einfach bei Zeitx größer 1000 die Zeit wieder auf 100.

    Es geht bestimmt auch schöner, aber es klappt.

    Nur die Richtugsänderung wird noch nicht durchgereicht. Der Stepper läuft immer in die selbe Richtung. Den Fehler werde ich aber noch finden.

    Erst einmal Schluss für Heute

    Gruß

    Kalle

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress