PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : timer optimieren kann mir jemand helfen?



xbgamer
01.11.2006, 21:49
also ich habe mich jetzt mal hingesezt und hab ne halbe ewigkeit gebraucht den timer so hinzubekommen dass er im sekundentakt blinkt. jetzt habe ich dass hier:


$regfile = "m8def.dat"
$crystal = 1000000
$baud = 9600
Config Timer0 = Timer , Prescale = 64
Start Timer0
Enable Timer0
Enable Interrupts
On Timer0 Timer0_isr
Config Portb.0 = Output
Config Portb.0 = Output
Config Pinc.0 = Input
Config Portb.1 = Output
Config Portb.4 = Output
Config Pinc.2 = Input

Portc.0 = 1
Portc.2 = 1

Dim Intzaehler As Byte
Dim Zehntelsek As Byte
Dim Sekunde As Byte
Dim Minute As Byte

Led3 Alias Portb.4

Do

Loop


Timer0_isr:
Tcnt0 = 194


Intzaehler = Intzaehler + 1

If Intzaehler > 25 Then
Zehntelsek = Zehntelsek + 1
If Zehntelsek < 5 Then
Led3 = 1
Else
Led3 = 0
End If
If Zehntelsek > 9 Then
Zehntelsek = 0
End If
If Zehntelsek > 9 Then
Sekunde = Sekunde + 1
End If
If Sekunde > 59 Then
Sekunde = 0
End If
If Sekunde > 59 Then
Minute = Minute + 1
End If
If Minute > 4 Then
Minute = 0
End If
Intzaehler = 1


End If
Return
End

EDIT also ich habe mich jetzt mal hingesezt und CODE-Tags eingebaut :-) (PicNIck)
nun möchte ich dieses programm einfügen dass wie dass programm schon ist 5 minuten wenn ich auf ne taste drücke käuft und dann stoppt. während den 5 minuten soll man das programm anhalten können mit nem taster. wie intigriere ich dass in den timer?
und wo schreibe ich das programm dass ich habe rein? achja das blinken im sekundentakt soll erhalten bleiben. dies soll nur 5 minuten so laufen und dann auch gestoppt werden. vll kann mir ja jemand helfen.
achja bin absoluter anfänger und bin echt nur mit müh und not zu dem programm gekommen. ich dank euch schon mal.

xbgamer
02.11.2006, 12:13
weiß niemand was? stimmt dass programm überhaupt mit den ganzen zeichen und so?

xbgamer
02.11.2006, 22:20
so jetzt habe ich es denke ich mal soweit richtig des programm. nun möchte ich wenn ich pinc.2 per taster drücke dass der timer anfängt zu zählen und zwar wie in den isr 5 minuten lang im sekundentakt. wie realisiere ich dass?

$regfile = "m8def.dat"
$crystal = 1000000
$baud = 9600
Config Timer0 = Timer , Prescale = 64
Start Timer0
Enable Timer0
Enable Interrupts
On Timer0 Timer0_isr
Config Portb.0 = Output
Config Portb.0 = Output
Config Pinc.0 = Input
Config Portb.1 = Output
Config Portb.4 = Output
Config Pinc.2 = Input

Portc.0 = 1
Portc.2 = 1

Dim Intzaehler As Byte
Dim Zehntelsek As Byte
Dim Sekunde As Byte
Dim Minute As Byte

Led3 Alias Portb.4

Do

Loop


Timer0_isr:
Tcnt0 = 194

Intzaehler = Intzaehler + 1

If Intzaehler > 25 Then
Zehntelsek = Zehntelsek + 1
If Zehntelsek < 5 Then
Led3 = 1
Else
Led3 = 0
End If
If Zehntelsek > 9 Then
Zehntelsek = 0
End If
If Zehntelsek > 9 Then
Zehntelsek = 0
Sekunde = Sekunde + 1
End If
If Sekunde > 59 Then
Sekunde = 0
Minute = Minute + 1
End If
If Minute > 4 Then
Minute = 0
End If
Intzaehler = 1

End If
Return
End

xbgamer
03.11.2006, 08:28
bin ich hier alleinunterhalter oder was?

Vitis
03.11.2006, 12:13
Also ... Du brauchst eine Zeit, 5Minuten = 300 Sekunden.
Dann haste noch nen Taster, soweit klar.
Beim Tasterdruck soll etwas ausgelöst werden, nämlich
Deine Zeitmessung. Wenn die Zeitmessung auch nach dem
Tastendruck weiter laufen soll muss sich die Kiste merken, das die
Taste gedrückt war, soweit klaro denk ich. Du brauchst also ein
sog. Flag, ein Zeichen das gesetzt wird, Jawoll, die Taste war gedrückt.
Ich verwende dafür gerne ne Variable namens Flag um das
zu erhalten. Die andere Variante ist, Du merkst Dir den Start in dem zu messenden Wert selbst, weil dieser den Endpunkt einfach noch nicht erreicht hat ;)



$regfile = "m8def.dat"
$crystal = 1000000
$baud = 9600
Config Timer0 = Timer , Prescale = 64
Start Timer0
Enable Timer0
Enable Interrupts
On Timer0 Timer0_isr
Config Portb.0 = Output
Config Portb.0 = Output
Config Pinc.0 = Input
Config Portb.1 = Output
Config Portb.4 = Output
Config Pinc.2 = Input

Portc.0 = 1
Portc.2 = 1

