- LiFePO4 Speicher Test         
Ergebnis 1 bis 4 von 4

Thema: Schleifenteil überspringen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    24.06.2007
    Alter
    44
    Beiträge
    61

    Schleifenteil überspringen

    Anzeige

    Praxistest und DIY Projekte
    Hallo alle zusammen,

    ich hab da ein kleines problem. Habe jetzt erfolgreich mein erstes größeres AVR projekt in Bascom abgeschlossen. Hierbei handelt es sich um eine vorverstärker, dessen hauptbestandteil ein pga2320 ist. Das funktioniert auch alles einigermaßen befriedigend. Er lässt sich quasi über einen Encoder und einer Fernbedienung lauter und leiser drehen .

    Ich hab noch eine quellenwahl eingebaut. Der Schalter welche die anweisung an den controller übermittelt ist auf low geschalten, also dauernd (leider kein taster).

    Somit habe ich jetzt in der hauptschleife meines programms eine if anweisung welche mit dann am lcd den Kanalnahmen ausgibt, wenn der Eingang low ist also der schalter gedrückt ist. Nur wird das ganze bei jedem schleifendurchlauf im hauptprogramm durchgeführt, was ich eigentlich nicht will. Es würde ja reichen wenn der Quellenname am LCD nur einmal ausgegeben wird beim einschalten und wenn ich umschalte.
    Gibt es da eine Möglichkeit diese lcd anweisung mit dem if befehl so abzuändern, daß er nicht bei jeder schleife abgefragt wird sondern nur wenn er wieder auf high geht? Wenn also umgeschalten wird. Ich versuch schon seit ein paar Tagen da was zu drehen bin aber anscheinend etwas zu doof dazu.



    Eine noch ganz andere Frage die nicht zum thema passt wie kann man denn eigentlich code posten? ich würd da gern was dazu einstellen, nur weiß ich leider nicht wie?

    Grüße
    R.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    15.06.2007
    Beiträge
    18
    oben über deiner ersten"antwort" auf neue antwort klicken und dann sind da über dem textfeld mehrere buttons einer heist code du drückst ihn dan fügst du den code ein und dann drückst du ihn wieder

    zu diener ersten frage nimm eine bit variable und speicher den zustand des tasters ab und wen er sich geändert hat(if bit = not bit then)dann lässt du den controller in die schleife springen natürlich musst du den wert(bit) dann immer in der schleife ändern (erste zeile der schleife könnte heisen "bit=not bit" das funktioniert wei das toggeln eines ports)

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    24.06.2007
    Alter
    44
    Beiträge
    61
    danke flo für deine schnelle antwort. Nur check ich nicht ganz was du meinst. Ich poste jetzt mal den code da ich dazu gerstern noch nicht fähig war. Das zwischen 'Routine Schalterstellung Quellenwahl und 'Ende Routine Quellenwahl würde ich irgendwie gern besser machen nur gibts derzeit eine gehirnblockade. Probier da schon seit Tagen rum und komm einfach nicht dahinter...

    Ich hoffe mir kann wer helfen

    Code:
    $regfile = "m16def.dat"                                     'Die Anweisung bestimmt Controllertyp, hier AVR Mega 16
     $framesize = 32                                            'Stackanweisungen, die eigentlich nur bei größeren Programmen
     $swstack = 32                                              'wirklich nötig werden
     $hwstack = 32
     $crystal = 8000000                                         '7372800
    
    
    
     '$lib "mcsbyte.lbx"                                         'ACHTUNG:numeric<>string conversion routines only for bytes
    
    'Encodervariable
    Dim A As Byte
    Dim B As Byte
    
    'LCD Config
     Config Lcd = 40 * 2
     Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.0 , Rs = Portc.1
     Config Lcdbus = 4
     Config Lcdmode = Port
    Initlcd
    Cls
    Config Portb.0 = Output
    Config Portb.1 = Output
    Config Portb.4 = Output
    Config Portb.3 = Output
    Config Portb.2 = Output
    Config Pina.0 = Input                                       'Zimmerlautstärke
    Config Pina.2 = Input                                       'Encoder rechts
    Config Pina.3 = Input                                       'Encoder links
    'Relaisboard Config
     Config Pind.3 = Input                                      'Taster Schalter 1
     Config Pind.4 = Input                                      'Taster Schalter 2
     Config Pind.5 = Input                                      'Taster Schalter 3
    
     Portd.3 = 1                                                'interner Pullup Schalter1
     Portd.4 = 1                                                'interner Pullup Schalter2
     Portd.5 = 1                                                'interner Pullup Schalter3
    
     S1 Alias Pind.3
     S2 Alias Pind.4
     S3 Alias Pind.5
    
    
    'Ende Relaisboard Config
    
    Room Alias Pina.0                                           'alias Pina.0
    Porta.0 = 1                                                 'interner Pullup Taster
    Porta.2 = 1                                                 'interner Pullup Encoder
    Porta.3 = 1                                                 'interner Pullup Encoder
    'PGA2320 Config
    Cs2320 Alias Portb.1                                        'CS pga2320
    Mute Alias Portb.4                                          'Mute pga2320
    Zcen Alias Portb.0                                          'Zero crossing detection pga2320
    'SPI Config pga2320
    Config Spi = Soft , Dout = Pinb.3 , Ss = Pinb.1 , Clock = Pinb.2
    
    'RC5 config things
    Config Portc.2 = 0
      Input_pin Alias Pinc.2                                    'Pin für TSOP1736
    
      Config Timer0 = Timer , Prescale = 8
      On Timer0 Timer_irq
      Const Timervorgabe = 78                                   'Timeraufruf alle 178µs (10 Samples = 1 Bit = 1,778ms)
      Enable Timer0                                             'Hier werden die Timer aktiviert
      Enable Interrupts
    
      'Timing für 10 Samples Per Bit = 1,778ms
      Const Samples_early = 8                                   'Flanke Frühestens Nach 8 Samples
      Const Samples_late = 12                                   'Flanke Spätestens Nach 12 Samples
      Const Samples_min = 3                                     'Flanke Vor 3 Samples - > Paket Verwerfen
    
      'Variablen der ISR
      Dim Sample As Byte                                        'eigentlich Bit, spart aber 46Byte ROM
      Dim Ir_lastsample As Byte                                 'zuletzt gelesenes Sample
      Dim Ir_bittimer As Byte                                   'zählt die Aufrufe von Timer_IRQ
      Dim Ir_data_tmp As Word                                   'Bitstream
      Dim Ir_bitcount As Byte                                   'Anzahl gelesener Bits
    
    
      'Rückgabewerte der ISR
      Dim Address_rc5 As Byte , Command_rc5 As Byte , Rc5_flag As Bit
    'RC 5 config things end
    
    
    
    
    
    
    'Startumgebung
    A = 120                                                     'On Volume
    Gosub Spio
    
    
    Cursor Off
    Cls
    Locate 1 , 1
    Lcd "  O-Ton Preamp  "
    Locate 2 , 1
    Lcd "      Mute      "
    
    'Einschaltverzögerung
    Zcen = 1                                                    'Zcen ein
    Mute = 0                                                    'Mute ein
    Waitms 3000
    Mute = 1                                                    'Mute aus
    
    
    Main:                                                       'Hauptprogramm
    
    'Routine Schalterstellung Quellenwahl
         If S1 = 0 And S2 = 1 And S3 = 1 Then
         Locate 1 , 1
         Lcd "       CD       "
         End If
    
         If S1 = 1 And S2 = 0 And S3 = 1 Then
         Locate 1 , 1
         Lcd "     Line 1     "
         End If
    
         If S1 = 1 And S2 = 1 And S3 = 0 Then
         Locate 1 , 1
         Lcd "     Line 2     "
         End If
    'Ende Routine Quellenwahl
    
    'IR input
    If Rc5_flag = 1 Then
          Reset Rc5_flag
            Print "toggle:" ; Command_rc5.7;
            'clear the toggle bit
            Command_rc5 = Command_rc5 And &B01111111
            'Locate 1 , 1
            'Cls
            'Lcd " Adresse:" ; Address_rc5 ; " Code:" ; Command_rc5
            End If
        'Waitms 100
    'IR input end
    
    If Command_rc5 = 16 Then
    Gosub Rechts
    End If
    
    If Command_rc5 = 17 Then
    Gosub Links
    End If
    
    If Room = 0 Then
    Gosub Roomsub
    End If
    
    If Command_rc5 = 13 Then
    Gosub Roomsub
    End If
    
    Locate 2 , 1                                                'Mute im Display weg
    Lcd "   Volume " ; A ; "     "
    
    
    B = Encoder(pina.3 , Pina.2 , Links , Rechts , 0)           'Encoder auslesen
    Waitms 3
    
    
    Goto Main
    
    Links:                                                      'leiser machen mit Encoder
     If A > 50 Then                                             'min. Lautstärke
      Decr A
     End If
    Gosub Spio
    Locate 2 , 1                                                'Volume darstellen
    Lcd "   Volume " ; A ; "  "
    Command_rc5 = 0                                             'RC5 zurücksetzen
    Return
    
    Rechts:                                                     'lauter machen mit Encoder
     If A < 192 Then                                            'max Lautstärke Gain = 1
      Incr A
     End If
    
    Gosub Spio
    Locate 2 , 1                                                'Volume darstellen
    Lcd "   Volume " ; A ; "  "
    Command_rc5 = 0                                             'RC5 zurücksetzen
    Return
    
    Roomsub:                                                    'Zimmerlautstärke
    A = 120
    Locate 2 , 1                                                'Volume darstellen
    Lcd "   Volume " ; A ; "  "
    
    
    Spio:                                                       'Unterprogramm Übergabe PGA
    Spiinit
    Cs2320 = 0
    Spiout A , 1
    Spiout A , 1
    Cs2320 = 1
    Return
    
    'RC5 subroutine
    Timer_irq:
      Timer0 = Timervorgabe
      Sample = Not Input_pin
    
      'bittimer erhöhen (bleibt bei 255 stehen)
      If Ir_bittimer < 255 Then Incr Ir_bittimer
    
      'flankenwechsel erkennen
      If Ir_lastsample <> Sample Then
    
         If Ir_bittimer <= Samples_min Then
           'flanke kommt zu früh: paket verwerfen
           Ir_bitcount = 0
         Else
           'nur Flankenwechsel in Bit-Mitte berücksichtigen
           If Ir_bittimer >= Samples_early Then
               If Ir_bittimer <= Samples_late Then
                 'Bit speichern
                  Shift Ir_data_tmp , Left , 1
                  Ir_data_tmp = Ir_data_tmp + Sample
                  Incr Ir_bitcount
               Else
                  'Flankenwechsel zu spät: Neuanfang mit gemessener Flanke
                  Ir_bitcount = 1
                  Ir_data_tmp = Sample
               End If
               'bittimer zurücksetzen wenn Timer > Samples_early
               Ir_bittimer = 0
           End If
         End If
    
        'Kontrolle des Startbits auf 1
         If Ir_bitcount = 1 Then Ir_bitcount = Ir_data_tmp.0
    
         'Alle 14 Bits gelesen?
         If Ir_bitcount >= 14 Then
           Command_rc5 = Ir_data_tmp                            'Bit 6 und 7 siehe unten
           Shift Ir_data_tmp , Right , 6
           Address_rc5 = Ir_data_tmp And &B00011111
           'For extended RC5 code, the extended bit is bit 6 of the command.
           Command_rc5.6 = Not Ir_data_tmp.6
           'The toggle bit is stored in bit 7 of the command
           Command_rc5.7 = Ir_data_tmp.5
           'Paket erfolgreich gelesen
           Set Rc5_flag
           'paket zurücksetzen
           Ir_bitcount = 0
         End If
    
      End If
      'sample im samplepuffer ablegen
      Ir_lastsample = Sample
    
    Return
    'RC5 subrutine end
    End

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Ort
    Dortmund
    Alter
    31
    Beiträge
    1.641
    ich erhebe jetzt nicht den Anspruch, mir alles durchgelesen zu haben, aber es ist so, wie chill-flo (leider ohne Punkt und Komma) gesagt hat. Du willst ja etwas ausgeben, wenn der Schalter auf low ist, aber nicht immer, sodnern nur, wenn er auf null geschaltet wird. Also baust du ein gedächtnis ein. Wenn du das erste Mal siehst, dass der Schalter low ist, setzt du ne Variable auf 1. Dann gibst du aufs lcd deinen Text aus und machst weiter. Wenn die Schleife das nächste mal durchlaufen wird, siehster du ja, dass die variable 1 ist, also hast du da wohl schon mal was gemacht. Also wird nix gemacht. Sobald du feststellst, dass der Schalter wieder auf high ist, setzt du die Variable auf 0 und so weiter.

    also in pseudocode, bin grad zu faul für basic:

    if taster == 0 & variable == 0
    print text auf lcd
    variable = 1
    if taster == 0 & variable == 1
    tu nix
    if taster == 1 & variable == 1
    variable = 0
    if taster == 1 & variable = 0
    tu nix

    end if

    fettisch.
    o
    L_
    OL
    This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat!

    http://de.youtube.com/watch?v=qV1cZ6jUeGE

Berechtigungen

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

LiFePO4 Speicher Test