- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Mit Taster einen Timer starten ?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.10.2004
    Alter
    57
    Beiträge
    50

    Mit Taster einen Timer starten ?

    Anzeige

    E-Bike
    Hallo Forum,

    Hier habe ich ein kleines Listing.
    Ich möchte die Taste PD2 drücken die LED an Port PD3 soll eine Minute leuchten dann aus gehen.

    Code:
    $Regfile = "m8def.dat" 
    $Crystal = 3686000    'Quarz: 3.6860 MHz
    DDRD = &B0001000      'Pin PD3 Ausgang, Rest Eingang
    'PORTD = &B0000100    'PullUp von Pin PD2 aktivieren
    
    Do
      If PIND.2 = 0 Then  'Wenn Taster (Pin PD2) gedrückt
        PORTD.3 = 1       'Rote LED (Pin PD3) an
      Else                'Wenn Taster nicht gedrückt
        PORTD.3 = 0       'Rote LED aus
      End If
    Loop
    End
    Kann mir da jemand helfen ?

    mfg

    Enterprise

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hi,

    wenn´s nur um den Taster und die Led geht, kannst Du dir mit dem Wait-Befehl helfen. Funzt aber nur, wenn der Prozessor während der Minute ausser Warten nichts anderes tun muß...

    Außerdem solltest Du beachten, dass die LED´s und Eingänge üblicherweise mit einem Pullup-Widerstand betrieben werden, d.h., die LEd leuchtet, wenn der Ausgang auf logisch "0" gesetzt wird. Von daher hätte Dein Programm nicht funktioniert.

    Der Grund liegt darin, dass ein Prozessor-Pin die 20mA nur gegen GND schalten kann, Der High-Pegel liefert nur ein paar mA.

    Code:
    $Regfile = "m8def.dat" 
    $Crystal = 3686000    'Quarz: 3.6860 MHz 
    DDRD = &B0001000      'Pin PD3 Ausgang, Rest Eingang 
    'PORTD = &B0000100    'PullUp von Pin PD2 aktivieren
    'Damit aktivierst Du keine Pullups sondern schreibst nur ein Bitmuster in das Byte von PortD...
    
    Portd.3=1 'Portd.3 auf 5V-> LED aus...
    
    Do 
      If PIND.2 = 0 Then  'Wenn Taster (Pin PD2) gedrückt 
        PORTD.3 = 0       'Rote LED (Pin PD3) an 
      end if
      if Pind.2=1 and Pind.3=0 then 'Wenn Taster frei und Portd.3 =0 (LED an)
        wait 60
        PORTD.3 = 1      'Rote LED aus 
      End If 
    Loop 
    End
    Ist nicht getestet, nur runtergetippt - die Feinheiten überlasse ich Dir...

    Viele Grüße

    Torsten

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von Torsten_G
    Außerdem solltest Du beachten, dass die LED´s und Eingänge üblicherweise mit einem Pullup-Widerstand betrieben werden, d.h., die LEd leuchtet, wenn der Ausgang auf logisch "0" gesetzt wird. Von daher hätte Dein Programm nicht funktioniert.

    Der Grund liegt darin, dass ein Prozessor-Pin die 20mA nur gegen GND schalten kann, Der High-Pegel liefert nur ein paar mA.
    Für viele µC ist das der Fall. Die Ausgangstreiber der AVRs sind hingegen symmetrisch, so daß ein Port als Ausgang nicht nur 20mA versenken, sondern auch liefern kann.

    Unter 'Absolute Maximum Ratings' steht sogar
    DC Current per I/O Pin: 40.0 mA
    Ein Pin kann also 40mA aushalten, ohne abzufackeln.
    Allerdings ist nicht garantiert, daß ein Pin auch wirklich 40mA liefert/versenkt. Das ist wie gesagt weniger und hängt von Vcc ab und der Temperatur ab.
    Test conditions (20mA at Vcc = 5V, 10mA at Vcc = 3V)
    Zusätzlich gibt es aber noch Einschränkungen an den Gesamtstrom pro PortX und Gesamtstrom über Vcc- und GND-Pin(s), die sich auch für die Verschiedenen AVRs und Gehäusetypen unterscheiden.

    Das findet sich alles unter 'Electrical Characteristics' bzw 'I/O Pin Source/Sink Current vs. Output Voltage'.
    Disclaimer: none. Sue me.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Wäre jetzt nochmal jemand so nett das ganze mit einem Timer zu realisieren? Ich verstehe die ganze Timer-Geschichte nämlich auch nicht.

  5. #5
    Gast
    Danke für die Tipps mit Wait.
    Jetzt möchte ich noch in dieser Zeit einen Port abfragen ,ob er gedrückt ist oder nicht.
    Wie müßte ich das jetzt einpflegen ?
    So wie hardstyleroxx gefragt hat , mit einem Timer?

    mfg

    Enterprise

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Da kommst du nämlich schon zu dem Problem von Wait. In der Zeit wo ein Wait gesetzt ist, macht der ganze Controller nichts anderes ausser warten.
    Deswegen würde mich auch mal interessieren wie man eine LED mit einem Timer blinken lässt.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Zitat Zitat von SprinterSB
    ...
    Die Ausgangstreiber der AVRs sind hingegen symmetrisch, so daß ein Port als Ausgang nicht nur 20mA versenken, sondern auch liefern kann.
    ...
    Danke für den Tipp, offenbar waren meine Kenntnisse darüber veraltet!

    Grüße

    Torsten

  8. #8
    Gast
    Hallo Forum,

    Kann zu diesem Thema niemand etwas dazu schreiben.
    Weil hardstyleroxx und ich brennend auf die Antwort warten.
    Da wir defizit im Timer Programmieren haben.

    mfg

    Enterprise

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Hallo,

    Zitat Zitat von Anonymous
    Hallo Forum,
    Kann zu diesem Thema niemand etwas dazu schreiben.
    Weil hardstyleroxx und ich brennend auf die Antwort warten.
    Da wir defizit im Timer Programmieren haben.
    es gibt ein nettes Tool, mit dem man nicht nur realisierbare Zeiten von Timern ausrechnen kann, sondern das auch gleich noch einen Sourcecode auspuckt, der auch das blinken einer LED enthält. Das Teil heßt RN-avr und steht unter:

    https://www.roboternetz.de/phpBB2/dl...le&file_id=169

    zum Downlod bereit. Die Anpassung an eigene Bedürfnisse sollte ein leichtes sein.

    Grüße
    Henrik

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    03.10.2004
    Alter
    57
    Beiträge
    50
    Hallo Forum,

    Nun habe ich ein bischen Zeit gehabt zum downloaden und testen.
    Habe mit dem Programm eine Sourcecode erstellt.
    Code:
    'wenn mega 32, dann ändern in  $regfile = "m32def.dat"
    ' $regfile = "m16def.dat"
    $regfile = "m8def.dat"
    $crystal = 3686000
    
    'nur notwendig wenn RS232 benutzt werden soll
    $baud = 9600
    
    'Hier wird der Timer und der Teiler festgelegt
    Config Timer0 = Timer, Prescale = 64
    
    'Der Port mit der dritten LED auf RN-Control wird als Ausgang programmiert
    Config Pinc.2 = Output
    'Hier geben wir der Definition einen schöneren Namen
    Led3 Alias Portc.2
    
    'Hier wird das Unterprogramm festgelegt, das
    'in dem von ihnen eingestellten Intervall aufgerufen wird
    On Timer0 Timer_irq
    
    'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
    Const Timervorgabe = 198
    
    
    'Hier werden die Timer aktiviert
    Enable Timer0
    Enable Interrupts
    
    'Hier ist die Programmhauptschleife
    Do
    'Hier könnte Ihr Hauptprogramm stehen
    Loop
    
    
    
    'Dies ist der Programmteil, der in dem von ihnen gewählten
    'Intervall aufgerufen wird
    Timer_irq:
      Timer0 = Timervorgabe
    
    'Hier könnte nun ihre beliebige IRQ-Routine stehen
    'Dabei sollte man darauf achten das diese nicht mehr Zeit
    'benötigt, als das Intervall zuläßt
    
    'Der Zustand der LED wir umgekehrt, wodurch sich blinken in der halben Frequenz ergibt
    'Hohe Frequenzen sind natürlich nicht mehr sichtbar
       Toggle Led3
    
       Return


    zum Downlod bereit. Die Anpassung an eigene Bedürfnisse sollte ein leichtes sein.

    Grüße
    Henrik
    Aber für ein Anfänger ist es nicht leicht.
    Kann mir jemand dabei helfen ?

    mfg

    Enterprise

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen