also hier komme ich mir echt als alleinunterhalter vor.
ich verstehe den schei... timer net und keiner hilft mir mal.
also kann ich i individuell verändern. gibt es da auch irgendwie ne formel zum zeit berechnen? also ich meine ich kann da jetzt jawohl nicht wirklich einfach 300 sekunden eintragen oder?
und wie kriege ich dass hin dass wenn ich jetzt nen taster betätige dass er änfängt zu zählen und wenn ich ihn nochmal drücke dass er weiterläuft?
und ne reset taste?
also hier komme ich mir echt als alleinunterhalter vor.
ich verstehe den schei... timer net und keiner hilft mir mal.
Du hättest vielleicht mal die Suche benutzen können und wärst dann auf das Programm rnAvr gestoßen. Ich hab mal mit diesem Programm den Timer0 und Prescale etc. berechnet:
Pro Sekunde wird 100 mal die ISR aufgerufen, das entspricht i += 100 pro sekunde -> Nach 3 Minuten: i = 18.000
Das Programm ist für einen Atmega mit 16Mhz Quarz gedacht, wenn du eine andere Quarzfrequenz hast, musst du es mit Hilfe von rnAvr anpassen.Code:Config Timer0 = Timer, Prescale = 1024 On Timer0 Timer_irq 'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen Const Timervorgabe = 100 'Hier werden die Timer aktiviert Enable Timer0 Enable Interrupts Do Loop Timer_irq: Timer0 = Timervorgabe Return
Als Reset Taste kannst du ja die Reset Taste vom AVR benutzen, aber was meinst du mit:
Zum starten kannst du einfach eine Taste abfragen und wenn die Taste gedrückt wurde könntest du eine Variable taster_gedrueckt auf eins setzen. In der ISR schreibst du dann nicht einfach i++; sondern machst noch eine Abfrage ob taster_gedrueckt 1 ist, wenn ja dann wird i inkrementiert, wenn nein dann passiert nix. Wenn die Taste nochmal gedrückt wird könntest du die Variable taster_gedrueckt wieder auf 0 setzen.und wie kriege ich dass hin dass wenn ich jetzt nen taster betätige dass er änfängt zu zählen und wenn ich ihn nochmal drücke dass er weiterläuft?
Hoffe das war das, was du wissen wolltest.
na jetzt kommt mal rollen in die sache.
also ich hab mich da vertippt.
ich möchte das programm per tastendruck 5 minuten laufen lassen. nun soll das programm aber anhalten wenn ich die taste erneut drücke und auch weiterlaufen wenn ich se wieder drücke.
reseten will ich es irgendwie mit ner anderen taste.
Für die Reset Taste muss du einfach den Reset-Pin deines AVRs (bei mir is es Pin9, mega32) über eine Taste mit Masse verbinden.
Hab hier mal das Programm geschrieben, ist natürlich nicht ausführbar weil du die Eingangports definieren musst und noch die Syntax anpassen, weil ich die nicht so gut kenne (programmiere in C).
Das Programm wird über eine Taste gestartet und kann mit der selben Taste unterbrochen werden und der timer wieder "eingeschaltet" werden (stimmt net ganz, weil der timer ja weiterläuft, nur wird i net inkrementiert). Nach 5 Minuten stoppt das Programm die Inkrementation von i und muss mit der Taste neu gestartet werden.Code:dim i as integer dim taste_gedrueckt as bool taste_gedrueckt = 0 Config Timer0 = Timer, Prescale = 1024 On Timer0 Timer_irq 'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen Const Timervorgabe = 100 'Hier werden die Timer aktiviert Enable Timer0 Enable Interrupts Do if [taste] == 1 then if taste_gedrueckt = 0 then taste_gedrueckt = 1 endif if taste_gedrueckt = 1 then taste_gedrueckt = 0 endif endif Waitms 1 Loop Timer_irq: Timer0 = Timervorgabe if i == 30000 then i = 0 taste_gedrückt = 0 'Hier können auch Befehle stehen, die ausgeführt werden wenn die 5 Minuten erreicht sind. else if taste_gedrückt == 1 then i++ endif Return
MfG
noch ne grundlegende frage was heißt prescale und warum hast du 1024 hier angegeben.
Prescale gibt den Wert an, durch den die Frequenz des Quarzes geteilt wird. Damit zählt der Timer dann von 0-255 und löst beim Überlauf einen Interrupt aus und der Code in der ISR wird ausgeführt. Ohne den Prescaler würde der Timer bei einem 16Mhz Quarz, 16.000.000/256 Interrupts pro Sekunde auslösen.
edit: achja die 1024 hab ich mit dem Programm rnAvr berechnet
cool also danke schon mal ich meld mich falls ich es nicht hinbekomme.
ich verstehe net ganz was du da bei do machst kannst mir dass mal erklären?
In der Do Schleife wird eine Taste abgefragt. ([taste] musst du mit Portb.1 oder ähnlichem ersetzen)
Wenn die Variable taste_gedrueckt 1 ist, erhält sie nun den Wert 0, wenn sie 0 war, erhält sie den Wert 1.
Diese Variable wird verwendet um die Inkrementierung von i und somit deinen "Counter" anzuhalten bzw. zu starten.
Am Anfang vom Programm wird taste_gedrueckt der Wert 0 zugewiesen. Sprich die Variable i bleibt unverändert, weil sie nur inkrementiert wird wenn taste_gedrueckt 1 ist. Drückt man nun zum Starten der 5 Minuten auf die Taste, wird taste_gedrueckt auf 1 gesetzt und somit i inkrementiert. Dies geschieht solange bis taste_gedrueckt wieder 0 ist. Das kann entweder der Fall sein, wenn die 5 Minuten erreicht sind oder wenn du nochmals auf die Taste gedrueckt, dadurch wird taste_gedrueckt der Wert 0 zugewiesen.
Hoffe du verstehst es ^^
MfG
Lesezeichen