Steuerung el. Fensterheber

Gast #17344
Lesenswert?

Hallo,

ich versuche mich gerade an einer Steuerung für vier elektrische 
Fensterheber in einem PKW. Die Fenster sollen beim Antippen des Tasters 
für 8 sec. angesteuert werden, aber beim Halten des Tasters nur für die 
Dauer des Tastendrucks laufen. Das Ganze soll mit allen Fenstern zur 
selben Zeit funktionieren. Meine Kentnisse auf diesem Gebiet beschränken 
sich derzeit auf Tutorial und Learning by Doing...
Unter tatkräftiger Mithile von Uwe und Stefan 
(http://www.mikrocontroller.net/forum/read-1-9120.html) ist bereits der 
Code im Anhang entstanden. Er unterstützt z.Zt. nur die automatische 
Funktion bei zwei Fenstern. Mir stellen sich gerade zwei Fragen:

1. Läuft das AVRStudio in Echtzeit? Bis zum Haltepunkt am Timer-INT 
dauerts >10 sec.

2. Hat jemand eine Idee mit der ich feststellen kann, ob der Taster über 
0.5 sec gedrückt wurde? Was passiert, wenn ich zwei Taster gleichzeitig 
längere Zeit gedrückt halte?

Vielen Dank,
Matthias
Angehängte Dateien:
Gast #17346
Lesenswert?

hallo,

ich habe jetzt

ldi tmp, RAMEND
out SPL, tmp

direkt an den Anfang der RESET-Routine geschrieben, noch vor SEI. 
Vielleicht kann mir jemand erklären, warum das so sein muss.

Daneben bin ich nach wie vor am oben beschriebenen Problem zu Gange. Ich 
möchte es mit einer art "Timertabelle" aus mehreren Registern lösen, die 
alle 100 ms incrementiert werden. Wie bringe ich dem Ding (AT90S4433) 
bei, alle 100 ms einen INT auszuführen, der in einer eigenen Routine die 
Register hochzählt??

Gruß,
Matthias
Admin Persönliche Seite #17347
Lesenswert?

Stack: http://www.mikrocontroller.net/tutorial3.htm

Das Programm im AVR-Studio läuft nicht in Echtzeit, sondern bestimmt 
1000mal langsamer.

Für deine Zeitsteuerung kannst du den Timer 1 des AVRs nehmen. 
Angenommen du hast einen 4 MHz-Quarz, dann stellst du den Prescaler z.B. 
auf 1024 ein und das Output-Compare-Register auf 390. Der 
Compare-Interrupt wird also ungefähr 10 (=(4000000/1024)/390) mal pro 
Sekunde aufgerufen. In diesem Interruptaufruf kannst du nun irgend ein 
Register immer um 1 erhöhen.

Beispiel (Pseudocode) für nur ein Fenster:


timerinterrupt:
  zählregister++

hauptschleife:
  wenn taste gedrückt
    |temp=zählregister
    |fenstermotor an
    |
    |während zählregister<temp+5 //0,5 Sekunden
    | |warte
    |
    |wenn taste nicht gedrückt
    | |ganzrunter=1
    |sonst
    | |während taste gedrückt
    | | |warte
    | |fenstermotor aus

  gehe zu haupschleife


Hoffe das war verständlich...
Dann muss im Timerinterrupt nur noch getestet werden ob "ganzrunter" 
gesetzt wurde. Wenn ja muss die Zeit gemerkt werden und 80 
Timerinterrups danach der Fenstermotor wieder abgeschaltet werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren