PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Countdownzähler



Testman3000
29.07.2007, 22:41
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:)



$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

Vitis
30.07.2007, 12:26
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.