Mega 32

Hallo miteinander.

Ich suche unterstützung.

Ich muss einen AVR programieren (Bascom) aber ich bin da etwas überfordert.
Ich habe zwar halbwegs den Mc dazu gebracht was der grundsetzlich machen soll aber eine menge verbesserung währe noch nötig und das schaffe ich leider alleine nicht.

Hat jemand lust/zeit mir dabei zu helfen???

Gruß

Balázs

Hi Balázs,
was willst du denn verbessern?

Mfg,
Kasimir

Hi Balázs,
was willst du denn verbessern?

Mfg,
Kasimir.

Hi Kasimir

Erst mal danke für deine blitzschnelle antwort, hut ab:smile:

was willst du denn verbessern?

sorry aber jetzt muss ich etwas ausholen (roman:smile:

Nun es ist so, ich habe ein programm zusammengeschustert der einen bipolaren steppmotor links und rechts treibt. Der motor stellt einen kleinen nadelwentil. Da der nadel ein gewindenadel mit sehr flachen konus ist darf nicht bis zum anschlag eingedreht werden sonst langt der drehmoment des mororst nicht mehr aus diesen wieder von seimem sitz loszudrehen.
Also ich brauche irgendwie ganz genau auf die position des nadels ahten und beim abschalten oder beim ausfall der stromversorgung wieder an diese position zurückfahren zu können. Das ding is sehr winzig der motor ist aus einem floppy, treib ohne untersetzung den nadel und ein endschalter ist nicht einbaubar, past nicht rein. Ich habe aber an der welle eine scheibe mit einem schlitz installieren können für eine auch vom floppy stammende kleine lichtschranke. Leider funkt nicht erwartungsgemess. Die schranke ist an into0 aber liefer manchmal unsinnige signale bzw. der zähler zählt dann auch wenn definitiv nicht sollte und umgekeht. das konnte ich im terminal feststellen. Woran es liegt weiss ich noch nicht aber vermute,dass es villeicht mit wibrationen beim anhalten/anfahren zu tun hatt wenn der schlitz grad dort steht. Wenn ich mit dem finger schubsche zählt brav. Das währe problem nr.1. Nr.2: wie konstruire ich eine schleife wo ich noch vor dem hauptprogramschleife aus der im eeprom abgelegte/geretteten schrittzahl (wo gerade stehengeblieben ist) wieder auf die 0 position zurükgefaren wird.
Bisher fahre ich im hauptprogramm immer alle vier schritte auf einen rutsch. Am anfang beim eincsaltener müsste ich aber beim beliebigen Schritten anfangen und anhalten (bei 0) können.
Das schaffe ich mit meinem paar wohchen grübelei leider nicht.

Hier ist das prog, ich hoffe, dass nicht sehr kaotisch ist:smile:

$regfile = „m32def.dat“
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

$baud = 9600

Config Portc.6 = Output
A Alias Portc.6 'Spule 1 eingang
Config Portc.7 = Output
B Alias Portc.7 'Spule 1 ausgang
Config Portb.0 = Output
C Alias Portb.0 'Spule 2 eingang
Config Portb.1 = Output
D Alias Portb.1 'Spule 2 ausgang
Config Portd.4 = Output
E Alias Portd.4
Config Portd.5 = Output 'Enable L293D Treiber
F Alias Portd.5 'Enable L293D Treiber

Config Pina.0 = Input ’ Messwert für die Ventil zu stellen
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Lambda As Word

Config Pind.2 = Input 'INT0 (Lichtschranke) funkt aber nicht:smile:
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Isr_von_int0

Dim Dummy As Eram Byte 'Datenrettung, noch nicht ausprobiert:smile:
Dim Eek As Eram Byte 'braucht int1 noch
Dim Eez As Eram Byte

Dim G As Byte 'Zähler für die einzelne schritte
G = 0

Dim S As Bit 'für die Lichtschrankensignal. Man behauptet, dass hier ein byte schneller währe, keine ahnung:smile:
S = 0

Dim Z As Byte 'Zähler für einen Rutsch, 4 Schritte
Z = 10

Dim K As Byte 'Zähler für die tatsächliche Lichtschrankensignale die ich dann im Terminal sehen kann
K = 0

'If G Eeg Then G = Eeg (kommt noch irgendwann)
'If Z Eez Then Z = Eez

Do

Lambda = Getadc(0)

Wait 1

Print "Lambda = " ; Lambda

If Lambda 10 Then Gosub Zu
If Lambda > 600 And Z

Hi,
also wenn ich deine Erklärungen korrekt verstanden habe, dann möchtest du die Position deines Motors verfolgen. Da du laut deinen Angaben einen Schrittmotor verwendest, solltest du die Position dessen zu jeder Zeit kennen. Denn du musst ihn ja ansteuern um an die nächste Position zu fahren. Also sollte dies die Lichtschranke überflüssig machen. Oder hat diese noch eine andere Funktion die ich übersehen habe? Um den Zähler zu initialisieren würde ich dann denn Motor zu dem Anschlag fahren wo er sich aus eigener Kraft wieder lösen kann und sobald er dort angekommen ist den Zähler auf Null zurück setzen. Damit hättest du einen definierten Ausgangspunkt für deinen Schrittzähler. Von dort aus musst du dann nur noch ermitteln wie weit du maximal drehen darfst und aufpassen das dein Schrittzähler diesen Wert nicht übersteigt.
Wenn du nicht jedes mal aufs neue initialisieren möchtest dann kannst du denn wert des Schrittzähler hinterlegen. Ich würde dies jedoch nicht empfehlen, da du nach einem Neustart keine Ahnung hast ob sich das System noch in der alten Position befindest oder nicht, da in der Zwischenzeit die Position verstellt werden kann. Also währe das mit dem Kalibrieren die sicherere Variante.

Liebe Grüße,
Kasimir

Hi

also wenn ich deine Erklärungen korrekt verstanden habe, dann
möchtest du die Position deines Motors verfolgen.

Korrekt.

Da du laut
deinen Angaben einen Schrittmotor verwendest, solltest du die
Position dessen zu jeder Zeit kennen. Denn du musst ihn ja
ansteuern um an die nächste Position zu fahren.

Sicher kenne ich die pos.

Also sollte
dies die Lichtschranke überflüssig machen.

Nicht ganz. Diese würde zb. bei einem was ja nicht auszuschliesen ist srittausfall wertvolle info liefern.

Um den Zähler zu
initialisieren würde ich dann denn Motor zu dem Anschlag
fahren wo er sich aus eigener Kraft wieder lösen kann und
sobald er dort angekommen ist den Zähler auf Null zurück
setzen.

So habe ich das auch gemacht. Ich habe zwar den zähler mit 10 initialisiert aber das nur weil beim experimentieren wo ich den ventil nicht ganz vom seinem anschlag rausgedreht habe nicht eine negative überlauf des bytes beim zurückfahren riskieren wolte. Im hauptschleife fahre ich von 10 vor und bis 10 zu. Das ist das gleiche.
Somit habe ich eine definierten ausgangspunk.

: Von dort aus musst du dann nur noch

ermitteln wie weit du maximal drehen darfst und aufpassen das
dein Schrittzähler diesen Wert nicht übersteigt.

Ist ja so gemacht.

Wenn du nicht jedes mal aufs neue initialisieren möchtest dann
kannst du denn wert des Schrittzähler hinterlegen. Ich würde
dies jedoch nicht empfehlen, da du nach einem Neustart keine
Ahnung hast ob sich das System noch in der alten Position
befindest oder nicht, da in der Zwischenzeit die Position
verstellt werden kann.

Ja sicher. Das ist eben das problem, muss gelöst werden.
Dazu muss ich den wert der zähler erst in eeprom bei der unterbrechung ablegen, dann erst weis ich nur wo der Motor stehengeblieben ist. Diese wert aber sagt noch nichts über die tatsächliche position aus da schritte verloren gehen könnten. Dafür währe die schranke als sicherheit auch nötig. Von dem diferenz könnte man dann die tatsähliche position ausrechnen.

Aber nehmen wir an, dass kein schritt verloren geht und der motor beim x schritt stehen geblieben ist und x steht jetzt zu verfügung aus dem eeprom. Wie komme ich von x dann auf meine ausgangsposition nach neustart noch vor der hauptschleife. Ich muss irgendwie bei dem richtigen von den vier schritten anfangen und auch bei dem richtigen aufhören. Ich kann nicht einfach in einem rutsch alle 4 fahren ( A B C D ) wie im hauptschleife.

Und. Interrupt rutinen wie ich entnähme muss mit return abgeschlossen werden in bascom. Das aber braucht sehr viel zeit da die register erst gepuscht werden. Das aber bei einem interrupt wo ich nur werte in eeprom ablegen (und das ist schon langsam) und die verbraucher abschalten muss ist unnötig weil danach sowiso neustart volgt.
Gibt es eine lösung für direkte sprung, asm code die es machen kann??

Grüße:

Balázs

OK,
wenn Du mir mal Deinen Quellcode zusendest, dann kann ich mal drüber schauen und vielleicht kann ich Dir weiter helfen.

Bitte die BAS-Datei verpacken oder das Suffix (".BAS") ändern in z.B. „.BXX“ damit es mein EMailprogramm akzeptiert.

Mein EMail: [email protected]

PS: bitte auch erläutern was Dein Programm machen soll.

Viele Grüße

Dieter

Hi,

mit Bascom kann ich dir leider nicht weiterhelfen. Und das letzte Mal, dass ich meinen AVR angepackt habe, ist auch schon ne Weile her :wink:

Gruß Jonny

Hi

Trotzdem danke für deine Antwort.

Gruß

Balázs

Ok, das mit dem Schrittfehlern habe ich etwas übersehen. Leider bin ich auch nicht unbedingt der pro in Schrittmotoransteuerung aber was mich an der Sache mit dem ablegen des letzten Schritts im EEPROM immer noch stört, ist der Fakt das der Motor sobald das System stromlos ist verstellt werden kann und die Sache somit nicht viel wert ist. Ich würde es also einfach dabei belassen das du mit einem beliebigen schritt anfängst und dann von dort aus weiter gehst. Denn mehr als das dein Motor sich um einen schritt zurück bewegt kann ja nicht wirklich passieren. Ansonsten werde ich mich mal noch etwas umsehen ob ich noch eine bessere Lösung finden kann. Die Sache mit der ISR und dem direkten Sprung ist sicherlich irgendwie möglich, jedoch würde ich davon abraten, da es ein schlechter Programmierstiel ist und an dieser stelle einfach nicht notwendig.

Gruß
Kasimir

ablegen des letzten Schritts im EEPROM immer noch stört, ist
der Fakt das der Motor sobald das System stromlos ist
verstellt werden kann und die Sache somit nicht viel wert ist.

Theoretisch ist das möglich da hast du Recht.
In der Tat ist es aber sehr unwahrscheinlich da die Masse der Nadel des Ventils so winzig ist. Von der Ventilseite kann praktisch kein Drehmoment auftreten was den Motor zu bewegen imstande währe

Ich würde es also einfach dabei belassen das du mit einem
beliebigen schritt anfängst und dann von dort aus weiter
gehst. Denn mehr als das dein Motor sich um einen schritt
zurück bewegt kann ja nicht wirklich passieren.

So währe vorprogrammiert, dass nach einem Neustart die Nadel irgendwann aufsitzt. Das aber muss unbedingt vermeidet werden. Die Lihtschranke sagt oder bessergesagt würde sagen wenn funken würde, dass eine volle Umdrechung erfolgt ist und wie viele davon.
Wenn die Srittzahlen auch dokumentiert sind müsste man von diesen zwei Daten ausrechnen können wo tatsächlich der Spindel stehen geblieben ist, denke ich.

Ansonsten

werde ich mich mal noch etwas umsehen ob ich noch eine bessere
Lösung finden kann.

Das währe supper gut.Danke.

Die Sache mit der ISR und dem direkten
Sprung ist sicherlich irgendwie möglich, jedoch würde ich
davon abraten, da es ein schlechter Programmierstiel ist und
an dieser stelle einfach nicht notwendig.

Ok. Mit der Zeitaufwand, das habe ich nur gelesen und dachte von der Logik her sollte man das so verkürzen. Mit einem richtig dimensionierten Stützkondensator geht auch, stimmt.

Gruß

Balázs