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

Thema: Programm zu langsam?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.11.2006
    Beiträge
    30

    Programm zu langsam?

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    Ich möchte einen Drehencoder auslesen, um klein anzufangen möchte ich ersteinmal alle die High/low zustände zählen.

    ich hab ein Programm geschrieben, mit dem das auch theoretisch möglich ist. Aber leider nur wenn man der Encoder sehr langsam dreht... wenn man zu schnell dreht ändert sich der wert nicht mehr.

    ich denke mein Programm ist villeicht etwas komisch aufgebaut, aber mir ist keine andere Lösung eingefallen (bin absoluter anfänger)

    kann es daran leigen das der AVR mit dem zählen nicht mehr hinterher kommt?
    Oder kann es auch am Schalttransistor liegen? BC337-40

    Mfg Hübi


    Code:
                                             'Encoder test
    '--------------------------------------------------------------
    $regfile = "attiny2313.dat"                                 'ATTINY 2313
    $crystal = 8000000                                          'TACKT 8Mhz
    
    
    '******** Deklarationen ********
    
    
     Dim Zaehlwert As Word
    
    '******** Initialisierung ********                                                 '
    
     Ddrd = &B11100000
    Portd = &B00000000
    
    Zaehlwert = 1
    
    '******** Hauptprogramm ********
    
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.2       'LCD configurieren (datenleitung)
    
    Dim A As Byte
    Config Lcd = 16 * 2                                         ' 16*2 Zeilen
    
    
    Main:                                                       'hauptprogramm
    Cls                                                         'display löschen
      Do
    
        Locate 1 , 1                                            'cursor in Zeile 1, Reihe 1
        Lcd Zaehlwert                                           'schreibe "Zählwert"
        Cursor Off                                              'cursor off
    
    
        If Pind.2 = 1 Then                                      'wenn taster gedrückt, dann
        Zaehlwert = Zaehlwert + 1                               'addiere 1 zu Zähltwert
       Goto Unterprogramm                                       'gehe zu Unterprogramm
    
        End If                                                  'end if
    
    
      Loop
    
    
    
    
     '---------------------------------------------------------------------------------
    
    
    
    
    
     Unterprogramm:                                             'Unterprogramm
    
      Do
    
       If Pind.2 = 0 Then                                       'wenn Taster losgelasse wird
       Goto Main                                                'springe zurück ins Hauptprogramm
       End If                                                   'end if
    
    
    
      Loop

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    08.03.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    14
    Hallo Hübi

    Wenn du das so Programmierst ist das wirklich alles zu langsam.

    z.B in ein Lcd schreiben braucht viel Zeit , genau so wie ein Print befehl ...
    sowas musst du mit einem Interrupt lösen sei es mit Interrupt an einem Pin z.B INT0 aber ich finde eine Timer Lösung besser.

    Timerlösung = es wird immer in einen Timer gesprungen und dort die Tasterstellung abgefragt ....

    Mfg Thomas

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    99 % Leistung wird am LCD verplempert.

    und sehr unlogisch deine Goto.

    Wenn LCD Ausgabe dann:
    if Zaehlwert<>Zaehlwert_Alt then
    Locate 1,1
    LCD Zaehlwert
    end if

    dann kann man auch das LCD besser lesen.
    Und da Du ja hochzahlst , muß das LCD nur beim Starten 1x Cls werden.

    Gento

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.02.2007
    Ort
    BA-Wü
    Alter
    32
    Beiträge
    165
    Die LCD-Abfrage braucht wahrscheinlich zu lang, probier doch mal, ob es geht, wenn du die nur alle 10 Änderungen oder so machst.

    [EDIT]
    OK, man sollte aktualisieren, bevor man antwortet
    [/EDIT]
    Viele Grüße,
    Michael

    Sn60Pb40 Rulez
    www.silvestercountdown.de.vu- Dein Countdown bis Neujahr!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    28.11.2006
    Beiträge
    30
    Danke für eure Hilfe,
    ich habe versucht möglichst alles richtig umzusetzten und hoffe ich habe es richtig gemacht/bzw. alles verstanden

    wert <> wert then 'heißt doch wenn sich wert verändert, dann: oder?

    leider klappt es immer noch nicht richtig... es ist sogar etwas schlechter geworden, aber vom Prinzip her funktioniert das Programm denk ich

    Code:
                                             'Encoder test
    '--------------------------------------------------------------
    $regfile = "attiny2313.dat"                                 'ATTINY 2313
    $crystal = 8000000                                          'TACKT 8Mhz
    
    
    '******** Deklarationen ********
    
    
     Dim Zaehlwert As Word
    
    '******** Initialisierung ********                                                 '
    
     Ddrd = &B11100000
    Portd = &B00000000
    
    Zaehlwert = 1
    
    '******** Hauptprogramm ********
    
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.2       'LCD configurieren (datenleitung)
    
    Config Int0 = Falling                                       'INT0 = wenn taster gedrückt wurde
    Enable Int0                                                 ' erlaube INT0
    Enable Interrupts                                           ' erlaube Interrupts
    On Int0 Unterprogramm                                       ' gehe zu Unterprogramm
    
    Dim A As Byte
    Config Lcd = 16 * 2                                         ' 16*2 Zeilen
    
    Cls                                                         'display löschen
    Main:                                                       'hauptprogramm
    
      Do
    
    
        If Zaehlwert <> Zaehlwert Then                          'wenn sich zählwert ändert
        Locate 1 , 1                                            'cursor in Zeile 1, Reihe 1
        Lcd Zaehlwert                                           'schreibe "Zählwert"
        Cursor Off                                              'cursor off
    
        End If                                                  'end if
    
    
      Loop
    
    
    
    
     '---------------------------------------------------------------------------------
    
    
    
    
    
     Unterprogramm:                                             'Unterprogramm
    
      Do
        Zaehlwert = Zaehlwert + 1                               'addiere 1 zu Zähltwert
    
      Return                                                    'zurück zu Main
    
    
      Loop

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    hallo hübi,

    versuch mal folgenden code:

    Code:
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    
    
    Dim Zaehlwert As Word
    Dim Zaehlwert_old As Word
    Zaehlwert_old = 65000
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.2
    Initlcd
    Cursor Off Noblink
    
    Cls
    
    Config Int0 = Falling
    Enable Int0
    On Int0 Isr_von_int0
    
    Config Pind.2 = Input
    Portd.2 = 1
    
    Enable Interrupts
    
    Locate 1 , 1
    Lcd "Zaehlwert = "
    
    Do
    
    If Zaehlwert_old <> Zaehlwert Then
    Locate 1 , 13
    Lcd Zaehlwert
    Zaehlwert_old = Zaehlwert
    End If
    
    Loop
    
    End
    
    Isr_von_int0:
    Incr Zaehlwert
    Return
    wenn du fragen dazu hast, dann frag einfach

    gruß
    chris

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Fünf Zeilen geändert und sollte jetzt gehen.
    Gento

    Code:
     Dim Zaehlwert As Word
     Dim Zaehlwert_alt AS Word
    '******** Initialisierung ********                                                 '
    
     Ddrd = &B11100000
    Portd = &B00000000
    
    '******** Hauptprogramm ********
    
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.2       'LCD configurieren (datenleitung)
    
    Config Int0 = Falling                                       'INT0 = wenn taster gedrückt wurde
    Enable Int0                                                 ' erlaube INT0
    Enable Interrupts                                           ' erlaube Interrupts
    On Int0 Unterprogramm                                       ' gehe zu Unterprogramm
    
    Dim A As Byte
    Config Lcd = 16 * 2                                         ' 16*2 Zeilen
    
    Cls                                                         'display löschen
    Zaehlwert=0
    Zaehlwert_Alt=1000
    Main:                                                       'hauptprogramm
    
      Do
    
    
        If Zaehlwert <> Zaehlwert_Alt Then                          'wenn sich zählwert ändert
        Locate 1 , 1                                            'cursor in Zeile 1, Reihe 1
        Lcd Zaehlwert                                           'schreibe "Zählwert"
        Cursor Off                                              'cursor off
    
        End If                                                  'end if
    
    
      Loop
    
    
    
    
     '---------------------------------------------------------------------------------
    
    
    
    
    
     Unterprogramm:                                             'Unterprogramm
    
      Do
    Zaehlwert_alt=Zaehlwert    
    Zaehlwert = Zaehlwert + 1                               'addiere 1 zu Zähltwert
    
      Return                                                    'zurück zu Main
    
    
      Loop
    war einer scheller

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.11.2008
    Ort
    Kapfenberg
    Beiträge
    628
    Gebt doch bitte das "Cursor Off" aus der Schleife raus.
    Was macht ein weiteres "Do" im Unterprogramm?

    Grüße
    Thomas

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.02.2007
    Ort
    BA-Wü
    Alter
    32
    Beiträge
    165
    Und gleich nochmal ne Version!
    Code:
                                             'Encoder test
    '--------------------------------------------------------------
    $regfile = "attiny2313.dat"                                 'ATTINY 2313
    $crystal = 8000000                                          'TACKT 8Mhz
    
    
    '******** Deklarationen ********
    
    
    Dim Zaehlwert As Integer
    Dim Zaehlwert_alt As Integer
    
    '******** Initialisierung ********            '
    
    Ddrd = &B11100000
    Portd = &B00000000
    
    Zaehlwert = 1
    
    '******** Hauptprogramm ********
    
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.2       'LCD configurieren (datenleitung)
    
    Config Int0 = Falling                                       'INT0 = wenn taster gedrückt wurde
    Enable Int0                                                 ' erlaube INT0
    Enable Interrupts                                           ' erlaube Interrupts
    On Int0 Unterprogramm                                       ' gehe zu Unterprogramm
    
    Dim A As Byte
    Config Lcd = 16 * 2                                         ' 16*2 Zeilen
    
    Cls                                                         'display löschen
    Cursor Off
    
    Do
    
    
       If Zaehlwert > Zaehlwert_alt Then                        'wenn sich zählwert ändert
          Zaehlwert_alt = Zaehlwert
          Locate 1 , 1                                          'cursor in Zeile 1, Reihe 1
          Lcd Zaehlwert                                         'schreibe "Zählwert"
       End If                                                   'end if
    
    
    Loop
    
    
    
    
     '---------------------------------------------------------------------------------
    
    
    
    
    
    Unterprogramm:                                              'Unterprogramm
       Zaehlwert = Zaehlwert + 1                                'addiere 1 zu Zähltwert
    Return                                                      'zurück zu Main
    Viele Grüße,
    Michael

    Sn60Pb40 Rulez
    www.silvestercountdown.de.vu- Dein Countdown bis Neujahr!

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.11.2008
    Ort
    Kapfenberg
    Beiträge
    628
    Jetzt nur noch der Schönheit wegen ein "End" nach "Return" einfügen, dann passts perfekt!

    Grüße
    Thomas

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