- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 12

Thema: Flankenwechsel erkennen, aber wie?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.237
    ODER Du nimmst einen AVR bei dem alle Pin's IRQ fähig sind, das ist noch eleganter.
    Also wieder Pin Change Interrupts. Es kommt halt auf die Latenz Zeiten an, die in seinem Programm noch akzeptabel sind.
    Wenn karstenl ewig lange Wait Schleifen in seinem Hauptprogramm hat wirds schwierig mit dem pollen.
    Ausserdem muss er ja noch den Puls erzeugen. Wenn dieser auch in der Interrupt Routine erzeugt werden soll würde das nur mit Wait Schleifen gehen und das wäre in einer Interrupt Routine fatal.

    Wenn die Latenz keine Rolle spielt würde ich es per Polling in der Hauptroutine machen.
    Die alte Bit Kombination wird in einer Byte Variable gespeichert und invertiert ( aus allen 1 wird 0 und umgekehrt ) und mit der neuen Abfrage Exclusiv verodert.
    Wenn sich dann ein Bit Verändert hat kriegt man ein Ergebnis das >0 ist raus.
    Auf das kann man abfragen und den Puls generieren. Danach wird der aktuelle Zustand wieder in der Hilfsvariable gespeichert und invertiert.
    Das ist mit wenigen Programmzeilen zu machen. Allerdings ist die Reaktionszeit zwischen Tastenänderung und Impulsgenerierung dabei von der Durchlaufzeit der Hauptroutine abhängig. Ist dabei ein Schleifendurchlauf ziemlich kurz, dürfte das keine große Rolle spielen.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Also ich habe soetwas auch mal gemacht, ich musste damals 8 Tasten mittels Interrupt überwachen! Ich habe einfach jede Taste an einen Pin des AVRs gelegt und dann von jedem dieser Pins noch jeweils eine Diode zum Int0. Somit wurde der Int bei allen Tasten ausgelöst und ich konnte im Programm abfragen, welcher der Taster gedrückt wurde! Ist zwar vielleicht ein bisschen umständlich, aber es ist einfach umzusetzen und bei mir hats auch zuverlässig funktioniert!
    Das geht allerdings nur, wenn der Taster nur in eine Richtung schaltet! Bei einem Flankenwechsel wirds wohl nicht funktionieren, außer dir reicht jeder 2.

    Gruß
    Chris

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Zitat Zitat von wkrug Beitrag anzeigen
    Also wieder Pin Change Interrupts. Es kommt halt auf die Latenz Zeiten an, die in seinem Programm noch akzeptabel sind.
    Na ja, eigentlich meine ich (beim mega zumindest den Timer IRQ und natürlich dort NUR die Auswertung auf Änderung = Schalter betätigt. Den Rest in der Hauptroutine wie es sich gehört.
    Ob der Impuls "zu Fuß" oder mit dem Pulsout Befehl erzeugt wird hängt auch von der benötigten Pulslänge ab. Wobei mir nicht wirklich klar ist vie Bascom Pulsout umsetzt, das sollte man sich vielleicht einmal in ASM ansehen.

    Andererseits habe ich früher beim PIC die IRQ Fähigkeit aller (fast aller) Pins schätzen gelernt. Damals habe ich allerdings nur in ASM Programmiert, so eine Außenkamera schenkk/neige/Zoom/Focus RS 485 Sticksteuerung war in ganz wenigen Zeilen "erschlagen". Mehr hatte der Prozessor aber auch nicht zu tun.

    Gruß Richard

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.237
    zumindest den Timer IRQ und natürlich dort NUR die Auswertung auf Änderung = Schalter betätigt
    Dann kann ich's aber auch gleich wieder per Polling machen.

    PIC die IRQ Fähigkeit aller (fast aller) Pins schätzen gelernt
    Fast alle ATMEL Controller der "neueren" Serien ( ATTINY, ATMEGA ) können Pin Change Interrupts was in etwas das gleiche sein sollte.

    Mit Latenzzeiten meinte ich die Zeit, die vom Tastendruck bis zur Impulsausgabe vergeht.
    Wenn ich das per Polling mache ist diese Zeit variabel, da ja die Tastenabfrage irgendwo im Hauptprogramm gemacht wird.
    Sind dann im Hauptprogramm Operationen die sehr lange dauern, wird durch diese die Impulsausgabe verhindert.

    Wenn das eine Rolle spielt kann man das so nicht machen.

    Wenn die Reaktion schnell erfolgen soll, muss man die Tastenabfrage per Interrupts machen, den Impulsausgang sofort setzen und eventuell einen Timer ( Comparematch Interrupt ) als Abschalter für die Impulsausgabe missbrauchen.

    Sagen wir mal eine Taste wurde gedrückt, der zugehörige Interrupt aktiviert und der Impulsausgang gesetzt.
    Nun wird der aktuelle Zählerstand des Abschaltetimers ( z.B. Timer 1 ) ausgelesen, der Wert für die gewünschte Impulslänge dazuaddiert und im COMP1x Register abgelegt.
    Schlägt nun der Comparematch Interrupt zu wird der Impulsausgang abgeschaltet.

    Diese Methode würde sehr kurze Latenzzeiten produzieren und das Hauptprogramm immer nur kurzzeitig stören. Ist aber vom Handling her nicht so ganz einfach und Unproblematisch. Die komplette Tastenabfrage, Impulsgenerierung würde dabei, wie schon gesagt, in Interrupts abgewickelt.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Eine Idee:
    Code:
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Timer0 = Timer , Prescale = 1024                     'längster Impuls (bei 1 MHZ etwa 1/4 Sekunde) für längere Zeit 16 Bit Timer nehmen
    On Timer0 Timer_irq
    Enable Timer0
    Enable Interrupts
    Ddrc = &B00001111                                           'Ausgänge an Port C0-3
    Ddrb = 0                                                    'Eingänge an B0-3
    Dim Pinb_alt As Byte
    
    Do
    
    
    Loop
    End
    
    
    Timer_irq:
       Dim I As Byte
    
       For I = 0 To 3
          If Pinb_alt.i <> Pinb.i Then
             Set Portc.i
          Else
             Reset Portc.i
          End If
       Next I
       Pinb_alt = Pinb
    Return
    Oder für längeren Impuls:

    Code:
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Const Impulsdauer = 5                                       '4fache Impulsdauer
    Config Timer0 = Timer , Prescale = 1024                     'längster Impuls (bei 1 MHZ etwa 1/4 Sekunde) für längere Zeit 16 Bit Timer nehmen
    On Timer0 Timer_irq
    Enable Timer0
    Enable Interrupts
    Ddrc = &B00001111                                           'Ausgänge an Port C0-3
    Ddrb = 0                                                    'Eingänge an B0-3
    Dim Pinb_alt As Byte
    Dim Zeit(4) As Byte
    Dim I As Byte
    
    Do
       If Zeit(4) >= 1 Then                                     '>=1 erzeugt kleineren Code als >0...
    
          For I = 0 To 3
             If Zeit(i) >= 1 Then
                Decr Zeit(i)
             End If
             If Zeit(i) = 0 Then
                Reset Portc.i
             Else
                Set Portc.i
             End If
    
             If Pinb_alt.i <> Pinb.i Then
                Zeit(i) = Impulsdauer
             End If
          Next I
          Pinb_alt = Pinb
          Zeit(4) = 0
       End If
    
    Loop
    End
    
    
    Timer_irq:
       Incr Zeit(4)
    Return
    Geändert von peterfido (25.06.2011 um 22:24 Uhr)
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Hallo,

    hier mal ein Code für die Interrupts eines Mega88. Da der Change Interrupt nicht zwischen ansteigender und abfallender Flanke unterscheidet, wird einfach der Pegel des Pins im Interrupt abgefragt.

    Code:
    Config Int0 = Change 
    Config Int1 = Change
    On Int0 Int_0
    On Int1 Int_1
    
    Int_0:                                                      'A changing Flank was detected from the left Sensor
       If Pind.2 = 1 Then                                       'the rising Flank
    'Int0 (PinD.2) ist gerade auf High gesprungen
       Else                                                     'the falling Flank
    'Int0 (PinD.2) ist gerade auf Low gesprungen
       End If
    Return
    
    Int_1:                                                      'A changing Flank was detected from the left Sensor
       If Pind.3 = 1 Then                                       'the rising Flank
    'Int1 (PinD.3) ist gerade auf High gesprungen
       Else                                                     'the falling Flank
    'Int1 (PinD.3) ist gerade auf Low gesprungen
       End If
    Return
    Gruß Günter

Ähnliche Themen

  1. 12V mit AVR erkennen
    Von phyro im Forum AVR Hardwarethemen
    Antworten: 10
    Letzter Beitrag: 01.07.2009, 21:45
  2. Ball erkennen
    Von Luca im Forum Sensoren / Sensorik
    Antworten: 8
    Letzter Beitrag: 17.09.2008, 16:26
  3. flankenwechsel detektieren
    Von alper im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 10.05.2007, 13:04
  4. Kondensatorkapazität erkennen
    Von MischaMV im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 28.02.2006, 17:49
  5. gcc erkennen?
    Von bluebrother im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 09.11.2005, 12:10

Berechtigungen

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

12V Akku bauen