- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Sprung zw. Haupt- und Subroutine

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.06.2009
    Beiträge
    5

    Sprung zw. Haupt- und Subroutine

    Anzeige

    LiFePo4 Akku selber bauen - Video
    hay leutz,

    ich versuch mich seit ca 3 wochen an nem atmel32 in bascom. ich habe mir eine pc-tastatur an meinen atmel angeschlossen. nun versuche ich mittels 2 tasten der tastatur zwischen meinem hauptprogramm und einer subroutine hin- und her zuspringen. das ganze lasse ich mir dann mit nem display anzeigen. allerding muss ich die jeweilige taste ca 1 sekunde lang drücken bis etwas auf dem display passiert. ich hoffe mir kann jmd behilflich sein.
    danke schonmal.

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    Config Keyboard = Pinb.1 , Data = Pinb.2 , Keydata = Keydata
    
    Dim Key As Byte
    
    Declare Sub Test() As Byte
    
    
    Config Portb.0 = Output
    Led Alias Portb.0
    
    'LCD Config
    Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.1 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
    Config Lcd = 20 * 2
    Config Lcdbus = 4
    Initlcd
    Cls
    Cursor On
    
    
    Main:
    
    Do
    
          Led = 1
          Locate 1 , 1
          Lcd "Main"
    
    Key = Getatkbd()
       If Key = 119 Then                                        'w
          Call Test()
       End If
    
    Loop
    
    End
    
    
    Sub Test()                                                 
    
    Do
    
    Key = Getatkbd()
       If Key = 113 Then                                        'q
          Goto Main
    
       End If
    Loop
    
    
    End Sub
    
    
    'scan code übersetzungstabelle
    
    Keydata:
    'normal keys lower case
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
    Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
    Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
    Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
    Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
    Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
    Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
    Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
    
    'shifted keys UPPER case
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
    Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
    Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
    Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
    Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
    Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
    Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
    Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Nie, Nie, Nie mit goto aus ner Subroutine woandershin springen!!! Irgendwann läuft dir so der Stack über. Goto ist in 99,9% der Fälle, in denen es verwendet wird, falsch.

    Was willst du an der Stelle mit dem goto main bewirken? Doch wohl, dass die Subroutine sofort verlassen und das Programm an der Stelle hinter dem Sub-Aufruf weiter ausgeführt wird. Also 'EXIT SUB' verwenden!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    25.06.2009
    Beiträge
    5
    erstmal danke für deine antwort.

    ich wollte sozusagen bei erfüllter bedingung vom hauptprogramm in die subroutine springen. diese wollte ich dann mittels loop solange ausführen lassen bis die bedingung für einen rücksprung zum hauptprogramm erfüllt ist.

    kurz: ich will, das sich nicht immer das komplette programm abspult sondern immer nur der teil der gerade gebraucht wird. und meine idee war halt das ganze mit subroutinen zu realisieren.

    problem is halt eigentlich nur das es ca eine sekunde dauert bis etwas passiert. und das ist meiner ansicht nach eindeutig zu lange.

    mfg SlimJim1988

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Dann sollte die Sub eher so aussehen:

    Code:
    Sub Test()                                                 
    Do
       Key = Getatkbd()
    Loop Until Key=113
    End Sub
    Gruß

    Rolf

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    25.06.2009
    Beiträge
    5
    danke, das hat mir schon etwas weitergeholfen.

    kannst du mir bitte erklären worin der praktische unterschied zwischen deiner sub und meiner besteht?



    aus der sub komm ich jetzt wunderbar schnell raus. aber wenn ich die sub aufrufe dauert es leider immer noch die besagte sekunde bis sich etwas tut.
    hat noch jmd ne idee was das programm so langsam macht?

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von SlimJim1988
    danke, das hat mir schon etwas weitergeholfen.

    kannst du mir bitte erklären worin der praktische unterschied zwischen deiner sub und meiner besteht?
    Wie Uwe schon geschrieben hat, geht ein Goto raus aus einer SUB überhaupt nicht, weil dann der Stack nicht gepopt wird. Ein GOTO an sich ist schon schlechter Stil und fast immer überflüssig.
    Aber: Es ist meistens die schnellste Möglichkeit.

    Bzgl. der Geschwindigkeit sehe ich im Moment nur den GetATKbd Befehl, den ich wohl in der Simulation nicht ausführen kann. Dabei nehme ich an, dass du das Programm tatsächlich auf deinem Controller laufen lässt.

    Gruß

    Rolf

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    25.06.2009
    Beiträge
    5
    Wie gesagt ich bin halt noch am Anfang und probiere noch viel aus, auch wegen der Befehle und so. Ich habe das Programm in der Sub geändert:

    Do
    Key = Getatkbd()
    Loop Until Key = 113

    Wie ich schon sagte funktioniert der Sprung aus der Sub in das Hauptprogramm jetzt schon bei einem kurzen Tastenanschlag. Anders herum leider noch nicht. Bei einem Sprung vom Hauptprogramm in die Sub, muss ich die Taste ca ne Sekunde drücken, bevor etwas passiert. Und so riesig ist der Code ja nicht das der Chip ne Sekunde braucht um durchzulaufen.

    Das Programm lasse ich direkt auf dem Microcontroller laufen.
    Verwendete Hardware: Atmel32, PC-Tastatur, LCD-Display


    Geänderter Code:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    Config Keyboard = Pinb.1 , Data = Pinb.2 , Keydata = Keydata
    
    Dim Key As Byte
    
    Declare Sub Test() As Byte
    
    
    Config Portb.0 = Output
    Led Alias Portb.0
    
    'LCD Config
    Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.1 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
    Config Lcd = 20 * 2
    Config Lcdbus = 4
    Initlcd
    Cls
    Cursor On
    
    
    Main:
    
    Do
    
          Led = 1
          Locate 1 , 1
          Lcd "Main"
    
    Key = Getatkbd()
       If Key = 119 Then                                        'w
          Call Test()
       End If
    
    Loop
    
    End
    
    
    Sub Test()                                                  
    
          Led = 0
          Locate 1 , 1
          Lcd "test"
    Do
       Key = Getatkbd()
       Loop Until Key = 113
    
    End Sub
    
    
    
    'scan code übersetzungstabelle
    
    Keydata:
    'normal keys lower case
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
    Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
    Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
    Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
    Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
    Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
    Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
    Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
    
    'shifted keys UPPER case
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
    Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
    Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
    Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
    Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
    Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
    Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
    Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
    Ich freue mich über jede art von Hilfe!

    MFG SlimJim1988

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Wenn der die Sub sofort verlässt, kann es auch nicht an der Ausführungszeit des getatkbd liegen.
    In der Main gibst du ja auch noch bei jedem Loop das Wort Main aufs LCD.
    Probier doch mal so:

    Code:
    Main:
    Do
          Led = 1
          Locate 1 , 1
          Lcd "Main"
          Do
             Key = Getatkbd()
          Loop Until Key = 119                                      'w
          Call test
    Loop
    
    End
    
    Sub Test()                                                 
          Led = 0
          Locate 1 , 1
          Lcd "test"
          Do
               Key = Getatkbd()
          Loop Until Key = 113
    End Sub
    Gruß

    Rolf

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Klingon77
    Registriert seit
    26.09.2006
    Ort
    Hunsrück
    Alter
    63
    Beiträge
    2.543
    hi,

    ich bin zwar ein Frischling in Bascom; mache aber bei Problemen folgendes:

    Zwei Variablen vor die DO-LOOP Schleife, welche dann in der Schleife hochgezählt wird und über das LCD ausgegeben wird.

    Ein Befehl wird durch Varible 1 und Variable 2 "eingerahmt".

    Je nachdem wo ich die Zählvariable inkrementiere und ausgebe kann ich den Befehl, welcher die Verzögerung verursacht lokalisieren.



    Die Permanente Ausgabe auf dem LCD bei jedem Durchlauf benötigt schon viel Zeit; eine Sekunde ist aber definitiv zu lange.


    liebe Grüße,

    Klingon77
    Der kürzeste Weg zwischen zwei Menschen ist ein Lächeln - http://www.ad-kunst.de

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    25.06.2009
    Beiträge
    5
    Erstmal danke ich allen die versucht haben mir zu helfen.

    @for_ro

    Dein Code klappt wunderbar. Kannst du mir evt erklären was dein Code anders macht als meiner? Lags an den IF-Abfragen, das es so langsam reagiert hat? Und was mache ich wenn ich vom Hauptprogramm in mehrere Subs verweisen möchte?

    MFG SlimJim1988

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests