Ich würde da eine Menge anders Lösen. Was hast Du denn genau vor?
Ich würde da eine Menge anders Lösen. Was hast Du denn genau vor?
Wenn das Herz involviert ist, steht die Logik außen vor! \/
eine sogenannte komfortblinkerschaltung fürs auto.
1x blinkerhebel antippen, 3x nachblinken - wie bei den neueren autos...
soll halt keine verzögerung enthalten, sprich, dass wenn er gerade 3x links blinkt, dass ich auch sofort schnell rechts blinken kann (3x)
wenn der hebel gedrückt bleibt (einrastet) dann soll er nach 3x blinken so lange weiterblinken, wie der hebel gedrückt bleibt.
die testweiße "3 sekunden" soll nachher durch einen timer selbst gemessen werden können und als millisekunden ins eeprom geschrieben werden. beim starten, wenn ein jumper gesetzt ist, soll er die zeit messen (zwischen 2x blinkerhebel betätigen). wenn jumper nicht gesetzt, dann soll er direkt das hauptprogramm ausführen.
mfg,
rene.
hey, genau das gleiche baue ich sozusagen auch!Zitat von enterprise30
bloß, alleine mit dem hex-file kann ich leider nichts anfangen...
vorallem, weil es für den AT90S1200 geschrieben ist. ich benutze aber einen ATMega8.
@enterprise30:
kannst du mir bitte auch den quellcode dazu geben, please? oder tipps, wie ich mein problem löse?
mfg,
René.
Ich dir den Quäääl-code geben?
Nöööööö [-(
Oder doch?
Nein, kann ich nicht! Ist ja nicht mein Projekt....![]()
Frag den Typ mal, aber ich ich glaub nicht daß der das macht.
Und wenn, dann müsst er ja grad in Bascom proggen!
Ich würd das Stück für Stück proggen (oder gleich fertig von Ihm kaufen):
Zb. als aller erstes würd ich das nur dreimal-blinken-beim-antippen proggen.
Dann der Blinkerabbruch wenn von linksblinken auf rechtsblinken geschaltet wird.
Also immer erst die einfachsten Funktionen und dann Stück für Stück dazustricken und austesten. Dazwischen immer schön das lauffähige Programm speichern!
Hardwäremäßig musst du auch was schalten: Du brückst ja quasi den Blinkerhebel entweder mit der Hand und/oder zusätzlich mit Deinem µPc wenn die Hand wieder weggeht.
Hast Du dir mal einen Schaltplan von der Blinkerverdrahtung im Auto geholt?
http://mitglied.lycos.de/Autoelektrik/Eic.htm
Ansonsten machst das so wie in dem Schaltplan vom Jalt:
2 Eingänge für den Blinkerhebel, 2 Ausgänge für die Relais.
Guten Abend!
Hardwaretechnisch hab ich es "fast" genauso wie der von Jalt. Außer das meine beiden Eingänge auf INT0 + INT1 liegen.
Das mit dem 3x-Blinken klappt ja. Sei es Links oder Rechts.
Das einzige, woran ich gerade hänge ist der Blinkabbruch. Da komme ich nich weiter.![]()
Das passt ja soweit. Der Blinkerhebel wird ja sozusagen komplett aus der KFZ-Elektronik raus genommen und in die uC-Schaltung als eine Art Doppel-Taster/-Schalter eingesetzt.Hardwäremäßig musst du auch was schalten: Du brückst ja quasi den Blinkerhebel entweder mit der Hand und/oder zusätzlich mit Deinem µPc wenn die Hand wieder weggeht.
Es hängt wirklich nur an dem Blinkerabbruch!!! Hat keiner eine Idee oder einen kleinen Beispiel-Code, mit dem ich es versuchen könnte?
mfg,
René.
Vielleicht hilft Dir das weiter: Allerdings frage ich den Blinkerhebel nicht per Interrupt ab. Ich habe es nicht getestet, sollte aber wenn nur kleine Fehler enthalten.
edit: Maxzeitgrenze optimiert.Code:'Komfortblinker ' PB1 Ausgang Relais (High-Active) ' PB2 Ausgang Relais (High-Active) ' ' PD2 Eingang Blinkerhebel (Low-Activ)(INT0) ' PD3 Eingang Blinkerhebel (Low-Activ)(INT1) ' PD7 TimeSet (Low-Activ) '---------- uC-Konfig ---------- $regfile = "m8def.dat" 'ATMega8 $crystal = 1000000 'Quarz: 1 MHz $hwstack = 40 $swstack = 40 $framesize = 60 '---------- Port-Konfig ---------- Ddrb = &B11111111 'Port B als Ausgang Portb = &B00000000 'Port C komplett auf 0 setzen Ddrd = &B00000000 'Port D als Eingang Portd = &B11111111 'PullUp´s aktivieren Ql Alias Portb.1 Qr Alias Portb.2 Il Alias Pind.2 Ir Alias Pind.3 Timeset Alias Pind.7 Dim Richtung As Byte Dim Eingangalt As Byte Ila Alias Eingangalt.1 Ira Alias Eingangalt.2 Const Links = 1 Const Rechts = 2 Dim Tickcount As Long Dim Blinkzeit As Long Dim Maxzeit As Long Dim Dum1 As Eram String * 10 'dummy Dim Emaxzeit As Eram Long Config Timer0 = Timer , Prescale = 64 '10ms Takt On Timer0 Timer_irq Const Timervorgabe = 100 Enable Timer0 Enable Interrupts Maxzeit = Emaxzeit If Maxzeit < 1 Then Maxzeit = 300 '3 sekunden End If if Maxzeit > 1200 Then Maxzeit = 300 End If Do If Timeset = 0 Then Gosub Zeitsetzen Goto Sprung End If Gosub Eingang Gosub Zeiten Sprung: Loop End Eingang: If Il <> Ila Then Ila = Il Waitms 50'entprellung If Ila = 0 Then If Richtung = Links Then Richtung = 0 Else Richtung = Links Tickcount = 0 Reset Qr Set Ql End If End If End If If Ir <> Ira Then Ira = Ir Waitms 50'entprellung If Ira = 0 Then If Richtung = Rechts Then Richtung = 0 Else Richtung = Rechts Tickcount = 0 Reset Ql Set Qr End If End If End If If Richtung = 0 Then If Il = 1 Then Reset Ql End If If Ir = 1 Then Reset Qr End If End If Return Zeiten: If Richtung > 0 Then If Tickcount > Maxzeit Then Richtung = 0 End If End If Return Zeitsetzen: If Il <> Ila Then Ila = Il Waitms 25'entprellung If Ila = 0 Then Richtung = Links Tickcount = 0 Reset Qr Set Ql Else Reset Ql Maxzeit = Tickcount Emaxzeit = Maxzeit Richtung = 0 End If End If If Ir <> Ira Then Ira = Ir Waitms 25'entprellung If Ira = 0 Then Richtung = Rechts Tickcount = 0 Reset Ql Set Qr Else Reset Qr Maxzeit = Tickcount Emaxzeit = Maxzeit Richtung = 0 End If End If Return Timer_irq: Timer0 = Timervorgabe Tickcount = Tickcount + 1 If Tickcount = 2147483647 Then Tickcount = 0 'sollte es eigentlich nie zu kommen Return
edit 2: Eingänge entprellt (05.06.08/11:54)
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Super! Soweit funktionierts!
Bloß noch ein paar kleine Fragen:
- Timer muss doch irgendwo zurückgesetzt werden wenn er , weil zB wenn ich links drücke, schaltet das relais für 3 sek. wenn ich aber dann rechts drücke, zieht es bloß kurz an, dann muss ich nochmal rechts drücken, dann hält er es für 3 sek.
- Dum1 kann ja eigentlich gelöscht werden, oder?
- speichert er den "gemessenen" Wert im EEPROM? Weil die definition von Eram kenn ich leider nicht. WEnn ichs richtig verstehe, fragt er ja das ram nach emaxzeit ab. wenn sie sozusagen nicht gesetzt ist, setzt er sie auf 300. und im label Zeitsetzen: schreib er sie dann ins EEPROM?
Auf jedenfall mal viiieeelen Dank! WEnn mal der Komfortblinker fertig ist, bekommst du peterfido einen von mir geschenkt!!!
mfg,
René.
Timer wird zurückgesetzt (Tickcount=0). evtl mal die Eingänge entprellen, da beim 2. Mal in die selbe Richtung abgebrochen wird. Ich habe das gerade mal auf meinem Testboard probiert. Läuft soweit. Dum1 ist dafür da, weil ich irgendwo mal gelesen habe, dass im Fehlerfall die ersten Stellen des EEproms überschrieben wurden. Durch dum1 wird der Wert ab der 11. Stelle im EEprom gescheichert. Ich editier gleich noch mal das Programm und füge eine Entprellung ein.
edit: emaxzeit = maxzeit speichert ins eeprom
edit2: Habe gerade mal ein wenig getestet. Gute Werte zum entprellen sind 50ms.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Lesezeichen