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
Den Stackpointer möglichst zuerst setzen ! Auf alle Fälle aber vor dem SEI, sonst stürzt Dir schon der 1. Interrupt ab. Peter
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.