Forum: Mikrocontroller und Digitale Elektronik Atmega8 - Hoch und Runterzählen mit Timer


von Lasse K. (piranha7)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Lasse K. (piranha7)


Lesenswert?

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? :)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Lasse K. (piranha7)


Lesenswert?

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 ;)

von Lasse K. (piranha7)


Lesenswert?

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
Noch kein Account? Hier anmelden.