MrMiffy08
04.02.2012, 17:47
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 (http://www.rn-wissen.de/index.php/Drehencoder#Statemaschine_als_Alternative_zum_ENCO DER-Befehl), 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
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 (http://www.rn-wissen.de/index.php/Drehencoder#Statemaschine_als_Alternative_zum_ENCO DER-Befehl), 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