Probier einfach mal Soft-Stack u. Frame größer zu definieren. die Default-Werte sind in bißchen knapp
Baudrate paßt ?
Hallo, ich hab ein kleines problem mit bascom. Und zwar möchte ich das aus einer interrupt-routine ein unterprogramm mit parameterübergabe gestartet wird. Aber egal was ich an das sub übergebe es geht nicht, die variable ist dann immer null oder 255. Hier mal ein ganz primitiver quelltext mit dem es auch nicht geht:
Ich versteh das nicht, hab ich irgendwas falsch gemacht??? Oder muss ich die variable anders deklarieren damit sie überall gültig ist?Code:$regfile = "m8def.dat" Dim Var As Byte Declare Sub Prog(byval Var As Byte) Config Int0 = Rising On Int0 Bla Enable Int0 Enable Interrupts Do Loop Sub Prog(byval Var As Byte) Print Var End Sub Bla: Var = 55 Call Prog(var) Return
Danke und Gruß, Markus
Probier einfach mal Soft-Stack u. Frame größer zu definieren. die Default-Werte sind in bißchen knapp
Baudrate paßt ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hey, danke, du hattest recht! Wenn ich Soft-Stack auf 16 setzte (default=8 ) funktionierts. Hat das irgendwelche nachteile wenn man den softstack vergrößert? Wird der wert den ich hier angeb vom Flash als "Arbeitsspeicherzusatz" abgezwackt oder was soll das sein?
Er wird leider abgezwackt. (vom SRAM)
Für jedes "byval" muß er eine Kopie anlegen + 2 byte Param-addresse für die Subroutine und für die umwandlung Byte-> printstring braucht er eben auch platz
Und was du was bestellst, mußt du es eben auch bezahlen.
sellerie ! (wie die Franzosen sagen)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Oh... mir ist gerade aufgefallen das es nur in meinem beispielprogramm funktioniert. Da wo ich es eigentlich gebraucht hätte gehts nicht. Ich wollte einen Schrittmotor ansteuern und über die variabe die position übergeben die er anfahren soll. Ich hab jetzt bemerkt das im simulator ständig "Stack pointer and software stack overlap" in der statuszeile steht. Egal was ich bei softwarestack oder bei frame eintrage, es geht nicht. Die Variable wird im simulator unter locals als 255 ausgewiesen, wenn ich im quelltext mit der maus drüberfahre sagt er 20 wie ich es eigentlich haben wollte. Das ist total verwirrend. Hier mal der code den ich eigentlich nicht posten wollte weil er auf den ersten blick etwas verwirrend aussieht
Würde mich freuen wenn mir jemand weiterhelfen kann, ich hab keine ahnung was daran falsch sein soll.Code:$regfile = "m8def.dat" $crystal = 3686400 $baud = 9600 Config Int0 = Rising Dim I As Byte Dim Servo_pos As Byte Dim Servo_byte As Byte On Int0 Null Enable Int0 Enable Interrupts Declare Sub Servo(byval I As Byte) Servo_byte = 2 Servo_pos = 0 Do Loop Sub Servo(byval I As Byte) Print I If Servo_pos > I Then 'ist i kleiner als die aktuelle position, dann links rum drehen If Servo_byte = 1 Then Goto A1 'wo stand der motor als letztes? dort weitermachen If Servo_byte = 3 Then Goto A3 If Servo_byte = 4 Then Goto A4 Do Portb = &B00001000 Servo_byte = 4 'motor stnadpukt verändern Decr Servo_pos 'position -1 If Servo_pos = I Then Goto Fertig 'wenn position = i dann ende Waitms 50 A4: Portb = &B00000100 Servo_byte = 3 Decr Servo_pos If Servo_pos = I Then Goto Fertig Waitms 50 A3: Portb = &B00000001 Servo_byte = 1 Decr Servo_pos If Servo_pos = I Then Goto Fertig Waitms 50 A1: Portb = &B00000010 Servo_byte = 4 Decr Servo_pos If Servo_pos = I Then Goto Fertig Waitms 50 Loop Else 'oder rechts rum drehen If Servo_byte = 1 Then Goto B1 'gleiches spiel wie oben nur umgekehrt If Servo_byte = 3 Then Goto B3 If Servo_byte = 4 Then Goto B4 Do Portb = &B00000001 Servo_byte = 4 Incr Servo_pos If Servo_pos = I Then Goto Fertig Waitms 50 B1: Portb = &B00000100 Servo_byte = 3 Incr Servo_pos If Servo_pos = I Then Goto Fertig Waitms 50 B3: Portb = &B00001000 Servo_byte = 1 Incr Servo_pos If Servo_pos = I Then Goto Fertig Waitms 50 B4: Portb = &B00000010 Servo_byte = 4 Incr Servo_pos If Servo_pos = I Then Goto Fertig Waitms 50 Loop End If Fertig: Portb = &B00000000 End Sub Null: I = 20 Call Servo(i) Return End
*edit
mir ist auch noch aufgefallen das sich die variable aus dem ersten, einfachen programm nur mit [print var] ausdrucken lässt. wenn ich [print "variable:" ; var] eingebe dann ist sie wieder 255?! Was soll das??? Ich bin am verzweifeln.
Zwischenfrage: was hast du nun f. die Stacks etc. definiert ?
ein Interrput braucht schon mal ca 64 Byte für sich allein, um Mensch zu sein.
Hat er die nicht, schreibt er den Softstack nieder ( result unpredictable)
Ich hab (z.B. allerdings in einem 20K Programm)
HW 128
SW 256
Frame 64
definiert.
Im Vertrauen: "Do..Loop" und "waitms" in einer Interrupt routine werden normalerweise mit öffentlichem Auspeitschen honoriert. Ich rate dringend zu einem re-design.
Is aber nicht bös' gemeint.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Noch ne Zwischenfrage: Das scheint ja wohl ein Prototype zu sein. Um was geht's den zirka mit dem Int0 ? (dzt. gibt's ja nur den werte 20 und sonst nix)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
also letztendlich wird der motor nicht über den int0 sondern über die serielle schnittstelle angesprochen, so das man anstelle der 20 eben die position eingeben kann die man gern hätte. das mit dem int0 ist noch vom obigen beispielprogramm hängen geblieben, aber ist ja das gleiche prinzip nur das eben jetz nicht der urxc sondern der int0 als interrupt verwendet wird. Ich hab bisher nur mit dem frame u. softstack rumexperimentiert, hatte auch beide schon auf 256 ohne erfolg, hw-stack steht noch auf 32.
Aber ich glaub das Problem hat sich vorerst mal erübrigt weil mir gerade mein letzter Mega8 abgeraucht ist
Jetzt muss ich wieder wegen einem popligen AVR beim Reichelt bestellen.
AAARRRRGGHHHHH
O je, dann entfällt natürlich jede weiter Strafe.
Rühr' dich halt wieder, du mußt ja das Rad nicht neu erfinden, und einiges bei deinem Konzept ist so'n ding
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hi! Ich bins wieder. War zufällig in der nähe eines Conrad-Ladens diese Woche. Dann hab ich nen neuen Atmega mitgenommen, die wollten da 9,50eur für, wasn wucher! Naja, jedenfalls hab ich noch ne allgemeine frage zu meiner schrittmotorsteuerung. Wenn man wärend eines Interrupts keine schleifen verwenden sollte (ist ja verständlich), was mach ich dann? Setz ich dann ne variable auf true die in der hauptschleife ständig abgeprüft wird oder wie?
Im großen und ganzen... ist meine motorsteuerung akzeptabel oder eher grauenvoll? Ich wüsste nicht wie ich das anders lösen sollte.
Grüßle, Markus
Lesezeichen