- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Variable nur während interrupt gültig?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2004
    Beiträge
    118

    Variable nur während interrupt gültig?

    Anzeige

    E-Bike
    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:
    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
    Ich versteh das nicht, hab ich irgendwas falsch gemacht??? Oder muss ich die variable anders deklarieren damit sie überall gültig ist?
    Danke und Gruß, Markus

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2004
    Beiträge
    118
    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?

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2004
    Beiträge
    118
    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
    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
    Würde mich freuen wenn mir jemand weiterhelfen kann, ich hab keine ahnung was daran falsch sein soll.

    *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.

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2004
    Beiträge
    118
    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

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2004
    Beiträge
    118
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test