PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : einstellbarer zähler mit bascom???



xbgamer
01.12.2006, 15:58
hallo,
ich hab hier jetzt wieder mal sehr viel gesucht aber nix ähnliches für mein vorhaben gefunden.
also ich brauche für mein projekt einen zähler. dieser soll mit 2 7 segmentanzeigen funktionieren.

sprich er kann 9.59 minuten mehr nicht. mehr brauche ich auch nicht.
nun soll man des so wie bei ner mikrowelle halt einstellen können wie viele minuten er rückwärts laufen soll.
sprich am anfang steht er auf 0 und dann stellt man seine zeit an wie lange er laufen soll.
timer0 ist denk ich mir mal ganz gut geeignet damit ich da auch was lerne. ich habe auch das buch von rowalt. bloß blick ich da net so ganz durch. deswegen frage ich jetzt hier mal was ich da genau machen muss.
ich danke euch schon mal.

coCo
01.12.2006, 16:23
Hi,
ich denke mal so würde es gehen:
Du stellst den Timer0 so ein, dass er z.B. 100 mal pro Sekunde die ISR aufruft. In der ISR hast du eine Variable i die du jedes mal inkrementierst. Außerdem hast du in einer anderen Variable den gewünschten Wert eingestellt ("stellt man seine zeit an wie lange er laufen soll") in Sekunden. Zum Beispiel 300. Jetzt brauchst du noch eine Variable x, die du inkrementierst, wenn die Variable i 100 erreicht und setzt dabei i wieder auf 0.

In x ist dann gespeichert wieviele Sekunden schon vergangen sind. Dann kannst du einfach x mit dem gewünschten Wert vergleichen und wenn beide gleich sind eine Funktion aufrufen.

MfG

xbgamer
01.12.2006, 16:45
könntest du mir da mal en beispiel geben is en bischen schwierig zu verstehen.

coCo
01.12.2006, 16:59
Hi,
ungefähr so würde ich es machen:


Config Timer0 = Timer, Prescale = 1024
On Timer0 Timer0_ISR
Const Timervorgabe = 100

Enable Timer0
Enable Interrupts

Dim I as Integer
Dim sec_vorgabe as Integer


do
loop


Timer0_ISR:
Timer0 = Timervorgabe
If I = 100 Then
I = 0
Decr sec_vorgabe
Endif

Incr I

If sec_vorgabe = 0 Then
'Hier was nach der abgelaufenen Zeit passieren soll
Endif

Return


In sec_vorgabe speicherst du die vorgegeben Zeit in Sekunden. Alle 100 ISR Aufrufe (also jede Sekunde einmal) wird sec_vorgabe um eins verkleinert, weil ja eine Sekunde vergangen ist.
Danach wird überprüft ob sec_vorgabe null erreicht hat, weil dann die Zeit um wäre. Natürlich könntest du auch außerhalb der ISR überprüfen ob sec_vorgabe 0 ist.

MfG

Edit: Wie du den Timer genau einstellst solltest du mit dem Programm rnAvr ausrechnen. Die Einstellungen im Beispiel sind für einen 16 Mhz Quarz

xbgamer
01.12.2006, 17:21
also jetzt hab ich mal folgendes




$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
Config Timer0 = Timer , Prescale = 64
Config Portb.0 = Output


Led3 Alias Portb.0
Dim Intzaehler As Byte
Dim Zehntelsek As Byte
Dim Sekunde As Byte

Start Timer0
Enable Timer0
Enable Interrupts
On Timer0 Timer0_isr


Do
Loop
End

Timer0_isr:
Tcnt0 = 26

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
Intzaehler = 1
End If
Return
End


also des funzt jetzt soweit mein sekundentakt hab ich nun wie baue ich des jetzt ein dass er bis zb 5 minuten zählt. da muss ich ja if zehntelsek>9 then sekunde +1 sein oder irre ich mich da?

xbgamer
02.12.2006, 09:38
kann mir da keiner en tip geben???

coCo
02.12.2006, 12:11
Du zählst eine Variable I im Sekundentakt hoch, wenn diese Variable 300 erreicht sind 5 Minuten vorbei. Bei jedem Befehl, der vor Ablauf der Zeit passieren soll (z.B. LEDs blinken lassen), überprüfst du ob I kleiner als 300 ist.