Dim Intzaehler As Byte
Dim Zehntelsek As Byte
Dim Sekunde As Byte
Dim Minute As Byte
dim sec_counter as word

ausgang alias Portb.1
taste alias Pinc.2
Led3 Alias Portb.4

Do

Loop


Timer0_isr:
Tcnt0 = 194

incr Intzaehler

If Intzaehler > 25 Then
Zehntelsek = Zehntelsek + 1
If Zehntelsek < 5 Then
Led3 = 1
Else
Led3 = 0
End If
If Zehntelsek > 9 Then
Zehntelsek = 0
End If
If Zehntelsek > 9 Then
Zehntelsek = 0
Sekunde = Sekunde + 1
gosub tastenabfrage
End If
If Sekunde > 59 Then
Sekunde = 0
Minute = Minute + 1
End If
If Minute > 4 Then
Minute = 0
End If
Intzaehler = 1

End If
Return
End

tastenabfrage:
if taste = 1 then
sec_counter=0
endif

if sec_counter < 301 then ' 300 Sekunden nicht erreicht
incr sec_counter
Ausgang=1 ' Tu halt irgendwas
else
Ausgang=0 ' Schalts wieder ab
endif

return
end

Man kann im Übrigen mit nem Uhrenquarz und nem Mega auch ganz einfach ne Uhr generieren ... aber schön, das du's noch zum lernen zufuß machst.
Man kann auch den Timer langsamer laufen lassen über den Prescale, also den Vorteiler und mit dem 16-Bit Timer1 lassen sich auch direkt Sekundentakte erzeugen.

xbgamer
03.11.2006, 12:30
jop ich versuchs auf die lange art. eben damit ichs lerne. wenn ich jetzt des mit größer 300 nehme brauche ich die minute ja eigentlich nicht zu definieren. geht ja eh alles über die sekunden oder?

xbgamer
03.11.2006, 12:47
also so ganz klappt des jetzt net. wenn ich die taste drücke tut sich nix. es blinkt auch schon vorher munter weiter. sprich die ganze zeit. reagiert gar net auf den tastendruck

Vitis
03.11.2006, 14:12
sorry, ich versteh die Aufgabenstellung nicht ganz.
Das Programm soll 5 Minuten lang blinken und
ansonsten auch blinken oder wie ?

xbgamer
03.11.2006, 15:36
hallo, der timer soll so funktionieren.

per taster druck startet der timer

während er läuft blinkt er im sekundentakt

man soll ihn mit einem anderen oder dem selben taster während der 5 minuten die er ablaufen soll auch anhalten können und mit der selben wieder weiter laufen lassen können.

wenn er die 5 minuten erreicht hat soll er stoppen und erst wieder wie oben beschrieben per taster druck gestartet werden.

den sekundentakt habe ich hinbekommen bloß wie bekomme ich dass mit den tastern hin?

Vitis
04.11.2006, 09:11
Der Taster ist ja an nem Pin Deines µC angeschlossen.
Du musst dann einfach nur den Pin bzw. Port als Eingang
definieren, Per Bascom Befehl Config PortX.Y = Input
und dann in Deinem Programm den Status des Pinregisters
abfragen ( If PinX.Y = 1 then ). Aber Vorsicht ist geboten ... Tasten prellen,
du musst also entweder hardwaremäßig dafür sorgen, das
die Taste das nichtmehr macht oder in der Software
entprellen. Bascom Hilfe siehe Debounce.
Im Fall von Deinem Programm ists so, das das PRellen
durch den 1 Sekunden Abfragetakt vernachlässigt werden kann.




$regfile = "m8def.dat"
$crystal = 1000000
$baud = 9600
Config Timer0 = Timer , Prescale = 64
Start Timer0
Enable Timer0
Enable Interrupts
On Timer0 Timer0_isr
Config Portb.0 = Output
Config Portb.0 = Output
Config Pinc.0 = Input
Config Portb.1 = Output
Config Portb.4 = Output
Config Pinc.2 = Input

Portc.0 = 1
Portc.2 = 1

Dim Intzaehler As Byte
Dim Zehntelsek As Byte
Dim Sekunde As Byte
Dim Minute As Byte
dim sec_counter as word

ausgang alias Portb.1
taste alias Pinc.2
Led3 Alias Portb.4

Do

Loop


Timer0_isr:
Tcnt0 = 194

incr Intzaehler

If Intzaehler > 25 Then
Zehntelsek = Zehntelsek + 1
If Zehntelsek > 9 Then
Zehntelsek = 0
End If
If Zehntelsek > 9 Then
Zehntelsek = 0
Sekunde = Sekunde + 1
gosub tastenabfrage
End If
If Sekunde > 59 Then
Sekunde = 0
Minute = Minute + 1
End If
If Minute > 4 Then
Minute = 0
End If
Intzaehler = 1

End If
Return
End

tastenabfrage:
if taste = 1 then
if sec_counter < 301 then
sec_counter=302
else
sec_counter=0
endif
endif

if sec_counter < 301 then ' 300 Sekunden nicht erreicht
incr sec_counter
toggle led3 ' Tu halt irgendwas
else
led3=0 ' Schalts wieder ab
endif

return
end

xbgamer
04.11.2006, 16:58
hallo, kannst du mir da auch noch erklären was du da genau machst? ich bin noch anfänger und habe mein avr buch leider erst am montag hier.