'mit dem programm will ich testen, ob ich einen schrittmotor aller 4,..s um 10 schritte bewegen kann. Declare Function Tastenabfrage() As Byte Declare Sub Schritt() Declare Sub Initialisierung() $regfile = "m32def.dat" $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 16000000 'Quarzfrequenz $baud = 9600 Dim Taste As Byte 'Definitionen für ISR_Schritt Dim Schrittnummer As Byte Dim H1 As Integer Dim H2 As Byte Dim Schrittzahl As Integer 'Definierter Start Schrittnummer = 0 '0 heißt 2 aktive Spulenpaare; 1 ein aktives Spulenpaar Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung On Oc1a Isr_regler 'Timer-Compare Interrupt für Regelung On Oc0 Isr_schritt 'Timer-Compare Interrupt für Schrittmotor Enable Interrupts Ddrd.4 = 1 'linker Motor ein/aus Ddrc.6 = 1 'linker Motdrehrichtung Ddrc.7 = 1 'linker Motdrehrichtung Ddrd.5 = 1 'rechter Motor ein/aus Ddrb.0 = 1 'rechter Motdrehrichtung Ddrb.1 = 1 'rechter Motdrehrichtung Ddra.7 = 0 'Für Tastenabfrage Porta.7 = 1 'Pullup Widerstand ein Print "mC gestartet" Print "Version 0.31 mit Regler" Do Taste = Tastenabfrage() If Taste <> 0 Then 'Print "Taste " ; Taste Select Case Taste Case 1 Tccr0 = &B00001000 'SchrittmotorTimer stoppen Tccr1b = &B00001000 'RegelungsTimer stoppen Print "Stopp" Case 2 Case 3 Call Initialisierung 'stoppen mit 1 Case 4 Call Schritt Case 5 End Select End If Waitms 100 Loop End Sub Schritt() '10 schritte Print "Sub 10 Schritte" Portd.4 = 1 'Schrittmotor Spule AB ein Portd.5 = 1 'Schrittmotor Spule AquerBquer ein Timsk.ocie0 = 1 'Timer0 8bit output compare match interrupt enable Timsk.ocie1a = 1 'Timer1A 16bit output compare match interrupt enable 'Geschwindigkeiten: Ocr0 = 255 'Geschwindigkeit des Schrittmotors 78=200 Schritte/s Ocr1ah = &HFF 'Geschwindigkeit der Regelung 255; Ocr1al = &HFF 'OCR1A=Ocr1ah*2^8+Ocr1al &h61A=10Regelungen/s Schrittzahl = 10 'Schrittmotor starten Tccr0 = &B00001101 End Sub Sub Initialisierung() Print "Regler wird gestartet" Portd.4 = 1 'Schrittmotor Spule AB ein Portd.5 = 1 'Schrittmotor Spule AquerBquer ein Timsk.ocie0 = 1 'Timer0 8bit output compare match interrupt enable Timsk.ocie1a = 1 'Timer1A 16bit output compare match interrupt enable 'Geschwindigkeiten: Ocr0 = 255 'Geschwindigkeit des Schrittmotors 78=200 Schritte/s Ocr1ah = &HFF 'Geschwindigkeit der Regelung 255; Ocr1al = &HFF 'OCR1A=Ocr1ah*2^8+Ocr1al &h61A=10Regelungen/s Schrittzahl = 10 'Regler starten Tccr1a = &B10000000 Tccr1b = &B00001101 End Sub Function Tastenabfrage() As Byte Local Ws As Word Tastenabfrage = 0 Start Adc Ws = Getadc(7) If Ws < 945 Then Select Case Ws Case 930 To 950 Tastenabfrage = 1 Case 777 To 790 Tastenabfrage = 2 Case 610 To 620 Tastenabfrage = 3 Case 430 To 440 Tastenabfrage = 4 Case 240 To 250 Tastenabfrage = 5 End Select Waitms 50 End If End Function Isr_regler: Print "isr_regler" Schrittzahl = 10 Tccr0 = &B00001101 'Schrittmotor wieder aktivieren Return Isr_schritt: 'gibt den nächsten schritt des Schrittmotors aus 'Print Tccr0 ; " ORCR0 " ; Ocr0 ; " TCNT0 " ; Tcnt0 If Schrittzahl <> 0 Then If Schrittzahl > 0 Then 'Richtung prüfen und Nummer erhöhen oder verringern Schrittzahl = Schrittzahl - 1 'Richtung=1 heißt nach unten bewegen; oder Schrittzahl <0 soll sich nach unten beweden 'Print Schrittzahl Schrittnummer = Schrittnummer + 2 'schrittnummer von 0 bis 7 Schrittnummer = Schrittnummer Mod 8 Else Schrittzahl = Schrittzahl + 1 'Print Schrittzahl Schrittnummer = Schrittnummer - 2 Schrittnummer = Schrittnummer Mod 8 End If H1 = Lookup(schrittnummer , Schritttab) H2 = H1 And 8 'bit 4 filtern Shift H2 , Right , 3 'um 3 nach rechts verschieben Portc.6 = H2 'ausgeben H2 = H1 And 4 Shift H2 , Right , 2 Portc.7 = H2 H2 = H1 And 2 Shift H2 , Right , 1 Portb.0 = H2 H2 = H1 And 1 Portb.1 = H2 'Print Portc.6 ; Portc.7 ; Portb.0 ; Portb.1 Else Tccr0 = &B00001000 'Timer stoppen End If Return Isr_endlage: Print "Timer0 stopp" 'T0laeuft = 0 'Schrittzahl = 0 Tccr0 = &B00001000 'Ocr0 = 250 'Richtung = Not Richtung Return Schritttab: Data 10% , 8% , 9% , 1% , 5% , 4% , 6% , 2%