MfG

xbgamer
02.12.2006, 14:22
also gut ich versuchs mal meld mich wenn ich mal was gemacht habe.

xbgamer
03.12.2006, 09:34
jetzt hab ich mal ne saublöde frage wie schließe ich das display hier überhaupt an? ich meine brauche ich da nicht ein bcd decoder? oder wie mache ich dass dann kann ichs mir besser vorstellen.

hab jetzt hier mal was aber ich schätze da hab ich wieder ewig viele sachen doppelt reingebaut. naja könntest du vll trotzdem mal drüberfliegen obs so stimmt oder jemand anders wär echt super.
also was ich eigentlich vorhabe ist eine einstellbare uhr für einen belichtungsapparat. vll kann man sich des auch dann besser vorstellen.


$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
Config Timer0 = Timer , Prescale = 64
Config Portb.0 = Output
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input

Portc = &B00000111

Led3 Alias Portb.0
Dim Intzaehler As Byte
Dim Zehntelsek As Byte
Dim Sekunde As Byte
Dim Minute As Integer
Dim sec_vorgabe as Integer

Start Timer0
Enable Timer0
Enable Interrupts
On Timer0 Timer0_isr


Do
Loop
End

Timer0_isr:
Tcnt0 = 26

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
Minute = Minute + 1
End If
If Minute = 5 Then
Intzaehler = 0
Zehntelsek = 0
Sekunde = 0
Minute = 0
Decr sec_vorgabe
End If
Intzaehler = 1

Incr Minute
If Sec_vorgabe = 0 Then
Intzaehler = 0
Zehntelsek = 0
Sekunde = 0
Minute = 0
End If


End If
Return
End

coCo
03.12.2006, 15:01
Hi,
es stimmt du hast einiges doppelt drin ;)


Ich hab hier mal den Code zusammengefasst (nur ISR):

Timer0_isr:
Tcnt0 = 26

Incr Intzaehler

If Intzaehler = 25 Then
Intzaehler = 0
Incr Zehntelsek
End If

If Zehntelsek = 10 Then
If Minute < 5 Then
Toggle Led3
End If
Incr Sekunde
Zehntelsek = 0
End If

If Sekunde = 60 Then
Incr Minute
End If


Return

So dürfte es funktionieren, wobei es natürlich auch nicht ganz das Beste ist, du könntest noch Ressourcen sparen, in dem du die Minute Variable weglässt und einfach stattdessen mit Sekunden "rechnest". Ungefähr so:



Timer0_isr:
Tcnt0 = 26

Incr Intzaehler

If Intzaehler = 25 Then
Intzaehler = 0
Incr Zehntelsek
End If

If Zehntelsek = 10 Then
If Sekunde < 300 Then
Toggle Led3
End If
Incr Sekunde
Zehntelsek = 0
End If



Return

Hoffe es klappt so.

MfG

albundy
03.12.2006, 15:30
jetzt hab ich mal ne saublöde frage wie schließe ich das display hier überhaupt an?

http://www.sprut.de/electronic/pic/programm/led.htm
hier findest du eine einfache Ansteuerung ohne BCD Decoder.
In deiner Timerinterrupt Routine lässt du bei jedem Interrupt eine andere Ziffer anzeigen.

- Transistor 1 ansteuern und Ziffer 1 über den 7 Segmentport ausgeben.
beim nächsten Interrupt ...
- Transistor 2 ansteuern und Ziffer 2 über den 7 Segmentport ausgeben.
u.s.w.

xbgamer
03.12.2006, 20:44
jo des mit den sekunden wollte ich schon machen da bringt mir bascom aber immer einen fehler value doesnt fit into byte.
da hab ichs deswegen mit minuten gemacht. danke euch beiden schon mal.

und wenn ich des ganze jetzt per tastendruck starten will muss ich dass ja in dass hauptprogramm scheiben also wenn ich dass aus dem buch jetzt richtig verstanden habe oder?

und geht dass jetzt einfach so paralel dass ich jetzt zb schreibe
if pind.0 =1 then
sekunde = sekunde +1

