- Labornetzteil AliExpress         
Ergebnis 1 bis 5 von 5

Thema: Denkfehler?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.09.2006
    Ort
    Nähe Mannheim
    Beiträge
    269

    Denkfehler?

    Anzeige

    Praxistest und DIY Projekte
    Hi
    Bin grade dabei eine Art Zeitschaltuhr mit LCD zu bauen.
    Ist im Grunde fertig nur ein kleines Problem besteht:

    Es ist wie folg aufgebaut:

    So sieht die Anzeige aus
    00:00:00
    01:29:01 z.b.
    usw

    die Variablen sind so aufgebaut:
    hms = hour minute sec so nebenbei ^^
    Lcd Hms(1) ; Hms(2) ; ":" ; Hms(3) ; Hms(4) ; ":" ; Hms(5) ; Hms(6)

    Das Problem sieht so aus:
    Ich drücke auf OK dann sollte eigentlich umgehend der Timer anfangen runter zu zählen,... tut er aber nicht.
    Es dauert jedesmal rellativ genau 5 sec bis angezeigt wird das der wert abgezogen wurde.
    Aber der angezeigte wert stimmt also es wird keine Sekunde vergessen oder übersprungen.
    Nur das LCD Display zeigt es 5 sec verzögert an.

    Hat jemand eine erklärung/Lösung hierfür? oder ein Vorschlag wie man soetwas einfacher realisiert?

    Hier der Code:

    Code:
    Do
         Locate 2 , 7                                           'Cursor auf 1 Zeile, 1 Spalte
     Lcd Hms(1) ; Hms(2) ; ":" ; Hms(3) ; Hms(4) ; ":" ; Hms(5) ; Hms(6)       'String auf Display anzeigen
     Waitms 100
      If Bumm = 1 Then
     Portb.2 = 1
     Bumm = 1
     End If
    
     Loop
    
    '-------------------------------------------------------------------------------
    '------- Timer 1 ISR
    '-------------------------------------------------------------------------------
    Isr_von_timer1:                                             'ISR von Timer1
    Dim Nr_z(2) As Byte                                         'zusammenzähl Variable
    Timer1 = 34285                                              'Timer auf 1 Sec einstellen
    If Hms_frg = 1 Then                                         'freigaben Abfrage
    
    If Hms(6) = 0 Then                                          'fang von hinten an
       Hms(6) = Hms_max(6)
    
          If Hms(5) = 0 Then                                    'Ziffer 5 = 0 => auf max(5) setzen
             Hms(5) = Hms_max(5)
             If Hms(4) = 0 Then                                 'Ziffer 4 = 0 => auf max(4) setzen
                Hms(4) = Hms_max(4)
                If Hms(3) = 0 Then
                   Hms(3) = Hms_max(3)                          'Ziffer 3 = 0 => auf max(3) setzen
    
                   If Hms(2) = 0 Then                           'Ziffer 2 = 0 => auf max(2) setzen
                      Hms(2) = Hms_max(2)
                      If Hms(1) = 0 Then                        'Ziffer 1 = 0 => auf max(1) setzen
                      Hms_frg = 0
                      Bumm = 1                                  'Alles 0 Ende Verlauf
                         Cls
    
                      Else
                         Decr Hms(1)
                      End If
    
                   Else
                      Decr Hms(2)
                   End If
                Else
                   Decr Hms(3)
                End If
             Else
                Decr Hms(4)
             End If
    
          Else
             Decr Hms(5)
          End If
    
    Else
       Decr Hms(6)
    End If
    
    
    If Zuend(1) < 3 Then
    If Zuend(1) = 1 Then
    Portb.1 = 1
    Waitms 200
    Portb.1 = 0
    Else
    Nr_z(2) = 0
    For Nr_z(1) = 1 To 5
    Nr_z(2) = Nr_z(2) + Hms(nr_z(1))
    Next Nr_z(1)
    If Nr_z(2) = 0 Then
    Portb.1 = 1
    Waitms 200
    Portb.1 = 0
    End If
    End If
    End If
    
    End If
    
    
    
    Return
    End
    mfg

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    zeig mal den Rest vom Programm, man sieht hier keine Timer und ISR- Initialisierung.
    Und ein Wait in der ISR geht schon garnicht, da erreicht man alles, aber nicht unbedingt was man meint !
    Eine ISR muss so schnell wie möglich verlassen werden, damit der Rest weiterarbeiten kann, und keine IRQ-Aufrufe verloren gehen.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Ja, insgesamt 400ms Wartezeit sind viel zuviel in ner ISR!
    Die IF/THENs alleine erscheinen mir schon fast zu lang...

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.09.2006
    Ort
    Nähe Mannheim
    Beiträge
    269
    Also die Wait Schleifen sind mit einem If,.. getrennt also maximal 200mS Wartezeit.
    Die ISR des Timers ist auf 1 sec eingestellt. Heißt der AVR hat noch 800mS zum rechnen der Hauptschleife übrig.
    Sagen wir dank der vielen If schleifen 780 rum.
    Das dumme ist jez halt das ich meine Hauptschleife wie eine Schrittkette verwenden will, was auch hervorragend funktioniert.

    Heist alles was mit der Zeit also der "Uhr" zu tun hat muss in diese ISR rein.
    Oder hat jemand eine bessere Idee ? wäre super ^^

    Das Wait 200ms hat den Sinn einen Port blinken zu lassen unabhängig davon was die Hauptschleife macht.
    Deswegen sind ja noch mehr if schleifen drin um festzulegen wann dieser Port Blinkt.
    200ms müssen min sein da an diesem Port ein kleiner Pieper hängt und unter dieser Zeit macht der keinen Mucks.

    Bin am überlegen das ganze ding nochmal neu zu schreiben aber hoffe einfach das momentane Programm zu "retten" ^^.

    Also das komplette Programm braucht man nicht das ist etwas länger ^^
    (81% des AVR)
    Aber ok hier der Relevante Programm Teil das eigentliche ist viel länger:



    Code:
                                 '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '----------------------------- LCD "Eieruhr" -----------------------------------
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '------- Voreinstellungen
    '-------------------------------------------------------------------------------
    $lib "lcd4busy.lib"                                         'ersetzt die Standard LCD Bibliothek
    $regfile = "m8535.dat"                                      'ATMega8535
    $crystal = 8000000                                          'Quarz: 8.0000 MHz
    '-------------------------------------------------------------------------------
    Config Timer1 = Timer , Prescale = 256                      'Konfiguriere Timer1
    Enable Timer1                                               'schalte den Timer1 ein
    On Timer1 Isr_von_timer1                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
    Enable Interrupts
    Timer1 = 34285
    Wait 1
    '-------------------------------------------------------------------------------
    '------- LCD Config
    '-------------------------------------------------------------------------------
     Config Lcd = 20 * 4                                        'wir verwenden ein 4 x 20 Zeichen Display
     Const _lcdport = Portd
     Const _lcdddr = Ddrd
     Const _lcdin = Pind
     Const _lcd_e = 3
     Const _lcd_rw = 2
     Const _lcd_rs = 1
     Cls
     Display On
     Cursor Off
     Initlcd
     Delay
     Initlcd
     Restart:
    
    '-------------------------------------------------------------------------------
    '------- Port Config
    '-------------------------------------------------------------------------------
    '------- Output
    '-------------------------------------------------------------------------------
    Config Porta.7 = Output
    Config Portc.4 = Output
    Config Portc.0 = Output
    Config Portb.1 = Output
    Config Portb.2 = Output
    Portb.1 = 0
    Portb.2 = 0
    Portc.4 = 0                                                 'PC5
    Portc.0 = 0                                                 'PC6
    Porta.7 = 0                                                 'PC7
    '-------------------------------------------------------------------------------
    '------- Input
    '-------------------------------------------------------------------------------
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input
    Config Pinc.5 = Input
    Config Pinc.6 = Input
    Config Pinc.7 = Input
    
    '-------------------------------------------------------------------------------
    '------- Variablen Config
    '-------------------------------------------------------------------------------
    '------- Spiel Start Optionen
    Dim Hms(7) As Byte
    Dim Hms_max(6) As Byte
    Dim Hms_frg As Bit
    '------- Ensch. Optionen
    Dim Entsch(4) As Byte
    Entsch(1) = 74
    Entsch(2) = 74
    Entsch(3) = 74
    Entsch(4) = 78
    '------- Zünder Optionen
    Dim Zuend(3) As Byte
    Zuend(1) = 2                                                '1 = immer 2 = 10sec 3= nie     Blink Port
    Zuend(2) = 74                                               '74 = J 78 = N
    Zuend(3) = 1                                                '1 =zünden 2=Warnen 3=Nichts
    '------- Karten Optionen
    Dim Karten(12) As Byte
    
    
    '------- Variablen Wert verteilen
    For Nr = 1 To 6
    Hms(nr) = 0
    Karten(nr) = Nr
    Next Nr
    Hms(2) = 1
    Hms(7) = 9
    
    Hms_max(1) = 2
    Hms_max(2) = 4
    Hms_max(3) = 5
    Hms_max(4) = 9
    Hms_max(5) = 5
    Hms_max(6) = 9
    
    
    Karten(11) = 74
    Karten(12) = 0
    Entsch(1) = 74
    Entsch(2) = 74
    Entsch(3) = 74
    Entsch(4) = 78
    
    Karten(5) = 1
    Karten(6) = 2
    Karten(7) = 3
    Karten(8) = 4
    Karten(9) = 1
    Karten(10) = 2
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '------- Bomben STart
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
     Cls                                                        'loesche das LCD Display
    Delay
     Locate 1 , 5
     Lcd "Simulation's"
     Locate 2 , 8
     Lcd "Bombe"
     Locate 3 , 6
     Lcd "beliebige"
     Locate 4 , 4
     Lcd "Taste drücken"
     Cursor Off
    '-------------------------------------------------------------------------------
    '------- Tasten Abfrage
    Gosub Tast_a
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '------- Start Optionen
    '-------------------------------------------------------------------------------
    Menu:
    Hms_frg = 0
    '-------------------------------------------------------------------------------
     Cls                                                        'loesche das LCD Display
    Delay
     Locate 1 , 1
     Lcd "-1- Start"
     Locate 2 , 1
     Lcd "-2- Entschärfung Opt"
     Locate 3 , 1
     Lcd "-3- Zünder Opt"
     Locate 4 , 1
     Lcd "-4- Karten Opt"
     Cursor Off
    '-------------------------------------------------------------------------------
    '------- Tasten Abfrage
    Gosub Tast_a
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '------- 1 = Start Optioenn => Zeit Einstellen
    '-------------------------------------------------------------------------------
    If Tstaa = 1 Then
    Cls
     Locate 1 , 4
     Lcd "Start Optionen"
     Locate 2 , 3
     Lcd "Zeit:"
     Locate 4 , 1
     Lcd "*=Start"
     Locate 4 , 16
     Lcd "#=ESC"
    Cursor Blink
    Nr = 0
    Hms(7) = 9
    Do
     Locate 2 , 9
     Lcd Hms(1) ; Hms(2) ; ":" ; Hms(3) ; Hms(4) ; ":" ; Hms(5) ; Hms(6)       'String auf Display anzeigen
     Locate 2 , Hms(7)
    
     Incr Nr
    Hms(7) = 9 + Nr
    If Nr > 1 Then Incr Hms(7)
    If Nr > 3 Then Incr Hms(7)
    Gosub Tast_a
    If Tstaa = 11 Then Tstaa = 0
    If Tstaa = 12 Then Goto Menu
    
    
    '-------------------------------------------------------------------------------
    '------- Eigentliche Hauptschleife
    '------- Untermenu von Taster 1
    '-------------------------------------------------------------------------------
    If Tstaa = 10 Then
    Dim Bod_counter As Word                                     'dauert des rellativ genauesn wertes   UNWICHTIG
     Cursor Noblink
    Cls
     Locate 1 , 6
     Lcd "Rest Zeit:"
     Locate 2 , 7
     Lcd Hms(1) ; Hms(2) ; ":" ; Hms(3) ; Hms(4) ; ":" ; Hms(5) ; Hms(6)       'ANZEIGE der HMS Werte
        Locate 3 , 4                                            'Cursor weg
    
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    Do
    
    
    If Tstaa = 11 Then                                          'hier ADV Wert Abfrage
       Incr Bod_counter
       Waitms 1
    
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
      If Bod_counter > 500 Then
    '-------------------------------------------------------------------------------
        Locate 3 , 4                                            'Cursor auf 1 Zeile, 1 Spalte
        Lcd " <1> Taste     "                                   'String auf Display anzeigen
        Locate 4 , 4                                            'Cursor auf 1 Zeile, 1 Spalte
        Lcd "   drücken!    "                                   'String auf Display anzeigen
    '-------------------------------------------------------------------------------
      Do
      'Avr Abfrage wegen Hochheben des Kastens
      Loop Until Pinc.7 = 1
    '-------------------------------------------------------------------------------
    
    
        Locate 3 , 4                                            'Cursor auf 1 Zeile, 1 Spalte
        Lcd "Metall Taster "                                    'String auf Display anzeigen
        Locate 4 , 4                                            'Cursor auf 1 Zeile, 1 Spalte
        Lcd "   drücken!    "                                   'String auf Display anzeigen
        Hms_frg = 1
        Wait 5
    Do
         Locate 2 , 7                                           'Cursor auf 1 Zeile, 1 Spalte
     Lcd Hms(1) ; Hms(2) ; ":" ; Hms(3) ; Hms(4) ; ":" ; Hms(5) ; Hms(6)       'String auf Display anzeigen
     Waitms 100
    
      If Bumm = 1 Then
     Portb.2 = 1
     Bumm = 1
     End If
    
     Loop
        Goto Memmory
    
      End If
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    
    Else
    
    
     Locate 3 , 5                                               'Cursor auf 1 Zeile, 1 Spalte
     Lcd "warte auf"                                            'String auf Display anzeigen
     Locate 4 , 5                                               'Cursor auf 1 Zeile, 1 Spalte
     Lcd "Bodentaster"                                          'String auf Display anzeigen
    Bod_counter = 0
    Hms_frg = 0
     Gosub Tast_a
     End If
    Loop
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    
    Goto Menu
    '-------------------------------------------------------------------------------
    End If
    '-------------------------------------------------------------------------------
    Hms(nr) = Tstaa
    If Hms(nr) > Hms_max(nr) Then Hms(nr) = Hms_max(nr)
    If Nr = 6 Then
    Nr = 0
    Hms(7) = 9
    End If
    Loop
    End If
    
    
    
    
    '-------------------------------------------------------------------------------
    '------- Taste über 4 gedrückt => zurück zum Menu
    '-------------------------------------------------------------------------------
    If Tstaa > 4 Then Goto Menu
    Goto Menu
    
    Loop
    '-------------------------------------------------------------------------------
    '------- Timer 1 ISR
    '-------------------------------------------------------------------------------
    Isr_von_timer1:                                             'ISR von Timer1
    Dim Nr_z(2) As Byte                                         'zusammenzähl Variable
    Timer1 = 34285                                              'Timer auf 1 Sec einstellen
    If Hms_frg = 1 Then                                         'freigaben Abfrage
    
    If Hms(6) = 0 Then                                          'fang von hinten an
       Hms(6) = Hms_max(6)
    
          If Hms(5) = 0 Then                                    'Ziffer 5 = 0 => auf max(5) setzen
             Hms(5) = Hms_max(5)
             If Hms(4) = 0 Then                                 'Ziffer 4 = 0 => auf max(4) setzen
                Hms(4) = Hms_max(4)
                If Hms(3) = 0 Then
                   Hms(3) = Hms_max(3)                          'Ziffer 3 = 0 => auf max(3) setzen
    
                   If Hms(2) = 0 Then                           'Ziffer 2 = 0 => auf max(2) setzen
                      Hms(2) = Hms_max(2)
                      If Hms(1) = 0 Then                        'Ziffer 1 = 0 => auf max(1) setzen
                      Hms_frg = 0
                      Bumm = 1                                  'Alles 0 Ende Verlauf
                         Cls
    
                      Else
                         Decr Hms(1)
                      End If
    
                   Else
                      Decr Hms(2)
                   End If
                Else
                   Decr Hms(3)
                End If
             Else
                Decr Hms(4)
             End If
    
          Else
             Decr Hms(5)
          End If
    
    Else
       Decr Hms(6)
    End If
    
    
    If Zuend(1) < 3 Then
    If Zuend(1) = 1 Then
    Portb.1 = 1
    Waitms 200
    Portb.1 = 0
    Else
    Nr_z(2) = 0
    For Nr_z(1) = 1 To 5
    Nr_z(2) = Nr_z(2) + Hms(nr_z(1))
    Next Nr_z(1)
    If Nr_z(2) = 0 Then
    Portb.1 = 1
    Waitms 200
    Portb.1 = 0
    End If
    End If
    End If
    
    End If
    
    
    
    Return
    End
    
    
    
    
    
    '-------------------------------------------------------------------------------
    '------- Tastatur Auswertung
    '-------------------------------------------------------------------------------
    Tast_a:
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    Dim Freigabe As Bit
    Freigabe = 0
    Tsta = 13
    '-------------------------------------------------------------------------------
    Do
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    Do
    '-------------------------------------------------------------------------------
    Tsta = 13
    If Pinc.7 = 1 Then
    
    Tsta = 1
    Tstaa_z = 1
    Tstaa_nr = 8
    End If
    If Pinc.6 = 1 Then
    Tsta = 2
    Tstaa_z = 1
    Tstaa_nr = 10
    End If
    If Pinc.5 = 1 Then
    Tsta = 3
    Tstaa_z = 1
    Tstaa_nr = 12
    End If
    '-------------------------------------------------------------------------------
    Porta.7 = 1
    '-------------------------------------------------------------------------------
    If Pinc.3 = 1 Then
    Tsta = 4
    Tstaa_z = 2
    Tstaa_nr = 8
    End If
    If Pinc.2 = 1 Then
    Tsta = 7
    Tstaa_z = 3
    Tstaa_nr = 8
    End If
    If Pinc.1 = 1 Then
    Tsta = 10
    Tstaa_z = 4
    Tstaa_nr = 8
    End If
    '-------------------------------------------------------------------------------
    Porta.7 = 0
    '-------------------------------------------------------------------------------
    Portc.0 = 1
    '-------------------------------------------------------------------------------
    If Pinc.3 = 1 Then
    Tsta = 5
    Tstaa_z = 2
    Tstaa_nr = 10
    End If
    If Pinc.2 = 1 Then
    Tsta = 8
    Tstaa_z = 3
    Tstaa_nr = 10
    End If
    If Pinc.1 = 1 Then
    Tsta = 11
    Tstaa_z = 4
    Tstaa_nr = 10
    End If
    '-------------------------------------------------------------------------------
    Portc.0 = 0
    '-------------------------------------------------------------------------------
    Portc.4 = 1
    '-------------------------------------------------------------------------------
    If Pinc.3 = 1 Then
    Tsta = 6
    Tstaa_z = 2
    Tstaa_nr = 12
    End If
    If Pinc.2 = 1 Then
    Tsta = 9
    Tstaa_z = 3
    Tstaa_nr = 12
    End If
    If Pinc.1 = 1 Then
    Tsta = 12
    Tstaa_z = 4
    Tstaa_nr = 12
    End If
    '-------------------------------------------------------------------------------
    Portc.4 = 0                                                 'PC5
    Portc.0 = 0                                                 'PC6
    Porta.7 = 0                                                 'PC7
    '-------------------------------------------------------------------------------
    Loop Until Tsta = 13 Or Freigabe = 1
    Freigabe = 1
    '-------------------------------------------------------------------------------
    Incr Random
    If Random > 6 Then Random = 1
    Loop Until Tsta < 13
    Tstaa = Tsta
    Return

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.09.2006
    Ort
    Nähe Mannheim
    Beiträge
    269
    WAAA bin ich doof
    Habe soeben das Problem gefunden.
    Da stand weiter rechts geschrieben (irgentwie tabulator Taste bekommen)
    ein Wait 5 -_-
    Das erklärt die 5 sec ^^

    Kann geschlossen werden
    danke für die antworten ^^


Berechtigungen

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

Solar Speicher und Akkus Tests