Forum: Mikrocontroller und Digitale Elektronik Steuerung el. Fensterheber


von Matthias (Gast)


Angehängte Dateien:

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

von Peter D. (peda)


Lesenswert?

Den Stackpointer möglichst zuerst setzen !
Auf alle Fälle aber vor dem SEI, sonst stürzt Dir schon der 1. Interrupt 
ab.


Peter

von Matthias (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


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.

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.