Anbei der abgespeckte Programmtiel, in dem der Fehler auftritt.
Mittels einer IR-Fernbedienung sol ein Stepper dabei im Schrittbetrieb betrieben werden.
Das übrige Programm funktioniert wie es soll (deshalb mal gelöscht)
Der Fehler äüßert sich wie folgt, die Variable Ds (hier einfach mal feszt vorgegeben steuert die Anzahl der Impulse für den Stepper
Dazu gibt es die Schleife Do... Loop Until Impuls >=Ds
Impuls wird in der ISR inkrementiert,
Nun passiert folgendes, die Schleife zählt fast immer bis 1000 und die Stepperschritte sind i.O., aber völlig unregelmäßig wird die Schleife bei 768 Impulsen verlassen, und zwar immer bei 768,
dies passiert manchmal 3 innerhalb von 10 Versuchen, manchmal funktioniert es 30mal, was mich eben wundert ist die Zahl 768 (=3x256),
die Zeile 250, 252 habe ich zur Kontrolle eingefügt, es wird im Fehlerfall stets exakt 768 angezeigt, ansonsten korrekterweise 1000
Bin mit meinen Versuchen und meinem Latein etwas am Ende, vielleicht siht ja jemand den Fehler, für den ich offensichtlich zu blind bin.
Nebenbemerkung:
Das übrige Programm, also beliebige Steuerung des Motors (Vorwärts, Rückwärts, usw. fiunktioniert einwandfrei, nur der Stepbetrieb spinnt)
PS wie fügt man denn den Codes so ein, dass er im Fenster erscheint? Edit habs gefunden!!
Alles anzeigen
Mittels einer IR-Fernbedienung sol ein Stepper dabei im Schrittbetrieb betrieben werden.
Das übrige Programm funktioniert wie es soll (deshalb mal gelöscht)
Der Fehler äüßert sich wie folgt, die Variable Ds (hier einfach mal feszt vorgegeben steuert die Anzahl der Impulse für den Stepper
Dazu gibt es die Schleife Do... Loop Until Impuls >=Ds
Impuls wird in der ISR inkrementiert,
Nun passiert folgendes, die Schleife zählt fast immer bis 1000 und die Stepperschritte sind i.O., aber völlig unregelmäßig wird die Schleife bei 768 Impulsen verlassen, und zwar immer bei 768,
dies passiert manchmal 3 innerhalb von 10 Versuchen, manchmal funktioniert es 30mal, was mich eben wundert ist die Zahl 768 (=3x256),
die Zeile 250, 252 habe ich zur Kontrolle eingefügt, es wird im Fehlerfall stets exakt 768 angezeigt, ansonsten korrekterweise 1000
Bin mit meinen Versuchen und meinem Latein etwas am Ende, vielleicht siht ja jemand den Fehler, für den ich offensichtlich zu blind bin.
Nebenbemerkung:
Das übrige Programm, also beliebige Steuerung des Motors (Vorwärts, Rückwärts, usw. fiunktioniert einwandfrei, nur der Stepbetrieb spinnt)
PS wie fügt man denn den Codes so ein, dass er im Fenster erscheint? Edit habs gefunden!!
Quellcode
- 'Version 20.10.21
- 'Bascom ATmega328
- 'LCD 16 x 4
- 'Drehzahleingang über ROD 426, 500 Striche an Spindel
- 'Vorschub eingang über ROD 1000 Striche an Vorschubmotor
- '
- 'Vorschub:
- 'Frequenz 1000Hz
- 'Treiber 1000 Schritte
- 'Spindel
- 'Frequenz variabel, abhängig von Ds
- 'Treiber 1000 Schritte
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 94
- $swstack = 64
- $framesize = 48
- Baud = 9600
- '---------------------------------------------------------------------------------
- 'Definition LCD
- '---------------------------------------------------------------------------------
- Config Lcd = 16x4
- Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.5 , Rs = Portc.4
- '---------------------------------------------------------------------------------
- 'Definition der Ein- und Ausgänge
- '---------------------------------------------------------------------------------
- Config Pind.0 = Input 'Eingang für RC5
- Config Pind.1 = Input 'Inkrementalgeber Kanal B
- Config Pind.4 = Input 'Inkrementalgeber Kanal A (Trigger)
- Config Pind.2 = Input 'Anschlag links
- Config Pind.3 = Input 'Anschlag rechts
- Config Portb.0 = Output 'Ausgang Takt Vorschub
- Config Portb.1 = Output 'Ausgang Richtung Vorschub
- Config Portb.2 = Output 'Ausgang Enable Vorschub
- Config Portb.3 = Output 'für Oszi Spindel nur für Test
- Config Portd.5 = Output 'Ausgang Enable Spindel
- Config Portd.7 = Output 'Ausgang Takt Spindel
- '-----------------------------------
- 'Portb.6 Quarz
- 'Portb.7 Quarz
- '-----------------------------------
- '-------------------------------
- 'Definition der RC5-parameter
- '--------------------------------
- Config Rc5 = Pind.0 , Wait = 2000 'Wait2000 = 131ms
- '---------------------------------------
- 'Definition der Variablen
- '---------------------------------------
- Dim Address As Byte
- Dim Command As Byte
- Dim Command_a As Byte
- Dim N_soll As Long
- Dim N_ist As Long
- Dim Ds As Word
- Dim Ds1000 As Single
- Dim Striche As Long
- Dim Rod As Integer
- Dim Delay_von_d As Integer
- Dim Timer_preload_spindel As Word
- Dim Step_soll As Integer
- Dim Impuls As Word
- '---------------------------------------
- 'Definition Interrupt's
- '---------------------------------------
- '---------------------------------------------------
- 'Configuration Timer0 ist für GETRC5 belegt
- '---------------------------------------------------
- '---------------------------------------------------
- 'Configuration Timer2 (8bit) für Vorschub
- '---------------------------------------
- Config Timer2 = Timer , Prescale = 128 'Timer 1ms
- On Timer2 Isr_timer_vorschub '1 Khz = 500 Impuls
- Const Timer_preload2 = 131
- Timer2 = Timer_preload2 'Preload theor. 131
- '---------------------------------------
- 'Configuration der ALIAS
- '---------------------------------------
- Takt_vorschub Alias Portb.0 'Ausgang auf Vorschubantrieb
- Takt_spindel Alias Portd.7 'Ausgang auf Spindel
- Direction Alias Portb.1 'Richtung Vorschub
- Enable_vorschub Alias Portb.2 'Freigabe Vorschub
- Enable_spindel Alias Portd.5 'Freigabe für Wickelspindel
- Oszi Alias Portb.3 'für Takt Spindel Oszi, kann entfallen
- Anschlag_links Alias Pind.2
- Anschlag_rechts Alias Pind.3
- Kanal_a Alias Pind.4 'Pcint Inkrementalgeber Kanal A
- Kanal_b Alias Pind.1 'Inkrementalgeber Kanal B
- '---------------------------------------
- 'Definition der Input_PullUP
- '---------------------------------------
- Pind.0 = 1
- Pind.1 = 1 'Pullup (ist das nötig?
- Pind.4 = 1 'Pullup
- Pind.2 = 1
- Pind.3 = 1
- '---------------------------------------
- 'Definition der Output_PullUP
- '---------------------------------------
- Portb.1 = 1 'Pullupm Drehrichtung bei Start festlegen
- '---------------------------------------
- 'Definition der Output_PullDown
- '---------------------------------------
- 'Portd.5 = 0 'Spindel AUS
- 'Portb.2 = 0 Nötiig???
- '---------------------------------------
- 'Vorbelegung der Variablen
- '---------------------------------------
- Enable_vorschub = 1
- Enable_spindel = 1
- Takt_vorschub = 0
- Direction = 1
- Oszi = 0
- Takt_spindel = 0
- Takt_vorschub = 0
- Rod = 500
- Const Delete_line = " "
- Enable Interrupts
- '---------------------------------------
- 'Hauptschleife
- '---------------------------------------
- Do
- Cls
- Gosub Untermenue 'MENU-Taste
- Loop
- '---------------------------------------
- 'Lesen der Fernbedienung
- '---------------------------------------
- Getzahl:
- Do
- Getrc5(address , Command)
- Command = Command And &B01111111
- Loop Until Address < 255 'meine FB sendet Adresse 5
- Do 'Prüfung, ob
- Getrc5(address , Command_a) 'Taste losgelassen
- Loop Until Address = 255
- Return
- End
- '---------------------------------------
- 'Untermenü für Schrittbetrieb
- '---------------------------------------
- Untermenue:
- Cls
- Ds = 1000
- Enable_vorschub = 0
- Lcd "Step-Betrieb"
- Do
- Gosub Getzahl
- Select Case Command
- Case 3 : Gosub Step_links
- Case 4 : Gosub Step_rechts
- End Select
- Loop Until Command = 82
- Enable_vorschub = 1
- Return
- '-------------------------------------
- 'Stepbetrieb
- '-----------------------------------
- Step_links:
- Cls
- Locate 1 , 1
- Lcd "Step Links"
- Direction = 0
- Gosub Schleife
- Return
- Step_rechts:
- Cls
- Locate 1 , 1
- Lcd "Step Rechts"
- Direction = 1
- Gosub Schleife
- Return
- Schleife:
- Impuls = 0
- Enable Timer2
- Do
- 'Zeit zum Abarbeiten der Schleife bzw. ISR
- Loop Until Impuls >= Ds
- Disable Timer2
- Locate 2 , 1 'zur Fehlersuche eingefügt
- Lcd Impuls 'zur Fehlersuche eingefügt
- Return
- '---------------------------------------
- 'Interruptbearbeitung
- '---------------------------------------
- '---------------------------------------
- 'Takterzeugung für den Schrittmotor (Vorschub)
- '---------------------------------------
- Isr_timer_vorschub:
- Timer2 = Timer_preload2
- Incr Impuls
- Toggle Takt_vorschub
- Return
Gruß
Hans
Hans
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Hans_L ()