oder würde man dass so nicht schreiben um die sekunde zu erhöhen?

coCo
03.12.2006, 20:52
Du hast wahrscheinlich Sekunde als Byte deklariert. Ein Byte kann nur hat nur 8 Bit und kann deshalb nur Werte von 0-255 aufnehmen. Sekunde wird bis 300 hochgezählt, also wäre in der Variablen kein Platz mehr, deshalb die Fehlermeldung. Du kannst statt dessen einfach Word oder Integer verwenden. Word besteht glaub ich aus 16 Bit -> also von 0 bis 65535.

MfG

xbgamer
04.12.2006, 18:35
ne habs schon als integer deklariert is komisch.
aber habs jetzt eben so mit minute gelassen.

und wie bekomme ich des rein dass der timer mit ner taste an geht?
und wie dass ich die sekunden einstellen kann?

muss ich ja alles ins hauptprogramm einfügen oder?

coCo
04.12.2006, 19:49
Hi,
mit Taste zum starten und einstellbarer Zeit sieht das so aus:


Timer0_isr:
Tcnt0 = 26

If taste_gedrueckt = 1 Then

Incr Intzaehler

If Intzaehler = 25 Then
Intzaehler = 0
Incr Zehntelsek
End If

If Zehntelsek = 10 Then
If Minute < Vorgabe Then
Toggle Led3
End If
Incr Sekunde
Zehntelsek = 0
End If

If Sekunde = 60 Then
Incr Minute
End If

End If

Return


Die Variable taste_gedrueckt wird am Anfang des Programmes auf 0 gesetzt. Wird nun eine Taste betätigt wird taste_gedrueckt der Wert 1 zugewiesen und die Befehle in der ISR werden ausgeführt.

Neu ist noch die Variable Vorgabe. In diese schreibst du die Zeit, wie lang der Countdown dauern soll, in Minuten rein. Es wäre praktischer wenn du, wie schon oben erwähnt, mit der Variable Sekunde rechnen würdest, da man dann statt Minuten, mit Sekunden arbeiten könnte.

MfG

xbgamer
04.12.2006, 20:51
naja ich habs ja probiert in sekunde zu schreiben is ja net so dass ich mich dagegen streube. aber bascom sieht es trotz integer als fehler

coCo
04.12.2006, 20:59
Hmm wie lautet denn die Fehlermeldung? Ich krieg da keine Fehlermeldung, vielleicht hast du irgendwo nen Tippfehler?

MfG

xbgamer
05.12.2006, 19:08
jetzt gehts weiß echt net was es war. warscheinlich hab ich mich doch vertippt. wollte mich nur mal so bedanken dass du mir so geholfen hast. du hättest mir des aber echt net schreiben brauchen hättest mich ja auch hinführen können wäre noch en bischen übung für mich gewesen. aber trotzdem mal danke. ich werde mich im laufe der woche mal intensiver damit befassen und schauen ob es dann auch so meinen wünschen entspricht. falls ich noch was habe werde ich mich melden.


was ich dich oder jemanden noch fragen wollte das mit dem einschalten klappt net so ganz. wenn ich jetzt meinen taster drücke bleibt es nur während ich die taste drücke angeschaltet wenn ich loslasse geht der timer wieder ab wie bekomme ich dass aber hin dass ich den taster einmal drücken muss und dass der timer dann nach ablaufen der zeit selbst aufhört.

achso und könntest du mir dass mit dem einstellen noch einmal erklären des hab ich also komplett net ganz verstanden.

coCo
05.12.2006, 20:08
Hi,
zum Starten des Timers:
Sobald die Taste gedrückt wird, musst du die Variable "taste_gedrueckt" auf 1 setzen (Vorher muss diese Variable 0 sein).


If Sekunde < 300 Then
Toggle Led3
End If

Mit diesem Befehl läuft dein Timer 300 Sekunden lang. Wenn du jetzt eine variable Zeit einstellen möchtest, ersetzt du einfach die 300 durch eine Variable in der die Zeit gespeichert ist. Also z.B.:


Dim Einstellung as Integer

Einstellung = 500

...

If Sekunde < Einstellung Then
Toggle Led3
End If


