- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Wait-Anweisung durch Interrupt unterbrechen?

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Anzeige

    Praxistest und DIY Projekte
    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! \/

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    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.

  3. #13

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    Zitat Zitat von enterprise30
    http://www.jalt.de/Downloads/BS/BS.zip
    hey, genau das gleiche baue ich sozusagen auch!

    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é.

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    10.10.2005
    Ort
    Nähe Biberach a.d. Riss
    Alter
    54
    Beiträge
    44
    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.

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    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.

    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.
    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.

    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é.

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    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.

    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: Maxzeitgrenze optimiert.
    edit 2: Eingänge entprellt (05.06.08/11:54)
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    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é.

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    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! \/

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests