www.mikrocontroller.net

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


Autor: Lasse Kleinjohann (piranha7)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lasse Kleinjohann (piranha7)
Datum:

Bewertung
0 lesenswert
nicht 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? :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lasse Kleinjohann (piranha7)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Lasse Kleinjohann (piranha7)
Datum:

Bewertung
0 lesenswert
nicht 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!
.include "m8def.inc"
 
.def temp = r16
.def inpt = r18
.def time = r19
 
.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler

main:
        ldi     temp, LOW(RAMEND)     ; Stackpointer initialisieren
        out     SPL, temp
        ldi     temp, HIGH(RAMEND)
        out     SPH, temp
  
        ldi     temp, 0xFF            ; Port D auf Ausgang
        out     DDRD, temp

        ldi     temp, 0x00            ; Port C auf Eingang
        out     DDRC, temp

        ldi     time, 0x00            ; Zeit initialisieren
        ldi     temp, 0xFF            ; Output initialisieren
        out     PORTD, temp        
 
        ldi     temp, 0b00000101      ; CS00 setzen: Teiler 1024
        out     TCCR0, temp
 
        ldi     temp, 0b00000001      ; TOIE0: Interrupt bei Timer Overflow
        out     TIMSK, temp
 
        sei
 
loop:       
    rjmp    loop
 
timer0_overflow:                      ; Timer 0 Overflow Handler
    sbic PINC, 0
    rjmp count_up
    rjmp count_down
    
count_up:
    cpi time, 61
    brge still
    inc time
    rjmp spiegel_runter
    
count_down:  
    cpi time, 0
    breq still
    dec time
    rjmp spiegel_hoch

still:  
    ldi temp, 0x00
    com temp
    out PORTD, temp
    reti
    
spiegel_runter:
    ldi temp, 0b00000001
    com temp
    out PORTD, temp
    reti

spiegel_hoch:
    ldi temp, 0b00000010
    com temp
    out PORTD, temp
    reti


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.