-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Auswertung Fernsteuerimpuls

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.04.2006
    Alter
    59
    Beiträge
    16

    Auswertung Fernsteuerimpuls

    Anzeige

    Neueinsteiger in die Programmierung mit zwei Problemen
    1. Ein High Impuls an irgend einem Pin sol einen Timer starten der beim Überlauf in einen Interupt springt. Klartext; Ein variabler Impuls von 1,0 bis 2.0 ms liegt etwa alle 20 ms an einen Pin an. Mit L-H startet der Timer der nach etwa 1,8 ms seinen Überlauf erreicht hat und nur beim überlauf in einen Interrupt springt. Ist der Impuls kürzer als 1,8 ms sol der Timer resetet werden.
    Es kommt mir nur auf die Konfiguration des Timers an also im Programm ganz oben, nicht im Hauptprogramm. Das dürften nur zwei Zeilen sein aber wie ?
    2. gibt es eine Möglichkeit soetwas wie Merker oder besser Schritmerker zu schreiben, ich denke soweit ich überhaupt noch denken kann das diese Merker die Grundlage für eine art schieberegister sind. Mit dem internen EEPROM wird das nichts bei der Geschwindigkeit.
    mein Hauptproblem dürfte mangelnde Englischkenntnisse sein, also als Anhang, Datasheet für mega8 und tyni2313 in Deutsch such ich noch.
    wen ich hier so lese was ansonsten abgeht werden bei meinen Problemen einiege grinsen.
    also ich bin dankbar für jede Hilfe die ich kriegen kann.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    01.02.2006
    Beiträge
    16
    Hallo drucker,

    wenn ich Dich richtig verstanden habe, dann willst Du einen RC-Kanal abfragen und bei einer Pulsbreite von <1,8 ms den Timer neu starten, bei >=1,8 ms immer in die Interruptroutine springen ... ja ?

    Ist soweit kein größerer Akt, aber dazu müsste man wissen, welche Taktfrequenz und welchen Timer Du dafür verwenden willst. Dann kann ich Dir auch die genauen Werte geben.

    Gruß.
    Rainer

    [NACHTRAG]
    Wenn Du Dir selber helfen willst, dann lade Dir mal das Tool hier runter. Das nimmt Dir die Berechnung des Timers komfortabel ab.
    http://www.roboternetz.de/phpBB2/dlo...le&file_id=169
    [/NACHTRAG]

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    09.04.2006
    Alter
    59
    Beiträge
    16
    Toll Wahnsin endlich mal jemand der mir auf die Sprünge hilft.
    Also das tol ist sehr bequem sofil hab ich nicht erwartet. fur mich ist aber wichtieger wie ich dem Timer beibringen kann das er nur mit L-H anläuft mein Quarztakt ist 3,6864 MHz ich hab vor den Quarz wegzulassen fals der interne R-C Generator mit seiner stabilität reicht. aber dazu kann ich mich immer noch später entscheiden. Sin und zweck des ganzen ist letztendlich ein freier Kanal mit dem
    1. schrit Positionslampen ein und Hecklampe blinkt, Toplampe ein
    2. schrit Wegerechtslampe ein
    3. schrit Deckstraler ein
    4. schrit Blitzer an
    und den rest der schritte dan eins nach dem anderen wieder ausschalten
    eben wie ein schieberegister.
    Ich erwarte auf keinen fall das mir jemand das programm schreibt ich brauche nur! die eins oder zwei zeilen für die timerkonfiguration
    mit TCCR leg ich den prescaler fest
    und irgendwie in TIMSK den rest, denk ich jedenfals
    und für jeden schrit setze ich sowas wie einen schritmerker. wie das mit dem eeprom geht ist klar, writeeeprom und readeeprom da muß es aber noch andere speicher geben.
    ok
    danke drucker

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    01.02.2006
    Beiträge
    16
    Hi drucker,

    ich glaube, Du musst das anders anpacken.
    Entweder Du nimmst einen "Pin change" als Interrupt,
    Code:
    'Interrupt bei jedem Flankenwechsel (0->1 und 1->0)
    Config Int0 = Change
    oder Du arbeitest mit dem Befehl "PULSEIN" von Bascom, der genug Auflösung für Schaltaufgaben bietet.
    Hier mal ein kleines Beispielprogramm von mir für einen ATTiny13-Positionslampenblinker (für einen Helikopter), der auf Schalterstellungen der Fernsteuerung reagiert .. nicht unbedingt elegant, aber funktioniert. Wenn man beim Einschalten die Fernsteuerung auf "100%" schaltet, kann man die Blinkfrequenz programmieren, die er dann in's EEProm schreibt. Vielleicht hilft's Dir ja was. ACHTUNG: Die "PULSEIN"-Werte sind von der Taktfrequenz abhängig !
    Code:
    '******************************************************
    'Projekt: Blinker
    '
    'Prozessor: ATTiny13
    'Bascom-Version: 1.11.8.2
    '
    'Programm : Positionslichter
    '
    'Hardware:
    'RC-Input an Port B.0
    'LED an Port B.1 Positionslichter (2) rot+grün statisch  (max. 1A)
    'LED an Port B.3 Flasher weiß alle 3 Zyklen  (max. 1A)
    'LED an Port B.4 Positionslichter (2) rot + grün blinkend jeder Zyklus (max. 1A)
    'Schaltkanal an Port B.2 statisch (max. 1A)
    'Alle Ausgänge auf Schalttransistoren
    '
    ' (c) Rainer Distler, 15.02.2006
    '
    '******************************************************
    
    '======================================================
    'System-Einstellungen
    '======================================================
    'Definition für Tiny13
    $regfile "attiny13.dat"
    
    'Angabe der Taktfrequenz (1,2 Mhz) Gegenüber 9,6 MHz weniger Stromverbrauch
    $crystal = 1200000
    'Hardware-Stack verkleinern
    $hwstack = 16
    
    '======================================================
    'Konfigurationen
    '======================================================
    Config Portb.0 = Input
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portb.3 = Output
    Config Portb.4 = Output
    Config Portb.5 = Output
    
    
    
    '======================================================
    'Deklarationen
    '======================================================
    '
    Dim Rc As Word
    Dim Dummy As Byte
    Dim Frequenz As Eram Word
    Dim Frequenzmem As Word
    Dim Timedummy As Word
    Declare Sub Stufe2
    
    '======================================================
    'Initialisierungen
    '======================================================
    Const An = 1
    Const Aus = 0
    Led1 Alias Portb.1
    Led3 Alias Portb.3
    Led4 Alias Portb.4
    Ausgang Alias Portb.2
    
    '======================================================
    'Hauptprogramm-Schleife
    '======================================================
    Waitms 3000
    'Nach Anschluss der Versorgungsspannung 3 Sekunden warten. Wenn in dieser Zeit
    'der RC-Kanal auf 100% geschalten wird, gelangt man in den Programmiermodus
    
    Pulsein Rc , Pinb , 0 , 1
    If Rc > 120 Then Goto Setfrequenz
    Do
    
       Pulsein Rc , Pinb , 0 , 1                                'Messung Zeit zwischen 1 und 0 Pegel
       If Rc <= 100 Then
          Led1 = Aus
          Led3 = Aus
          Led4 = Aus
          Ausgang = Aus
       End If
       If Rc > 100 And Rc < 110 Then
          Led1 = An
          Ausgang = Aus
       End If
       If Rc >= 110 And Rc <= 120 Then
          Ausgang = Aus
          Stufe2
       End If
       If Rc >= 120 Then
          Ausgang = An
          Stufe2
       End If
    
    Loop
                                                               '
    'Programmende
    End
    
    Setfrequenz:
    Frequenz = 80
    Frequenzmem = 80
    Do
       Led1 = An                                             'Blinkende LED zeigt Frequenz an
       Timedummy = Frequenz * 10
       Waitms 50
       Led1 = Aus
       Waitms Timedummy
       Pulsein Rc , Pinb , 0 , 1
       If Rc < 100 Then Frequenzmem = 80                        'Schaltkanal auf 0%
       If Rc > 100 And Rc < 110 Then Frequenzmem = 100          'Schaltkanal auf 40%
       If Rc > 110 And Rc < 120 Then Frequenzmem = 120          'Schaltkanal auf 80%
       'Verhindern, das EEProm ständig neu beschrieben wird
       If Frequenz <> Frequenzmem Then
          Frequenz = Frequenzmem
       End If
    Loop
    
    Sub Stufe2
       Led1 = An
       Incr Dummy
       If Dummy = 3 Then
          'Flasher alle 3 Zyklen
          Dummy = 0
          Led3 = An
          Waitms 50
          Led3 = Aus
       Else
          'Positionslichter doppelblinken jeden Zyklus
          Led4 = An
          Waitms 60
          Led4 = Aus
          Waitms 80
          Led4 = An
          Waitms 60
          Led4 = Aus
       End If
       Timedummy = Frequenz * 10
       Waitms Timedummy
    End Sub
    Gruß.
    Rainer

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    09.04.2006
    Alter
    59
    Beiträge
    16
    von deinem programm versteh ich nicht mal die hälfte da werd ich wol noch lange brauchen um dahin zu kommen ich glaube ich sollte erst mal nur einfach spielen mit der materie die summe meiner arbeit siehst du hier'von 0 auf ein bischen funktionieren ? und alles irgendwo zusammengebraut.
    Angehängte Dateien Angehängte Dateien

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    09.04.2006
    Alter
    59
    Beiträge
    16
    ich blamier mich jetzt zwar egal, kann mir mal jemand erklären wie ihr das mit dem geschriebenen programm in dem fenster hingekriegt hab

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    01.02.2006
    Beiträge
    16
    Zitat Zitat von drucker
    von deinem programm versteh ich nicht mal die hälfte da werd ich wol noch lange brauchen um dahin zu kommen ich glaube ich sollte erst mal nur einfach spielen mit der materie die summe meiner arbeit siehst du hier'von 0 auf ein bischen funktionieren ? und alles irgendwo zusammengebraut.
    Hmm .. schade. Dachte eigentlich, das Programm wäre genug Auskommentiert. Noch mehr wäre "overkill".
    Gut, probieren wir es anders. So schnell geben wir nicht auf

    Der einzige Befehl, der eigentlich relevant ist, ist "Pulsein Rc , Pinb , 0 , 1"
    Dieser Befehl sagt Bascom, daß Du einen Puls auf Port B, Pin 0, bei steigender Flanke messen willst (in meinem Beispiel) und diesen Wert dann der Variablen "RC" übergibt.
    Bascom wartet nun auf einen Puls, misst den und gibt der Variablen "Rc" den gemessenen Wert.
    Je nach Wert von Rc kannst Du jetzt bequem verzweigen.
    Wie sich der Wert zusammensetzt kannst Du in der Bascom-Hilfe lesen.
    Warum Du unbedingt einen Timer dafür "verschleudern" willst ist mir zwar ein Rätsel, aber kannst Du natürlich auch machen:
    Code:
    Pulsein Rc , Pinb , 0 , 1
    If Rc<100 then               ' Angenommen, der Wert 100 sind 1,8 ms Pulsdauer
          Start Timer0
    End If
    Die andere Möglichkeit wäre:
    Code:
    Config Timer1 = Counter , Edge = Rising , Capture Edge = Rising , Prescale = 1024
    Damit "verschenkst" Du aber den wertvollen 16-Bit-Timer für so eine einfache Anwendung und bist auf einen bestimmten Pin des AVR's angewiesen. Habe ich aber selbst noch nie benutzt, da noch nie gebraucht.
    Man sollte Sachen nicht unnötig kompliziert machen.

    Gruß.
    Rainer

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    01.02.2006
    Beiträge
    16
    Zitat Zitat von drucker
    ich blamier mich jetzt zwar egal, kann mir mal jemand erklären wie ihr das mit dem geschriebenen programm in dem fenster hingekriegt hab
    Einfach vor dem Programmtext "[ code]" und am Ende des Programmtextes "[ /code]" (ohne Anführungsstriche und Leerstelle)

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    09.04.2006
    Alter
    59
    Beiträge
    16
    Also aufgeben tu ich ganz bestimmt nicht ich brauche glaube ich erst mal ein polster von Grundlagen was mir fehlt. was das verschleudern von Timern anbelangt im moment egal aber nur im moment son AVR bietet möglichkeiten die ich warscheinlich nie ausschöpfen werde.
    zu deiner 1. lösung puls ein RC an welcher stelle im progrmm muß das rein? und ist mein lösungsweg soweit nutzbar oder prinzipiel mist?

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    01.02.2006
    Beiträge
    16
    Der "PULSEIN"-Befehl gehört in die Hauptschleife ... sollte ja relativ oft abgefragt werden, da man sonst die Signale der Fernsteuerung nicht mitkriegt.
    Habe mir Dein Programm mal angesehen. Sieht unnötig kompliziert aus .. hab' eine Weile gebraucht bis ich den Zusammenang der ganzen "Merker" einigermaßen verstanden hatte. Nebenbei wirst Du wohl, wenn Du diesen Programmierstil beibehältst, dezente Probleme mit dem Speicherplatz auf dem 2313 kriegen.
    Als erstes solltest Du Dich von der Vorstellung verabschieden, ein Schieberegister "nachbauen" zu wollen. Damit bleibst Du weit unter den Möglichkeiten und ist bei Deinem Projekt auch nicht zweckdienlich.
    Dein Projekt ist direkt prädestiniert für klare Strukturen.
    Mal ein paar Zeilen "Pseudocode" um das Prinzip zu erklären:
    Code:
    'in dieser Schleife bleiben wir bis die Hölle einfriert (oder Batterie leer ^^)
    Do              
        Lese Wert vom RC-Kanalpin ein (RC)
        'Zahl .. ist jetzt egal bei diesem Beispiel
        If RC < 100 Then     'Wenn RC kleiner 100
             Alle Lampen aus
         End IF
         If RC >=100 And RC < 110 THEN   'RC zwischen 100 und 109
             Lampe 1 An
             Lampe 2 Aus
             Lampe 3 Aus
          End If
          If RC >=110 And RC < 120 Then   'RC zwischen 110 und 119
             Lampe 1 An
             Lampe 2 An
             Lampe 3 Aus
          End If
          If RC >=120 Then           'RC größer oder gleich 120
             Lampe 1 An
             Lampe 2 An
             Lampe 3 An
          End If
    Loop
    Das wars auch schon. Gibt zwar bedeutend elegantere Lösungen, aber die würden Dich jetzt wohl nur verwirren.
    Der Vorteil, das immer alle Lampen ein/ausgeschalten werden in jeder "If/Then"-Verzweigung ist (auch wenns nach verschwendung aussieht), daß Du Dich nicht mehr darum kümmern musst, die Lampen noch irgendwie auszuschalten. Du bewegst einfach Deinen Schalter, Regler, was weis ich an der FS und bei jedem Wert wird die richtige Kombination ein bzw. ausgeschalten .. also nichts mit "wenn alles an ist schalte ich alles wieder rückwärts aus".

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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