In diesem Fall wird der Timer 500 Sekunden lang ausgeführt. Du brauchst also die gewünschte Zeit einfach in die Variable "Einstellung" schreiben.

MfG

xbgamer
05.12.2006, 21:09
achso. ja dass habe ich auch gesehen und auch ausprobiert. weißt du ich möchte es aber so machen:

es wird ja ein belichtungsapparat.
und da möchte ich mit ner taste die sekunden einstellen können. zb dass das maximale was ich einstellen kann zb. 500 sekunden is aber dass ich da auch was weiß ich 349 sekunden über ne taste einstellen kann die die sekunden immer um 1 erhöhen.
weißt du zb so wie bei ner microwelle oder so. da muss ich ja auch irgendwie was reinbauen wie if pinc.1 = 1 then sekunde = sekunde+1 oder sowas.
dass ich halt die zeit erst einstellen kann diese auf den 7 segment anzeigen sehe und dann den startknopf drücken kann.

coCo
05.12.2006, 21:21
Ja das kannst du so machen. Du hast 2 Tasten, mit der einen erhöhst du die Zeit um 10 Sekunden mit der anderen verringerst du sie um 10 Sekunden. Wenn nun die Taste zum Erhöhen gedrückt wird, kannst du die Variable Einstellung um 10 hochzählen (Einstellung = Einstellung + 10). Bei der anderen Taste das gleiche nur mit Minus. Wenn du die gewünschte Zeit mit Hilfe der beiden Tasten eingestellt hast (z.B. 400 Sekunden), drückst du die Start Taste und der Timer läuft 400 Sekunden.

MfG

xbgamer
05.12.2006, 21:29
also im prinzip so wie ich es geschrieben habe mit if then oder?
und wie mache ich dass nun mit dem anschalten dass wenn ich den taster drücke dass es auch an bleibt bis es fertig gezählt hat. habe jetzt mal 0 und 1 ausprobiert aber is beides dass selbe problem.
bei 1 ist der timer die ganze zeit an und geht nur während ich den taster drücke aus und wenn ich loslasse wieder an.
und bei 0 bleibt er aus und geht nur wenn ich auf der taste bleibe an geht aber wieder aus wenn ich se loslasse.

coCo
05.12.2006, 21:31
Ja genauso wie du es beschrieben hast. Aber achte darauf, dass du nicht die Variable Sekunde verändern darfst, sondern die Variable Einstellung.

MfG

Lebi
06.12.2006, 00:38
Hi, xbgamer!
Ich habe mal ein Zeitrelai mit dem AT90S2313 gebaut. Es hat 2 7-Segment Anzeigen und kann bis 99 sekunden eingestellt werden.
Im "Ruhezustand" sind die Anzeigen aus. Wenn die Taste SET betätigt wird, gehen die Anzeigen an und man kann bei betätigter SET-Taste mit "+" und "-" Tasten die Zeit einstellen. Sobald die SET-Taste losgelassen wird, wird die eingestellte Zeit In den EEPROM geschrieben. Beim Betätigen der START-Taste Geht die Anzeige an und der Countdown läuft runter bis null, solange die Zeit läuft ist ein Relai angezogen, danach geht die Anzeige wider aus.

Den Schaltplan und Die *.BAS Datei Lege ich bei.
Man Lernt am besten indem man den fertigen Code analysiert.



'Zeitrelai
'Lebi
'26.09.06

$regfile = "2313def.dat"
$crystal = 3686400

Hauptprogramm: 'Sprungmarke fuer Huptprogramm

'Deklaration der SUBs fuer Tasten
Declare Sub Pluspressed
Declare Sub Minuspressed

'port config
Ddrb = &B11111111
Ddrd = &B1000011

'pool up
Portd = &B0111100

'Variablen Deklaration
Dim Zeit As Byte , 1en As Byte , 10er As Byte , Ausgabebyte As Byte




'Konstanten Einstellen
Const Del = 7 'Multiplex zeit fuer 7-SegmentAnzeige
Const Lt = 57600 'Lade timer auf 57600

'Tasten Zuweisung
Ustan Alias Pind.4 'Ustan=SET
Minus Alias Pind.5
Plus Alias Pind.3
Pusk Alias Pind.2 'Pusk=START


