- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 37

Thema: Port abfragen alle 0,05 Sekunden wie ???

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

    Port abfragen alle 0,05 Sekunden wie ???

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Forum,

    Ich möchte den Portd.5 alle 0,05 Sekunden abragen.
    Wenn der Port auf 1 ist dann soll über den UART eine 1 gesendet werden und wenn der Port auf 0 ist dann soll eine 0 gesendet werden.
    Ich habe dafür keinen Ansatz wie ich anfangen soll.
    Ob ich einen Interupt brauche oder welchen Timer ??

    Hat jemand für mich einen Ansatz.

    mfg

    Enterprise

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2004
    Ort
    Bürstadt
    Alter
    37
    Beiträge
    383
    0,05sec? sind 50ms

    mach doch einfach eine Do..Loop schleife..

    Do
    Print Pind.5
    waitms 50
    loop

    müsste gehn
    MfG
    Ringo
    Nobody is Perfect
    Visit www.ringo.roboterbastler.de last update: 23.05.2009

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Ja,oder den Timer bemühen
    Gruß
    Ratber

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    03.10.2004
    Alter
    57
    Beiträge
    50
    Danke für die kleine Hilfe,

    Habe dann mal los programmiert.
    Dieses Programm kam dann raus.

    Code:
    $regfile = "m8def.dat"                                      'ATmega8-Deklarationen
    $crystal = 3686000                                          'Quarz: 3,6864 MHz
    $baud = 9600                                                'Baudrate der UART: 9600 Baud
    
    On Timer1 Ontimer1
    Config Timer1 = Timer , Prescale = 64                       'Timertakt = Crystal / 64
    Enable Timer1                                               'Timer1 einschalten
    Enable Interrupts                                           'Interrupts Global einschalten
    Const Timervorgabe = 36736
    
    
     Ddrd = &B10011111                                          'Pin PD6 Ausgang, Rest Eingang
    Portd = &B01100000                                          'PullUp von Pin PD 0,1,2,3,4 aktivieren
    
    Dim Zler As Byte
    Dim P5 As Byte
    Dim I As Byte
    Declare Sub Port5
    Declare Sub Summer
    
    I = 1
    
    '----------------------------------------------------------
    '###Hauptschleife###
    '----------------------------------------------------------
    
    Main:
    
    '----------------------------------------------------------
    Do
      Debounce Pind.6 , 0 , Port5                               'Entprellt
    Loop
    '----------------------------------------------------------
    
    
    '----------------------------------------------------------
    ' ######  Port 5 ###########
    '----------------------------------------------------------
    
    Port5:
    
    Zler = 1
    
    For I = 1 To 10                                             ' Durchgang 10 mal
                                                                 ' Sollte dann Timer auf 10 
    Print Pind.5 ; "  " ; Zler
    
    P5 = Pind.5
      If P5 = 0 Then
         Portd.7 = 0                                              ' Summer an Port7 aus
       Else
         Portd.7 = 1
      End If                                                    ' Summer an Port7 ein
    
    Waitms 100
    
    Next I
    
    Goto Ende
    
    
    '-----------------------------------------------------------
    '####### Summer ##############
    '-----------------------------------------------------------
    
    Summer:
    If P5 = 0 Then
     Portd.7 = 0
     Else
     Portd.7 = 1
    End If
    Return
    '------------------------------------------------------------
    
    '------------------------------------------------------------
    '#### Ende #####
    '------------------------------------------------------------
    
    Ende:
    
    Print " "
    Print " "
    Print " Ende "
    Print "<--->";
    Print " "
    Print " "
    
    Goto Main
    
    Return
    
    
    '-----------------------------------------------------------------------
    '####### Timer ############
    '----------------------------------------------------------------------
    '###OnTimer1###
    
    Ontimer1:
    Timer1 = Timervorgabe
    Incr Zler
    
    Return
    
    End
    Es funktioniert noch nicht so wie ich es will.
    Mit der Funktion Print Pind.5 erscheint immer eine 1 ich hätte gerne eine 0.
    Die For Next Schleife ist nur drin dass ich es besser kontrolieren kann.
    Der Timer ist auch nicht richtig eingestellt.
    Sollte jede Sekunde überlaufen.
    Nach dem drücken des Pind.6 soll das Programm 10 Sekunden laufen.
    Also den Pind.5 alle 50 ms abfragen.
    Hat jemand noch eine Idee wie ich das Programm verändern könnte ?

    mfg

    Enterprise

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Mit der Funktion Print Pind.5 erscheint immer eine 1 ich hätte gerne eine 0.
    Das liegt daran, das der Taster gegen Masse schaltet und der interne Pullup immer eine 1 erzeugt.
    Das könntest du mit IF THEN ändern. IF blablabla = 1 Then Print "0"

    Nach dem drücken des Pind.6 soll das Programm 10 Sekunden laufen.
    Also den Pind.5 alle 50 ms abfragen.
    Das könntest du auch mit IF und den INT einschalten lösen.
    IF d.6 = 0 then Enable Timer1
    Der Timer kann ja auch eine Sekunde eingestellt werden und 10 mal eine Variable erhöhen.
    Aber das abfragen alle 50ms solltest du nochmal überdenken.
    So schnell kann kein Mensch drücken
    Und das ist ja auch schon fast die Zeit, die zum entprellen benötigt wird.
    Was genau soll in dieser Zeit passieren? Willst du den Taster lange drücken und so lange er gedrückt ist soll alle 50mS was passieren?
    Dann müsste die Abfrage ja 50mS dauern. Bzw. in 50mS muss der Taster mehrmals abgefragt werden.
    Und was soll nach dieser Zeit passieren? Nochmal abfrgaen? Wieviel Zeit darf bis zur nächsten Abfrage vergangen sein?

    Mag ja sein, das ich dein Problem nicht richtig verstanden habe, aber es kann auch sein, das du das was falsch siehst?!?

    Es wäre hilfreich zu wissen, was genau passieren soll.
    Das mit den 10 Sek ist nicht das Problem. Aber die Abfrage.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    03.10.2004
    Alter
    57
    Beiträge
    50
    Also an Port 5 soll kein Taster sondern ein LDR.
    Der wird von einem Laser getroffen.
    Deshalb soll alle 0,05 Skunden abgetastet werden.
    Ist der Port auf 1 oder 0 .
    Die Abtastrate soll dann 10 Skunden dauern.

    mfg

    Enterprise

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    03.10.2004
    Alter
    57
    Beiträge
    50
    Habe das Programm etwas geändert.

    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    $baud = 9600                                         'Baudrate der UART: 9600 Baud
    
    Config Timer1 = Timer , Prescale = 64
    On Timer1 Timer_irq
    Const Timervorgabe = 7936
    
    
     Ddrd = &B10011111
     Ddrc = &B11111111
    Portd = &B01100000
    
    
    Config Pinc.2 = Output
    Led3 Alias Portc.2
    
    
    Dim Sekunden As Byte
    Dim P5 As Byte
    Declare Sub Port5
    Declare Sub Ledon
    Declare Sub Main
    Declare Sub Ende
    
    Enable Timer1
    Enable Interrupts
    
    Main:
    
    '----------------------------------------------------------
    Do
      Debounce Pind.6 , 0 , Ledon:                              'Entprellt
    Loop
    '----------------------------------------------------------
    Ledon:
    Print "S"
    Do
    If Sekunden < 10 Then
       Set Led3
    '   Print "  " ; Sekunden
        Else
         Reset Led3
         Sekunden = 0
       Goto Ende
    End If
    
    Print Pind.5 ; "  "
    P5 = Pind.5
      If P5 = 0 Then
         Portd.7 = 0                                              ' Summer an Port7 aus
       Else
         Portd.7 = 1
      End If                                                    ' Summer an Port7 ein
    
    Waitms 50
    
    
    Loop
    
    '------------------------------------------------------------
    '#######   Ende  ###############
    '------------------------------------------------------------
    
    Ende:
    Print "E"
    Print "  "
    Print "  "
    Goto Main
    
    
    Timer_irq:
    Timer1 = Timervorgabe
    Incr Sekunden
    Return
    Wo müßte ich das
    IF blablabla = 1 Then Print "0"
    eingefügt werden ?

    mfg

    Enterprise

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    03.10.2004
    Alter
    57
    Beiträge
    50
    Ich glaube ich habe es gefunden.

    Code:
    Ledon:
    Print "S"
    Do
    If Sekunden < 10 Then
       Set Led3                                                 'Led zeigt 10 Sek.an
    '   Print "  " ; Sekunden
        Else
         Reset Led3
         Sekunden = 0
       Goto Ende
    End If
    
    'Print Pind.5 ; "  "
    P5 = Pind.5
      If P5 = 1 Then
         Print "0"
         Portd.7 = 0                                            ' Summer an Port7 aus
       Else
       Print "1"
         Portd.7 = 1
      End If                                                    ' Summer an Port7 ein
    
    Waitms 50
    
    
    Loop
    mfg

    Enterprise

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Laser --> LDR = 0,05 Sekunden???
    Mhh, ich kaufe immer die günstigen LDR's. Die schalten nicht so schnell denke ich.

    Wie auch immer...

    Das If hast du da an der richtigen Stelle eingefügt.

    Hast du das ganze schonmal aufgebaut und getestet? Ich kann nur schwer nachvollziehen, das es geht und was es letztendlich bringen soll.

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Also irgendwie höhrt sich das nach Rundenzähler oder Geschwindigkeitsmessung an.

    Da wären LDR's allerdings denkbar ungeeignet.

    Wenn die Trägheit LDR's dagegen als Entstörung genutzt werden soll dann ist das ne praktische Lösung.
    Allerdings passen dann die 0.05s nicht mehr denn LDR's sind in der Regel um einiges Träger.

    @Enterprise

    Täte mich mit diesem Hintergrunde auch interessieren was es denn mal werden soll.
    Gruß
    Ratber

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen