Hey... Ich stehe grade vor folgendem Problem... Brauche folgende Funktion: Ein Taster gibt ein Input Signal. Ist dieser Taster betätigt zählt ein Timer bis zum Wert X... Wird der Taster vor erreichen dieses Wertes wieder losgelassen, so zählt der Timer dann wieder runter zu null. Wird der Wert erreicht, so bleibt der Timer da stehen, bis der Taster losgelassen wird, und zählt dann wieder runter bis 0. Zusätzlich soll folgendes passieren: In der Zeit des Hochzählens (allerdings nicht mehr wenn der Zähler beim Wert X angekommen ist) soll ein Ausgang 1 high sein, in der Zeit des Runterzählens, aber eben auch nur bis er bei 0 angekommen ist, ein Ausgang 2! Hat jemand ne Idee? Hab noch nicht mal n Plan, ob ich bei nem ATmega8 nen Zähler rückwärtszählen lassen kann... Danke schon mal! Greets
Wie schnell muss gezählt werden ? Aus dem Stand heraus wird das mit einem Timer eine knifflige Sache mit Interrupts und ständigem Timer Umkonfigurieren. Wenn das Timing da nicht allzu kritisch ist, könnte man den Timer als Zeitgeber benutzen und diesen Rauf/Runter Zähler rein in Software nachbilden.
ne muss nicht allzu genau sein... vielleicht sollte ich kurz erklären was das ziel des projektes ist, vielleicht gibt es ja auch noch ne elegantere lösung als die die ich mir überlegt habe... es geht darum, im auto den rechten seiten spiegel beim rückwärts einparken herunterzufahren... das input signal kommt von der gangschaltung bzw. vom rückfahrlicht über ein relais... dann gibt's die zwei outputs für runterfahren und hochfahren... der spiegel soll dann ca. 3 Sekunden runter fahren (genau Zeit muss ich noch ausprobieren) und dann da stehen bleiben... und beim Auskuppeln des Rückwärtsgangs soll er wieder die gleiche Zeit hochfahren... Beim kurzen Rücksetzen jedoch, in dem schon nach weniger als 3 Sekunden ausgekuppelt wird, darf er natürlich auch nur die bis dahin abgelaufene Zeit wieder hochfahren... Alles klar? :)
Lasse Kleinjohann wrote: > der spiegel soll dann ca. 3 Sekunden runter fahren (genau Zeit muss ich > noch ausprobieren) und dann da stehen bleiben... und beim Auskuppeln des > Rückwärtsgangs soll er wieder die gleiche Zeit hochfahren... Beim kurzen > Rücksetzen jedoch, in dem schon nach weniger als 3 Sekunden ausgekuppelt > wird, darf er natürlich auch nur die bis dahin abgelaufene Zeit wieder > hochfahren... > > Alles klar? :) Alles klar. Schnapp dir einen Timer und verwende ihn als Zeitbasis, der dir alle, sagen wir mal ca. 0.1 Sekunden, einen Interrupt auslöst. In diesem Interrupt implementierst du dann dein Rauf/Runter-gezähle mit einer ganz normalen int Variablen und ein paar Portabfragen.
Hat der Spiegel eigentlich sowas wie einen Endschalter, bzw. eine Endabschaltung? d.h. Was passiert, wenn du dem Spiegel eine halbe Stunde lang sagst, er möge nach unten fahren. Wenn der Spiegel auf sich selber aufpasst, dann brauchst du da gar keine 'komplizierte' Zählerei, die sowieso nicht stimmen wird (ich sage nur mechanischer Schlupf, etc.). Du solltest nicht davon ausgehen, dass der Spiegel nach 10 mal 1.5 Sekunden runter und 1.5 Sekunden rauffahren wieder in der exakt gleichen Position wie am Anfang stehen wird.
ja hat er, also wenn ich im auto aufm knopf bleib dann hört er irgendwann auf sich zu bewegen... allerdings muss ich das mit dem gezähle ja trotzdem machen, weil wenn ich jetz nur ne sekunde im rückwärtsgang bin dann muss ich ja auch ne sekunde wieder hochfahren... sonst passts ja vorne und hinten nicht mehr... und wenn ich hochfahre dann ja auch nicht da bis zum geht nicht mehr sondern da halt in meine einstellung, die ich zum fahren brauch... das das nicht hundertprozentig hinhaut is mir klar, da muss man den fehler dann gelegentlich mal korrigieren ;)
Also habs jetzt mit ner Variable gelöst, die ich über den Timer0 Overflow mit Vorteiler 1024 ~15.25 (4 MHz Clock) mal die Sekunde erhöhe oder erniedrige... Das ergibt bei 61x ca. 4 Sekunden... Für Interessen nachfolgend noch der Code! Danke für die gute Hilfe!
1 | .include "m8def.inc" |
2 | |
3 | .def temp = r16 |
4 | .def inpt = r18 |
5 | .def time = r19 |
6 | |
7 | .org 0x0000 |
8 | rjmp main ; Reset Handler |
9 | .org OVF0addr |
10 | rjmp timer0_overflow ; Timer Overflow Handler |
11 | |
12 | main: |
13 | ldi temp, LOW(RAMEND) ; Stackpointer initialisieren |
14 | out SPL, temp |
15 | ldi temp, HIGH(RAMEND) |
16 | out SPH, temp |
17 | |
18 | ldi temp, 0xFF ; Port D auf Ausgang |
19 | out DDRD, temp |
20 | |
21 | ldi temp, 0x00 ; Port C auf Eingang |
22 | out DDRC, temp |
23 | |
24 | ldi time, 0x00 ; Zeit initialisieren |
25 | ldi temp, 0xFF ; Output initialisieren |
26 | out PORTD, temp |
27 | |
28 | ldi temp, 0b00000101 ; CS00 setzen: Teiler 1024 |
29 | out TCCR0, temp |
30 | |
31 | ldi temp, 0b00000001 ; TOIE0: Interrupt bei Timer Overflow |
32 | out TIMSK, temp |
33 | |
34 | sei |
35 | |
36 | loop: |
37 | rjmp loop |
38 | |
39 | timer0_overflow: ; Timer 0 Overflow Handler |
40 | sbic PINC, 0 |
41 | rjmp count_up |
42 | rjmp count_down |
43 | |
44 | count_up: |
45 | cpi time, 61 |
46 | brge still |
47 | inc time |
48 | rjmp spiegel_runter |
49 | |
50 | count_down: |
51 | cpi time, 0 |
52 | breq still |
53 | dec time |
54 | rjmp spiegel_hoch |
55 | |
56 | still: |
57 | ldi temp, 0x00 |
58 | com temp |
59 | out PORTD, temp |
60 | reti |
61 | |
62 | spiegel_runter: |
63 | ldi temp, 0b00000001 |
64 | com temp |
65 | out PORTD, temp |
66 | reti |
67 | |
68 | spiegel_hoch: |
69 | ldi temp, 0b00000010 |
70 | com temp |
71 | out PORTD, temp |
72 | reti |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.