'Timer einstellen
On Timer1 A1 'Beim Teimerueberlauf(Interrupt) gehe zum merker A1
Config Timer1 = Timer , Prescale = 64 'Frequenz wird gurch 64 geteilt
Load Timer1 , Lt
'3686400/8=460800,460800/256=1800 interrupst pro Sekunde
Enable Interrupts


'Hauptschleife
Do

'Tasten werden permanent abgefragt
'wenn Taste "START" betaetigt, dann:
'Relai an, Lese die Zeitwariable aus dem EEPROM, springe zu Unterprogramm "Anzeige"
If Pusk = 0 Then
Set Portd.1
Readeeprom Zeit , 10
Gosub Anzeige
End If

'wenn Taste "SET" Betaetigt, dann gehe zu Unterprogramm "Ustanovka/Einstellen"
If Ustan = 0 Then Goto Ustanovka

Loop




'Unterprogramm "Anzeige"
Anzeige:
'Timer 1 aktivieren
Enable Timer1

'Sekunden 10er
Ausgabebyte = Zeit Mod 10
Portd.6 = 0
If Ausgabebyte = 0 Then Portb = &B00000011
If Ausgabebyte = 1 Then Portb = &B01101111
If Ausgabebyte = 2 Then Portb = &B10001001
If Ausgabebyte = 3 Then Portb = &B01001001
If Ausgabebyte = 4 Then Portb = &B01100101
If Ausgabebyte = 5 Then Portb = &B01010001
If Ausgabebyte = 6 Then Portb = &B00010001
If Ausgabebyte = 7 Then Portb = &B01101011
If Ausgabebyte = 8 Then Portb = &B00000001
If Ausgabebyte = 9 Then Portb = &B01000001
Portb.0 = 1
Waitms Del

'Sekunden 1er
Ausgabebyte = Zeit / 10
Portd.6 = 1
If Ausgabebyte = 0 Then Portb = &B00000011
If Ausgabebyte = 1 Then Portb = &B01101111
If Ausgabebyte = 2 Then Portb = &B10001001
If Ausgabebyte = 3 Then Portb = &B01001001
If Ausgabebyte = 4 Then Portb = &B01100101
If Ausgabebyte = 5 Then Portb = &B01010001
If Ausgabebyte = 6 Then Portb = &B00010001
If Ausgabebyte = 7 Then Portb = &B01101011
If Ausgabebyte = 8 Then Portb = &B00000001
If Ausgabebyte = 9 Then Portb = &B01000001
Portb.0 = 0
Waitms Del
If Zeit = 0 Then Goto A2
Goto Anzeige


A2:
Disable Timer1
Portd.6 = 1
Portb.0 = 1
Wait 1
Portd.6 = 0
Portb.0 = 0
Reset Portd.1
Goto Hauptprogramm


A1:
Load Timer1 , Lt
Decr Zeit
Return

'Unterprogramm "Einstellen"
Ustanovka:
Readeeprom Zeit , 10
Debounce Plus , 0 , Pluspressed , Sub And Ustan = 0
Debounce Minus , 0 , Minuspressed , Sub And Ustan = 0

'Anzeige beim Einstellen
Ausgabebyte = Zeit Mod 10
Portd.6 = 0
If Ausgabebyte = 0 Then Portb = &B00000011
If Ausgabebyte = 1 Then Portb = &B01101111
If Ausgabebyte = 2 Then Portb = &B10001001
If Ausgabebyte = 3 Then Portb = &B01001001
If Ausgabebyte = 4 Then Portb = &B01100101
If Ausgabebyte = 5 Then Portb = &B01010001
If Ausgabebyte = 6 Then Portb = &B00010001
If Ausgabebyte = 7 Then Portb = &B01101011
If Ausgabebyte = 8 Then Portb = &B00000001
If Ausgabebyte = 9 Then Portb = &B01000001
Portb.0 = 1
Waitms Del
Ausgabebyte = Zeit / 10
Portd.6 = 1
If Ausgabebyte = 0 Then Portb = &B00000011
If Ausgabebyte = 1 Then Portb = &B01101111
If Ausgabebyte = 2 Then Portb = &B10001001
If Ausgabebyte = 3 Then Portb = &B01001001
If Ausgabebyte = 4 Then Portb = &B01100101
If Ausgabebyte = 5 Then Portb = &B01010001
If Ausgabebyte = 6 Then Portb = &B00010001
If Ausgabebyte = 7 Then Portb = &B01101011
If Ausgabebyte = 8 Then Portb = &B00000001
If Ausgabebyte = 9 Then Portb = &B01000001
Portb.0 = 0
Waitms Del
If Ustan = 0 Then Goto Ustanovka
Goto Hauptprogramm


