-         

Ergebnis 1 bis 1 von 1

Thema: Ansteuerung RN-Stepp297 mit div. Extras - Fragen zum Programm

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    02.04.2009
    Beiträge
    78

    Ansteuerung RN-Stepp297 mit div. Extras - Fragen zum Programm

    Anzeige

    Hallo RN,

    ich hab leider zu wenig Erfahrung mit den Atmels, kann löten und Sachen zum Laufen bringen, aber das Proggen ist nicht meine Stärke. LEDs hab ich allerdings schon zum Laufen gebracht.

    Ich möchte mit der hier bekannten L297/298 Stepperplatine RN_Step297 einen kleinen Schrittmotor laufen lassen, der kaum Last treiben muss, er muss lediglich einen Rotor mit zwei Magneten tragen, der bewegt werden soll.
    Als Steuerhardware habe ich lediglich einen Power-Schalter und einen Pollin Drehencoder mit Taster, den Ihr sicher alle kennt, billig, mit Tücken, aber wohl doch brauchbar mit der entspr. Routine.
    Angesteuert von einem Attiny 2313, an dem der Drehencoder mit Taster hängt.

    Das ganze Teil soll einmal wie folgt zucken:
    Nach dem Einschalten erst mal Standby, Motor stromlos.
    Ein Druck auf den Taster des Encoders soll den Motor starten, mit min. 24 Halbschritte, max 240 Halbschritte.
    Mit dem Drehencoder soll man nun schrittweise, z.B in 24er Schritten den Stepper schneller und auch wieder langsamer drehen lassen können.

    Ein weiterer Druck auf den Taster soll während der Motor läuft, eine Routine aufrufen, die dem Motor 4 x 48 Steps in die eine Richtung, dann in die andere Richtung laufen lassen.

    Geht das überhaupt so prinzipiell oder brauche ich einen zusätzlichen Taster?


    Was mir überhaupt noch nicht klar ist, wie ich die einzelnen Schritte in ein Bascom Programm bringe.
    Eine erste Überlegung geht von zwei Interrupts mit den beiden Timern des 2313 aus, der erste mit 1ms Abfrage für den Drehencoder und der Statemachine , der zweite soll den Takt machen (24-240 steps).

    Aber wie muss das Hauptprogramm aussehen, was gehört an den Anfang, was ans Ende?

    Uff.

    Die beiden Timer belegen ja schon die Interrupts. Oder kann man noch einen externen Interrupt mit dem Taster nutzen, mit dem man diese Drehhin-Drehher Routine schalten kann?

    Ich hab mal sehr grob das Testprogramm modifiziert.
    Bitte helft mir mal beim Nachdenken.
    Ich hab das R.Walter Buch und das Kühnel zur Programmierung von Atmels, aber ich kriege die Teilstücke nicht zusammen.


    '************************************************* ******************************
    '*** Testprogramm für POLLIN Dreh-Encoder PANASONIC EVEQDBRL416B ***
    '*** Best.Nr. 240 313 ***
    '************************************************* ******************************
    '*** Author: Screwdriver ***
    '*** Datum: 29.08.2009 ***
    '************************************************* ******************************
    '*** Algorithmus: Statemaschine mit 3 Zuständen ***
    '************************************************* ******************************

    '************************************************* ******************************
    '*** Konfiguration ***
    '************************************************* ******************************
    'AVR
    $regfile = "Attiny2313.dat"

    $crystal = 8000000


    'System-Timer für periodische Encoder-Abfrage
    Config Timer0 = Timer , Prescale = 64
    On Timer0 Isr_timer0
    Enable Timer0
    Const Timer0_reload = 131 'Wert für 1ms

    'Drehencoder
    Config Portd.1 = Input : Set Portd.1 : Ph_a Alias Pind.1 'Encoder Signal A
    Config Portd.0 = Input : Set Portd.0 : Ph_b Alias Pind.0 'Encoder Signal B

    '************************************************* ******************************
    '*** Variablen ***
    '************************************************* ******************************
    'Variablen
    Dim Rotary0 As Byte 'Aktueller Rasterwert (A,B)
    Dim Rotary1 As Byte 'Übergangswert (A,B) zwischen Rastungen
    Dim Rotary2 As Byte 'Letzter Rasterwert (A,B)
    Dim Rotary As Byte 'Zahlenwert des Encoders

    Dim Rotary_last As Byte 'Letzter Encoder-Wert (nur für Demo)


    Config Timer1 = Timer , Prescale = 8
    On timer1 Isrtimer1
    Const Timer1_reload = 44703 'Vorgabe für 48Steps/sec
    Enable Timer1




    '************************************************* ******************************
    '*** HAUPTPROGRAMM ***
    '************************************************* ******************************
    Enable Interrupts

    Do

    If Rotary_last <> Rotary Then 'Encoder gedreht?
    Rotary_last = Rotary 'Neue Stellung merken
    Print Rotary 'und Encoder-Wert ausgeben
    Und Wie Übergebe Ich Diesen Wert An Den Timer1 Damit Der Entsprechend Schneller / Langsamer ZähltPrint

    End If


    Hier muss doch bestimmt noch was hin ins Hauptprogramm



    Loop

    '************************************************* ******************************
    '*** ISR_TIMER0 ***
    '*** Periodische Auswertung des Dreh-Encoders ***
    '************************************************* ******************************

    Isr_ext = Isr_timer0:
    Timer0 = Timer0_reload

    Shift Rotary0 , Left , 1 'Schieberegister für Entprellung (A,B)

    Rotary0.4 = Ph_a 'Phase A lesen -> Bit 4
    Rotary0.0 = Ph_b 'Phase B lesen -> Bit 0

    If Rotary0 <> Rotary2 Then 'Neues Signalpaar (A,B) ?
    Select Case Rotary0
    Case &B0000_0000 'Aktuell (A,B)= (0,0)
    Select Case Rotary1
    Case &B1111_0000 'Übergang war (A,B)= (1,0), also
    Incr Rotary 'Encoder-Wert erhöhen
    Case &B0000_1111 'Übergang (A,B)= (0,1), also
    Decr Rotary 'Encoder-Wert verringern
    End Select

    Rotary2 = &B0000_0000 'Aktuelles (A,B) in vorheriges (A,B)
    Case &B0000_1111 'Übergang (A,B)= (0,1) zwischen Rastungen
    Rotary1 = &B0000_1111 'erkennen und in abspeichern
    Case &B1111_0000 'Übergang (A,B)= (1,0) zwischen Rastungen
    Rotary1 = &B1111_0000 'erkennen und abspeichern
    Case &B1111_1111 'Aktuell (A,B)= (1,1)
    Select Case Rotary1
    Case &B0000_1111 'Übergang war (A,B)= (0,1), also
    Incr Rotary 'Encoder-Wert erhöhen
    Case &B1111_0000 'Übergang war (A,B)= (1,0), also
    Decr Rotary 'Encoder-Wert verringern
    End Select

    Rotary2 = &B1111_1111 'Aktuelles (A,B) in vorheriges (A,B)
    End Select

    End If


    Isr_timer1:
    Timer1 = Timer1_reload

    'Und Was Soll Hier Stehen für den Takt?




    Return
    Geändert von MrMiffy08 (05.02.2012 um 03:59 Uhr)

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 17.10.2011, 22:15
  2. Fragen zur Ansteuerung von Servos!
    Von Staind im Forum Motoren
    Antworten: 3
    Letzter Beitrag: 03.07.2011, 19:14
  3. RN-Stepp297 Ansteuerung mit C
    Von bluedeep im Forum Motoren
    Antworten: 3
    Letzter Beitrag: 11.05.2011, 22:32
  4. Motor Ansteuerung - einige Fragen
    Von roboterx im Forum Robby RP6
    Antworten: 5
    Letzter Beitrag: 10.05.2011, 08:45
  5. L298/297 Programm zur Ansteuerung.
    Von ProgDom im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 05.05.2005, 20:34

Berechtigungen

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