Tredory
26.02.2009, 20:27
Hi, ich möchte einen Schrittmotor mit der Schrittmotorplatiene von Pollin ansteuern. Das ganze möchte ich mit einem Timer versuchen, nun hab ich folgendes "problem". In dem Folgenden Code will ich erstmal die ansteuerung testen und eine verstellbare geschwindigkeit hinbekommen.
Der Interrupt von Timer macht auch das was er soll, nur scheint die Do Loop schleife des Hautprogramms garnichts zu machen, weder bekomme ich eine ausgabe auf dem lcd, noch ändert sich irgendwas an der geschwindigkeit.
'Programm Timer Test 02 nach verdrahtungsplan 1.0
$regfile = "m32def.dat"
'Taktfrequenz 16MHz
$crystal = 16000000
'Baudrate für UART
$baud = 2400
'Setzt den verfügbaren Speicher für den Frame
$framesize = 32
'Setzt den verfügbaren Speicher für den Software Stack
$swstack = 32
'Setzt den verfügbaren Speicher für den Hardware Stack
$hwstack = 32
'**************************************
'********* Variablen **********
'**************************************
Dim Step As Integer
Step = 0
Dim Timerstart As Long
Timerstart = 3000
Dim I As Integer
'**************************************
'********* Namenszuweisung **********
'**************************************
Lcd_db4 Alias Porta.4
Lcd_db5 Alias Porta.5
Lcd_db6 Alias Porta.6
Lcd_db7 Alias Porta.7
Lcd_e Alias Portb.0
Lcd_rs Alias Portb.2
Led1 Alias Portc.0
Led2 Alias Portc.1
Led3 Alias Portc.2
Led4 Alias Portc.3
Led5 Alias Portc.4
Led6 Alias Portc.5
Led7 Alias Portc.6
Led8 Alias Portc.7
Led9 Alias Portd.5
Led10 Alias Portd.6
Taste1port Alias Porta.0
Taste1 Alias Pina.0
Taste2port Alias Porta.1
Taste2 Alias Pina.1
Taste3port Alias Porta.2
Taste3 Alias Pina.2
Taste4port Alias Porta.3
Taste4 Alias Pina.3
Audio Alias Portd.7
Schrittmotorschalter1port Alias Portb.3
Schrittmotorschalter1 Alias Pinb.3
Schrittmotorschalter2port Alias Portb.1
Schrittmotorschalter2 Alias Pinb.1
Schrittmotor1 Alias Portb.4
Schrittmotor2 Alias Portd.2
Schrittmotor3 Alias Portd.3
Schrittmotor4 Alias Portd.4
'**************************************
'******** Timer-Konfiguration *********
'**************************************
'Konfiguriere den 16 bit Timer. Mit Prescale 256 62500
Config Timer1 = Timer , Prescale = 64
'Timer einschalten
Enable Timer1
'Beim Timer überlauf, zu Isr_Timer1 verzweigen.
On Timer1 Isr_timer1
'Interrupts global einschalten
Enable Interrupts
Timer1 = Timerstart
'**************************************
'********* LCD-Konfiguration **********
'**************************************
'LCD-Pins konfigurieren
Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs
'LCD als 16x2 Zeichen konfigurieren
Config Lcd = 16 * 2
'LCD wird im 4-Bit-Modus betrieben
Config Lcdbus = 4
'**************************************
'********* Port-Konfiguration *********
'**************************************
'LED-Ausgänge
Config Led1 = Output
Config Led2 = Output
Config Led3 = Output
Config Led4 = Output
Config Led5 = Output
Config Led6 = Output
Config Led7 = Output
Config Led8 = Output
Config Led9 = Output
Config Led10 = Output
'Tasteneingang
Config Taste1port = Input
Config Taste2port = Input
Config Taste3port = Input
Config Taste4port = Input
'Audio-Ausgang (Summer und NF Verstärker)
Config Audio = Output
'Schrittmotorplatine Ein/Ausgänge
Config Schrittmotor1 = Output
Config Schrittmotor2 = Output
Config Schrittmotor3 = Output
Config Schrittmotor4 = Output
Config Schrittmotorschalter1port = Input
Config Schrittmotorschalter2port = Input
'**************************************
'******** LCD initialisieren **********
'**************************************
Initlcd
'Display löschen
Cls
'Anfang Eigendliches Programm
'Endlosschleife
Do
If Taste1 = 1 Then
Cls
Locate 1 , 1
Lcd "3600"
Timerstart = 3600
End If
If Taste2 = 1 Then
Cls
Locate 1 , 1
Lcd "15000"
Timerstart = 15000
End If
If Taste3 = 1 Then
Cls
Locate 1 , 1
Lcd "40000"
Timerstart = 40000
End If
Loop
'Timer1 Interrupt
Isr_timer1:
Timer1 = Timerstart
If Step = 0 Then
Led1 = 1
Led2 = 0
Led3 = 0
Led4 = 0
End If
If Step = 1 Then
Led1 = 0
Led2 = 0
Led3 = 1
Led4 = 0
End If
If Step = 2 Then
Led1 = 0
Led2 = 1
Led3 = 0
Led4 = 0
End If
If Step = 3 Then
Led1 = 0
Led2 = 0
Led3 = 0
Led4 = 1
End If
Step = Step + 1
If Step = 4 Then
Step = 0
End If
Return
End
Warum ist das so ?? ;) Startet der timerinterrupt zu oft das das hauptprogramm blockiert ? Das kann ich mir nicht vorstellen, da das ja nur ca 2 mal pro sekunde ist.
Danke schonmal
Der Interrupt von Timer macht auch das was er soll, nur scheint die Do Loop schleife des Hautprogramms garnichts zu machen, weder bekomme ich eine ausgabe auf dem lcd, noch ändert sich irgendwas an der geschwindigkeit.
'Programm Timer Test 02 nach verdrahtungsplan 1.0
$regfile = "m32def.dat"
'Taktfrequenz 16MHz
$crystal = 16000000
'Baudrate für UART
$baud = 2400
'Setzt den verfügbaren Speicher für den Frame
$framesize = 32
'Setzt den verfügbaren Speicher für den Software Stack
$swstack = 32
'Setzt den verfügbaren Speicher für den Hardware Stack
$hwstack = 32
'**************************************
'********* Variablen **********
'**************************************
Dim Step As Integer
Step = 0
Dim Timerstart As Long
Timerstart = 3000
Dim I As Integer
'**************************************
'********* Namenszuweisung **********
'**************************************
Lcd_db4 Alias Porta.4
Lcd_db5 Alias Porta.5
Lcd_db6 Alias Porta.6
Lcd_db7 Alias Porta.7
Lcd_e Alias Portb.0
Lcd_rs Alias Portb.2
Led1 Alias Portc.0
Led2 Alias Portc.1
Led3 Alias Portc.2
Led4 Alias Portc.3
Led5 Alias Portc.4
Led6 Alias Portc.5
Led7 Alias Portc.6
Led8 Alias Portc.7
Led9 Alias Portd.5
Led10 Alias Portd.6
Taste1port Alias Porta.0
Taste1 Alias Pina.0
Taste2port Alias Porta.1
Taste2 Alias Pina.1
Taste3port Alias Porta.2
Taste3 Alias Pina.2
Taste4port Alias Porta.3
Taste4 Alias Pina.3
Audio Alias Portd.7
Schrittmotorschalter1port Alias Portb.3
Schrittmotorschalter1 Alias Pinb.3
Schrittmotorschalter2port Alias Portb.1
Schrittmotorschalter2 Alias Pinb.1
Schrittmotor1 Alias Portb.4
Schrittmotor2 Alias Portd.2
Schrittmotor3 Alias Portd.3
Schrittmotor4 Alias Portd.4
'**************************************
'******** Timer-Konfiguration *********
'**************************************
'Konfiguriere den 16 bit Timer. Mit Prescale 256 62500
Config Timer1 = Timer , Prescale = 64
'Timer einschalten
Enable Timer1
'Beim Timer überlauf, zu Isr_Timer1 verzweigen.
On Timer1 Isr_timer1
'Interrupts global einschalten
Enable Interrupts
Timer1 = Timerstart
'**************************************
'********* LCD-Konfiguration **********
'**************************************
'LCD-Pins konfigurieren
Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs
'LCD als 16x2 Zeichen konfigurieren
Config Lcd = 16 * 2
'LCD wird im 4-Bit-Modus betrieben
Config Lcdbus = 4
'**************************************
'********* Port-Konfiguration *********
'**************************************
'LED-Ausgänge
Config Led1 = Output
Config Led2 = Output
Config Led3 = Output
Config Led4 = Output
Config Led5 = Output
Config Led6 = Output
Config Led7 = Output
Config Led8 = Output
Config Led9 = Output
Config Led10 = Output
'Tasteneingang
Config Taste1port = Input
Config Taste2port = Input
Config Taste3port = Input
Config Taste4port = Input
'Audio-Ausgang (Summer und NF Verstärker)
Config Audio = Output
'Schrittmotorplatine Ein/Ausgänge
Config Schrittmotor1 = Output
Config Schrittmotor2 = Output
Config Schrittmotor3 = Output
Config Schrittmotor4 = Output
Config Schrittmotorschalter1port = Input
Config Schrittmotorschalter2port = Input
'**************************************
'******** LCD initialisieren **********
'**************************************
Initlcd
'Display löschen
Cls
'Anfang Eigendliches Programm
'Endlosschleife
Do
If Taste1 = 1 Then
Cls
Locate 1 , 1
Lcd "3600"
Timerstart = 3600
End If
If Taste2 = 1 Then
Cls
Locate 1 , 1
Lcd "15000"
Timerstart = 15000
End If
If Taste3 = 1 Then
Cls
Locate 1 , 1
Lcd "40000"
Timerstart = 40000
End If
Loop
'Timer1 Interrupt
Isr_timer1:
Timer1 = Timerstart
If Step = 0 Then
Led1 = 1
Led2 = 0
Led3 = 0
Led4 = 0
End If
If Step = 1 Then
Led1 = 0
Led2 = 0
Led3 = 1
Led4 = 0
End If
If Step = 2 Then
Led1 = 0
Led2 = 1
Led3 = 0
Led4 = 0
End If
If Step = 3 Then
Led1 = 0
Led2 = 0
Led3 = 0
Led4 = 1
End If
Step = Step + 1
If Step = 4 Then
Step = 0
End If
Return
End
Warum ist das so ?? ;) Startet der timerinterrupt zu oft das das hauptprogramm blockiert ? Das kann ich mir nicht vorstellen, da das ja nur ca 2 mal pro sekunde ist.
Danke schonmal