- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 2 von 2

Thema: Countdownzähler

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.06.2007
    Beiträge
    63

    Countdownzähler

    Anzeige

    Powerstation Test
    Hallo,

    hab mir heut einen Countdownzähler gebastelt auf Basis des RN-Control 1.4. Also kann Damit eine Zeit in Minuten einstellen. Und Wenn ich den Timer aktiviere läuft die Zeit ab und ein Ausgang wird gesetzt. Ist die Zeit abgelaufen Wird akustisch Alarm gegeben und der Ausgang wir zurückgesetzt. Alles in Verbindugn mit einen LCD (16X2).

    Aber nun bin ich Blutiger Anfänger. Und für die kleine Funktion ist mein Code Riesig(siehe Anhang) , hat jmd vllt eine einfachere Lösung für das was ich brauche? Meine Lösung is besitmmt auch alles andere als Optimiert auf geschwindigkeit.......Sagt mir aml was alles Schlecht ist

    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 16000000
    
    
    
    Declare Function Tastenabfrage() As Byte                    'Für Tastenabfrage
    
    
    'Variablen
    Dim Taste As Byte                                           'Für Tastenabfrage
    Dim Zeiteinstellung As Byte                                 'Variable für Eingestelte Zeit
    Zeiteinstellung = 0
    Dim Sekunden As Byte                                        'Sekunden
    Sekunden = 0
    Dim Timerstatus As Bit                                      'Timer: 1 = An oder 0 = Aus
    Dim Zeit As Byte                                            'Restzeit
    
    
    'AUsgänge und Eingänge
    Config Portd.7 = Output                                     'Soundausgang
    Config Porta.7 = Input                                      'Eingang für Tasterabfrage
    Porta.7 = 1                                                 'Pullup EIN
    Config Portc.0 = Output                                     'Countdownausgang
    Portc.0 = 1
    
    
    
    
    
    'LCD-Config
    Cls
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.5 , Rs = Porta.4
    Config Lcdbus = 4
    
    
    'ADC-Config
    Config Adc = Single , Prescaler = Auto
    
    
    'Timer-Config
    Config Timer1 = Timer , Prescale = 256
    On Timer1 Isr_von_timer1
    Enable Interrupts
    Timer1 = 3036
    
    Cls
    Locate 1 , 1
    Lcd "Countdownzaehler "                                     'Begrüßungstext
    
    
    Sound Portd.7 , 300 , 350                                   ' Begrüsungssound:)
    Sound Portd.7 , 300 , 400
    Sound Portd.7 , 300 , 450
    Waitms 1500
    
    
    
    
    
    Countdown:                                                  'Menü 1
    Waitms 200
    
    
    Cls
    Locate 1 , 1
    Lcd "   Countdown   "
    Locate 2 , 1
    Lcd "Stop                "
    
    
    
    
    Do
    
    
    If Zeit = 0 And Timerstatus = 1 Then                        'Auschalten nach Ablauf der Zeit
      Aus:
      Disable Timer1
      Portc.0 = 1
      Print "Timer AUS"
      Reset Timerstatus
      Locate 1 , 1
      Lcd "!!!!!!ALARM!!!!!! "
      Locate 2 , 1
      Lcd "!ALARM!!!!Alarm!     "
      Zeit = Zeiteinstellung
    
      Goto Alarm
    End If
    
    
    
    'Anzeige der Restzeit auf LCD
    If Timerstatus = 1 Then
    Locate 2 , 1
    Lcd "Start, Zeit:" ; Zeit ; "    "
    End If
    
    
    
    
    
    'Tastenabfrage
        Taste = Tastenabfrage()
       If Taste <> 0 Then
    
          Select Case Taste                                     'Countdown Starten
             Case 1
                   If Timerstatus = 0 And Zeit > 0 Then
                   Zeit = Zeiteinstellung
                   Set Timerstatus
                   Timer1 = 3036
                   Enable Timer1
                   Print "Timer EIN"
                   Portc.0 = 0
                   End If
    
                   If Zeit = 0 Then                             'Falls keine Zeit eingestellt ist, gehts automatisch zur Zeitauswahl bei versuch zu Starten
                   Locate 2 , 1
                   Lcd "Zeit Einstellen!"
                   Waitms 1200
                   Goto Zeiteinstellung
                   End If
    
    
    
             Case 2                                             'Countdown Stopen per Hand
                   If Timerstatus = 1 Then
                     Disable Timer1
                         Portc.0 = 1
                         Print "Timer AUS"
                         Reset Timerstatus
                         Locate 2 , 1
                         Lcd "Stop                     "
                         Zeit = Zeiteinstellung
                     End If
             Case 3
                   'nicht zugewiesen
    
             Case 4
                   'nicht zugewisen
    
             Case 5                                             'Taste 5: Ins Menü zum einstellen der gewünschten Countdownzeit.
                   If Timerstatus = 0 Then
                   Goto Zeiteinstellung
                   End If
    
          End Select
        Waitms 400
       End If
    
    
    Loop
    
    
    
    
    
    Isr_von_timer1:                                             'Überlauf Timer1 nach 1 Sekunde
    Incr Sekunden
    Timer1 = 3036
    If Sekunden >= 60 Then                                      'Umrechnen in Minuten
    Decr Zeit
    Sekunden = 0
    End If
    
    Return
    
    
    
     'Diese Unterfunktion fragt die Tastatur am analogen Port ab
    Function Tastenabfrage() As Byte
    Local Ws As Word
    
       Tastenabfrage = 0
       Start Adc
       Ws = Getadc(7)
    
       If Ws < 500 Then
          Select Case Ws
             Case 400 To 450
                Tastenabfrage = 1
    
             Case 330 To 380
                Tastenabfrage = 2
    
             Case 260 To 305
                Tastenabfrage = 3
    
             Case 180 To 220
                Tastenabfrage = 4
    
             Case 90 To 130
                Tastenabfrage = 5
    
    
          End Select
    
    
       End If
    
    
    End Function
    
    
    Zeiteinstellung:                                            'Menü2
    Waitms 200
    
    Cls
    Locate 1 , 1
    Lcd " Countdownzeit  "
    Locate 2 , 1
    Lcd " " ; Zeiteinstellung ; "   Minuten    "
    
    
    
    Do
    
    'Tastenabfrage
        Taste = Tastenabfrage()
       If Taste <> 0 Then
    
          Select Case Taste
             Case 1
                   Incr Zeiteinstellung
                   Waitms 150
                   Locate 2 , 1
                   Lcd " " ; Zeiteinstellung ; "   Minuten    " 'Taste1: Countdownzeit um 1 erhöhen
    
             Case 2
                   Decr Zeiteinstellung
                   Waitms 150
                   Locate 2 , 1
                   Lcd " " ; Zeiteinstellung ; "   Minuten    " 'Taste2: Countdownzeit um 1 vermindern
    
             Case 3
                   Zeiteinstellung = Zeiteinstellung + 10
                   Waitms 150
                   Locate 2 , 1
                   Lcd " " ; Zeiteinstellung ; "   Minuten    " 'Taste3: Countdownzeit um 10 erhöhen
    
             Case 4
                   Zeiteinstellung = Zeiteinstellung - 10
                   Waitms 150
                   Locate 2 , 1
                   Lcd " " ; Zeiteinstellung ; "   Minuten    " 'Taste4: Countdownzeit um 10 vermindern
    
    
             Case 5                                             'Taste5:Bestätigen, Zurück zum Countdown
                   Zeit = Zeiteinstellung                       'Setzen der gewählten Zeit
                   Goto Countdown
    
          End Select
    
       End If
    Waitms 100
    Loop
    
    Alarm:                                                      'Beep-Ton countdown Abgelaufen, Taste 2 Drücken zum Quittieren.
    Do
    Sound Pord.7 , 400 , 800
    Sound Pord.7 , 400 , 700
    
    'Tastenabfrage
        Taste = Tastenabfrage()
       If Taste <> 0 Then
    
       Select Case Taste
             Case 2
                    Goto Countdown
    
       End Select
    
       End If
    
    Loop
    
    
    
    
    
    
    End
    Falls es jmd Testen will. Mit der Taste 1 startet man den Counter, Taste 2 hält ihn an. Mit Taste 5 geht man ins Menü zur Auswahl der Zeit. Ist man in diesem Menü kann man mit Taste 1 die Zeit um 1 Min. erhöhen und mit Taste 2 verringer. Mit den Tasten 3 und 4 geht das in 10er Schritten.
    Mit Taste 5 verlässt man das Menü.

    PS: Zeit geht nur bis max 255 Minuten, aber egal eigentlich.


    MFG

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Die größe Deines Codes kommt vermutlich
    von 2 Faktoren her.
    Einmal ist die Ausgabefunktion für n LCD eben nicht
    winzig, wird sich aber kaum straffen lassen.
    Zum Anderen hast Du komplexe Menü und Anzeigestrukturen
    mit viel vorgegebenem Text, der frisst auch ordentlich, wird sich
    aber auch nicht verkleinern lassen.

    Nur mal als Denkanstoß, Ein Zeichen als Text vorgegeben
    belegt ein Byte. Ein Befehlt für den AVR belegt normalerweise
    zwei Bytes und da Tut der Dings dann was damit ;o)

    Hab auch grad n Projekt mit LCD fertig, da brauchte das Menü dann
    am Ende 2/3 des gesamten belegten Flash.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Berechtigungen

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

12V Akku bauen