Sub Pluspressed
Incr Zeit
If Zeit > 98 Then Zeit = 0
Writeeeprom Zeit , 10
End Sub

Sub Minuspressed
Decr Zeit
If Zeit > 98 Then Zeit = 0
Writeeeprom Zeit , 10
End Sub

xbgamer
06.12.2006, 19:01
wie meinst du dass mit einstellung = einstellung +10

etwa if pinc.1 = 1 then einstellung = sekunde +10

coCo
06.12.2006, 20:14
Nicht ganz. In "einstellung" ist gespeichert, wie lange der Timer laufen soll (in Sekunden). Du darfst mit deiner Tastenabfrage die Variable "sekunde" nicht verändern, da diese nur vom Timer (ISR) geändert wird. Also du solltest es so schreiben:
if pinc.1 = 1 then einstellung = einstellung +10

Dadurch wird die Laufzeit vom Timer um 10 Sekunden erhöht. Wenn in "einstellung" vorher 200 gespeichert war, ist nach einem Tastendruck 210 gespeichert.

MfG

xbgamer
06.12.2006, 20:41
achso jetzt verstehe ich einstellung wird vom timer so erkannt.

xbgamer
10.12.2006, 11:30
so hab jetzt mal weiter geschaut bin aber wieder gnadenlos gescheitert.
des mit dem taster geht irgendwie immernoch net ich muss also immernoch die ganze zeut den taster drücken damit der timer läuft.

aber jetzt mal folgendes.
ich möchte es jetzt so haben. also led1 blinkt im sekundentakt munter los. wenn sie jetzt 10 mal geblinkt hat soll led 2 100ms aufblinken. und wenn 60 sekunden rumm sind soll led 3 100ms aufblinken.

aber irgendwie bekomm ich des net ganz hin wenn ich des einfach so in die isr rein schreibe habe des jetzt mal so versucht:
Timer0_isr:
Tcnt0 = 26

If Pinc.0 = 1 Then

Incr Intzaehler

If Intzaehler = 25 Then
Intzaehler = 0
Incr Zehntelsek
End If

If Zehntelsek = 10 Then
If Minute < 5 Then
Toggle Led1
End If
Incr Sekunde
Zehntelsek = 0
End If

If Sekunde = 60 Then
Led2 = 1
Wait 1
Led2 = 0
Incr Minute
End If

End If

Return

vielleicht kann mir da jemand mal helfen und auch des mit dem taster vll mal erklären wie ich dass den hinbekommen könnte.

coCo
10.12.2006, 12:02
Hi,
also das mit der Taste is doch einfach. Du darfst halt nicht den Eingang an der die Taste hängt in der ISR untersuchen, sondern eine Variable. Außerhalb der ISR setzt du diese Variable auf eins, wenn die Taste gedrückt wird:


Dim Taste as Bit
Taste = 0

...

If Pinc.0 = 1 Then 'Das muss in eine Schleife
Taste = 1
Endif

....

Timer0_isr:
Tcnt0 = 26

If Taste = 1 Then

...




Du verwendest in deiner ISR einen Wait Befehl. Dadurch kann die ISR nicht abgearbeitet werden, da nach ein paar Millisekunden ein neuer Interrupt ausgelöst wird. In einer ISR sollte so wenig wie möglich passieren (z.B. Variablen ändern). Und mit Hilfe dieser geänderten Variablen kannst du dann außerhalb der ISR die gewünschten Aktionen ausführen.

