$regfile = "m8def.dat"
Enable Interrupts
$crystal = 8000000
$baud = 9600
Dim Test As String * 10
Do
Input Test
waitms 500
print test
Loop
End
mfg pebisoft
Hallo zusammen,
Ich habe eine Frage zum einlesen von Daten via RS232 in meinen ATmega8. Hab zwar schon zig Threads gelesen, bin aber doch nicht schlau geworden. Ich kann zwar schon einzelne Ascii-Werte einlesen und die als Echo an meinen PC zurücksenden, jedoch holt der Inkey() Befehl doch nur ein Zeichen nach dem anderen aus dem Buffer heraus und nicht eine ganze Zeichenfolge. Wie stelle ich das jetzt an, dass wenn ich dem AVR z.B. den Wert 255 sende, er mir nicht nacheiander 2 dann 5 und nochmal 5 zurückgibt, sondern er 255 in eine Variabel abspeichert. Hab dazu im Anhang mein bisheriges Programm angefügt.
Gruss commander7
$regfile = "m8def.dat"
Enable Interrupts
$crystal = 8000000
$baud = 9600
Dim Test As String * 10
Do
Input Test
waitms 500
print test
Loop
End
mfg pebisoft
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 38400
On Urxc Rs232int
Enable Urxc
Enable Interrupts
Rs232int:
If Udr = 13 Then 'return?
Instring = Buf + Chr(udr)
Bc = Len(instring)
Bc = Bc - 1
Instring = Mid(instring , 2 , Bc)
Buf = ""
'Print "instring: " ; Instring
Else
Buf = Buf + Chr(udr)
'add to buffer
End If
Return
Nur so ca. halt lässt sich noch vereinfachen in Instring steckt dann die der aktuelle Inhalt der bis zum letztn Chr(13) gekommen ist
Fehlen halt noch die Dims der Variablen aber das wirst du hinbekommen oder?
hallo zusammen
ich bin nun einen Schritt weiter gegangen, da das einlesen der Zeichenkette nun funktioniert. Bei meinem weiterentwickelten Programm will ich per RS232 einen Wert einlesen und anhand von diesem die Geschwindigkeit des Timer1 regeln. Wenn der Timer1 abgelaufen ist, soll ein Interrupt ausgelöst werden und in diesem soll der Motor einen Schritt machen.
Erfreulicherweise dreht sich der Motor auch ganz langsam, aber leider bewirkt das Senden einer neuen Geschwindigkeit beim Timer gar nichts. Das Zeichen empfängt er aber richtig, da ich es mit dem Echo konrollieren kann.
Kann mir jemand einen Tipp geben, was an meinem Programm falsch ist, das der Timer1 seine "Geschwindigkeit" nicht ändert?
Hallo commander7,
du mußt den Timer im Interrupt verstellen bzw. neu laden.
Bei deiner Variante ist beim nächsten IRQ alles beim alten.
Gruß, Michael
hallo michael,
danke für die antwort. mit welchem befehl tue ich das?
gruss commander7
Hallo commander7,
mit Timer1 = Tempo.mit welchem befehl tue ich das?
Der muß aber aus dem Hauptprogramm raus und in den IRQ.
Gruß, Michael
hallo michael,
ich habe jetzt Timer = Tempo im Interrupthandler gleich oben an Return geschrieben. Leider aber dreht der Motor immer noch stur seine Runden ohne die Geschwindigkeit zu ändern. Hast du noch einen Rat?
gruss commander7
Hallo commander7,
Das mag daran liegen, daß Tempo eine Byte-Variable ist und Timer1 ein Word.Leider aber dreht der Motor immer noch stur seine Runden ohne die Geschwindigkeit zu ändern.
Du änderst also maximal den 256ten Teil, oder 0,4%. Klar daß du nicht merkst, ob der Motor schneller wird.
Du könntest die Variable Tempo mit 256 multiplizieren und diesen Wert in den Timer1 schreiben. Vermeide aber Rechenaufgaben im Interrupt.Hast du noch einen Rat?
Gruß, Michael
hallo,
Hab es nun hingekriegt, dass Tempo zu ändern *freu*. Aber eben erst mit einem Motor und ich will aber schon zwei ansteuern. Mit dem jetztigen Programm dreht sich der linke Stepper (Timer0) einwandfei. Ich habe nun für den rechten Motor den Timer2 eingesetzt, da Timer1 ja ein 16Bit Timer ist. Das Problem ist aber, dass sich betreffende Motor zwar vorwärts und rückwärts dreht, aber sein Tempo ist viel zu schnell und es kann nur geringfügig geändert werden. Das heisst im Klartext: Linker Motor läuft richtig, Rechter aber schon bei kleinem Tempo ( < 10) viel schneller und wenn ich mit dem Tempo hochfahre dann fängt er schon früh an zu stocken, da er wie ich vermute nicht so schnell drehen kann.
Ist es möglich, dass der Fehler eintritt, weil sich Timer0 und Timer2 irgendwie in die Quere kommen oder hab ich was falsch programmiert?
Erklärung zur Ansteuerung:
Über das CommControl sende ich via RS232 zuerst die Geschwindigkeit (-236 bis 236) und für den linken Motor als Code für den AVR eine 100 und für den Rechten ein 101.
gruss commander7
Lesezeichen