Also mit 100ms aufblinken meinst du wohl, dass die LED 100ms angeht und danach wieder aus. Du musst auch hier mit Variablen arbeiten. Du setzt eine Variable auf 1 (anstatt Led2 = 1 Wait 1 Led2 = 0 ). Nun weiß das Programm, dass es beim nächsten Aufruf der ISR Led2 einschalten muss. Du fügst also eine If Abfrage dazu und schaltest in dieser die LED ein, zusätzlich musst du noch eine Variable hochzählen um zu wissen wieviel Zeit vergangen ist. Wenn die Zeit um ist wird die LED ausgeschaltet und alle Variablen wieder auf 0 gesetzt.

MfG

xbgamer
10.12.2006, 13:51
achso ok. des mit den variablen habe ich jetzt verstanden aber des mit dem schalter klappt irgendwie net ganz.
so hab ichs jetzt aber ich muss immernoch drauf bleiben.

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

Portc = &B00000111

Led1 Alias Portb.0
Led2 Alias Portb.1
Led3 Alias Portb.2
Dim Intzaehler As Integer
Dim Zehntelsek As Integer
Dim Sekunde As Integer
Dim Minute As Integer
Dim Sec_vorgabe As Integer
Dim Taste as Bit
Taste = 0

Start Timer0
Enable Timer0
Enable Interrupts
On Timer0 Timer0_isr


Do
If Pinc.0 = 1 Then
Taste = 1
End If
Loop
End

Timer0_isr:
Tcnt0 = 26

If Pinc.0 = 1 Then

Incr Intzaehler

If Intzaehler = 25 Then
Intzaehler = 0
Incr Zehntelsek
End If

If Zehntelsek = 10 Then
If Minute < 5 Then
Toggle Led1
End If
Incr Sekunde
Zehntelsek = 0
End If

If Sekunde = 60 Then
Incr Minute
End If

End If

Return

coCo
10.12.2006, 15:46
Hi,
versuchs ma mit If Pinc.0 = 0 Then. Durch den Pullup liegt der Eingang bei gedrückter Taste auf GND.

MfG

Ach und noch was:
In der ISR musst du If Taste = 1 Then schreiben und nicht If Pinc.0 = 1 Then !

xbgamer
10.12.2006, 16:38
hups ok werds probieren.

xbgamer
11.12.2006, 19:18
so habs jetzt mal ausprobiert so selber zu schreiben mit der einstellung geht dass so?

$regfile = "m8def.dat"
$crystal = 36864000
$baud = 9600
Config Timer0 = Timer , Prescale = 64
Config Portb.0 = Output
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input

Portc = &B00000111

Led1 Alias Portb.0
Led2 Alias Portb.1
Led3 Alias Portb.2
Dim Intzaehler As Integer
Dim Zehntelsek As Integer
Dim Sekunde As Integer
Dim Minute As Integer
Dim Sec_vorgabe As Integer
Dim Einstellung As Integer
Dim Taste As Bit
Dim Taste1 As Bit
Dim Taste2 As Bit
Dim Taste3 As Bit
Taste = 0
Taste1 = 0
Taste2 = 0
Taste3 = 0

Start Timer0
Enable Timer0
Enable Interrupts
On Timer0 Timer0_isr


Do
If Pinc.0 = 0 Then
Taste = 1
End If
Loop

If Pinc.1 = 0 Then
Taste1 = 1
End If

If Pinc.2 = 0 Then
Taste2 = 1
End If

If Pinc.3 = 0 Then
Taste3 = 1
End If

End


Timer0_isr:
Tcnt0 = 141

If Taste = 1 Then

Incr Intzaehler

If Intzaehler = 25 Then
Intzaehler = 0
Incr Zehntelsek
End If

If Zehntelsek = 10 Then
If Sekunde < 300 Then
Toggle Led1
End If
Incr Sekunde
Zehntelsek = 0
End If

If Taste1 = 1 Then
Einstellung = Einstellung + 10
End If

If Taste2 = 1 Then
Einstellung = Einstellung + 1
End If
End If

Return

wenn des so hinhaut brauch ich eben nur noch dass mit dass wenn 10 sekunden um sind dass led2 einen takt bekommt und wenn 60 sekunden um sind dass led 3 einen takt abbekommt. sprich jede 10 sekunden soll led2 kurz blinken und alle 60 sekunden led 3.

xbgamer
13.12.2006, 17:33
weiß keiner ob des so stimmt????