- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 25

Thema: Ansteuerung RC LED Scheinwerfer

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2016
    Beiträge
    9
    Hallo Daniel,

    gut was weiß ich über Timer, Variablen und Interrupts.

    Timer sind in wirklichkeit nichts anderes als Zähler.
    Genau genommen erhöhen sich deren Zählwerte pro Programmdurchlauf um 1, was die Timergeschwindigkeit von der Taktrate des Mikroprozessors abhängig macht. Hab ne bissel was schon mit denen gemacht nur eben keine PWM.
    Die Themen prescaler und das es eben nur ein 8 Bit Timer ist der nur bis 255 zählen kann sind mir klar.

    Interrupts lößen meines wissens speziele Programmabschnitte / Routinen aus die möglichst kurz sein sollen. Die Routinen werden bei einem Flankenwechsel nur einmal durchlaufen soweit ich weiß
    Variablen kenn ich die gängigsten Typen wie eben Bool Integer Word usw. Die sind mir von meiner Arbeit bekannt.

    Mein Problem ist oftmals die Fehlersuche beim probieren.
    Ich programmier auf Arbeit in Industriesteuerungen da hab ich aber immer die Möglichkeit online zuzuschauen was die CPU im Programm treibt.

    Das fehlt mir leider bei den Mikroprozessoren ein wenig.

    Ich bin leider noch nicht so wirklich weiter gekommen.

    Bin immer noch am basteln.

    Gruß Stephan

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Mein Problem ist oftmals die Fehlersuche beim probieren.
    Ich programmier auf Arbeit in Industriesteuerungen da hab ich aber immer die Möglichkeit online zuzuschauen was die CPU im Programm treibt.

    Das fehlt mir leider bei den Mikroprozessoren ein wenig.

    Ich bin leider noch nicht so wirklich weiter gekommen.

    Bin immer noch am basteln.
    Das stimmt - manchmal ist es schwierig herauszufinden, was in diesen kleinen Dingern wirklich gerade passiert. Aber es ist grundsätzlich möglich!
    Wir wollen hier ja niemandem fertigen Code vorkauen, denn den meisten Spaß macht es ja, selber drauf gekommen zu sein!
    Ich würde sagen, wir fangen mal mit was ganz einfachem an:

    So ein Servo-Impuls bewegt sich zwischen 1 und 2 ms. Wenn man die Länge dieses Impulses mit dem (einzigen) Timer0 messen möchte, darf der Timer keinesfalls während des zu messenden Impulses "überlaufen", weil er danach ja wieder bei 0 anfängt und die Messung dann logischerweise total falsch wäre. Anders gesagt, um von 1 bis 255 hochzuzählen muss der Timer länger brauchen als 2 ms. Rechne doch mal aus wie viel Zeit der Timer0 is zum Überlauf braucht, wenn Du den Takt des Controllers auf 4,8 MHz und den Prescaler des Timers uf 64 einstellst - und dann sehen wir weiter!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2016
    Beiträge
    9
    Hi,
    einen vorgekauten Code, will ich ja gar nicht haben

    Wenn ich mich jetzt nicht allzu dolle verrechnet habe, sollte bei 4,8 Mhz und einem Prescaler von 64 ein timerüberlauf nach 3,4 ms stattfinden, was ja aussreicht um die 2ms vom Empfänger zu erkennen.
    Daher sollte der Timer bei 1ms einen Wert von ca. 75 haben und bei 2 ms einen Wert von 150.


    Nur als Info, da nicht jeder Empfänger als High Pegel um die 5 V ausgibt sondern manchmal deutlich weniger, schalte ich mit der Impulsleitung einen kleinen NPN Transistor und ziehe mit diesem den Int0 auf GND. ansonsten benutze ich den Internen Pullup Widerstand.

    Von der Theorie her dachte ich daran mit dem Int0 einen Interrupt auzulösen und in eine ISR zu springen. Dort Frage ich den Pin ab ob er 1 oder 0 ist und merke mir das. Nur müßte ich dann bei ausgelößter ISR und Gemerkter steigender Flanke den Timer starten und bei fallender Flanke auslesen und den Timer wieder stoppen.

    Aber wie verwende ich den Timer dann noch für die anderen Funktionen?

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.095
    Was bedeutet deutlich weniger Spannung als 5V? Hast du das nachgemessen? Vielleicht benötigst du keinen Transistor. Und beim messen kein Multimeter sondern ein Oszilloskop verwenden.

    Beim Timer darfst du nichts ändern, sonst funktioniert der Timer Interrupt und die PWM Funktion nicht richtig. Du liest nur den aktuellen Zählerstand aus. Du musst nur bedenken das es einen Überlauf geben kann. Bei einem Überlauf musst du die Berechnung etwas anpassen.

    MfG Hannes

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Genau so ist es, der Timer zählt zwischen 75 und 150 Schritte weiter. Und man darf ihn nicht starten und stoppen, wenn er gleichzeitig ein PWM-Signal generieren soll, auch das ist richtig. Und bei dieser Anzahl an Zählschritten ist es sogar sehr wahrscheinlich, dass der Timer regelmäßig während des Impulses überläuft. Aber das ist nicht schlimm:

    Da Bytes ja keine negativen Werte haben können, gibt es sozusagen einen "Rückwärts-Überlauf", wenn Du von einem kleineren Byte ein größeres subtrahierst. Klingt jetzt vielleicht ein wenig abstrakt, aber an einem Beispiel wird es sicher verständlich:

    Nehmen wir mal an der Impuls ist so lang, dass der Timer um 80 Schritte weiterzählt. In der ISR weist Du bei steigender Flanke einer Variablen (z.B. "Alt") den aktuellen Zählerstand zu, und bei fallender Flanke einer anderen (z.B. "Neu"). Anschließend subtrahierst Du Neu-Alt. Ist der Timer zwischen den Flanken nicht übergelaufen, ist alles klar: Neu ist grölßer als Alt, und die Differenz ist immer 80.

    Aber was passiert wenn der Timer während des Impulses überläuft und Neu somit kleiner ist als Alt? Wenn Alt z.B. 200 ist, hätt Neu nach 80 Takten und einem Überlauf einen Wert von 24. Die Rechnung 24 - 200 ergibt auf Byte-Ebene aber nicht -176, sondern genau 80 (weil's nach der Null wieder bei 255 anfängt).

    Der langen Rede kurzer Sinn: Lass den Timer ganz ungerührt durchlaufen, lese den Zählerstand bei steigender und fallender Flanke ab, subtrahiere die beiden Werte, und Du hast IMMER die Impulslänge

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2016
    Beiträge
    9
    Hallo Hannes,

    es ist wirklich so, es gibt bei Empfängern große Unterschiede und das teilweise auch bei gleichen Herstellern.
    Wenn man einen Empfänger mit den z. B. typichen 4,8V betreibt, gibt es keine Garantie das an einem Servoausgang auf der Impulsleitung auch 4,8V anliegen.
    Ganz klar, das läßt sich nur mit dem Oszi messen.

    Ich hatte schon Schaltungen aus dem Internet nachgebaut, an einem Servotester haben diese dann funktioniert und an einem Empfänger nicht.
    Seit dem bau ich mir einen Tansistor davor, den bekommt man immer noch unter und es funktioniert zuverlässiger.

    @Daniel

    Ok das mit dem Überlauf hab ich verstanden Ich bin es nur nicht gewohnt, ich programmier in 16 Bit Systemen da findet ein Byte nicht so die Verwendung und mit der Variable WORD läßt sich nur beschränkt rechnen. Und Integers sind vorzeichenbehaftet. Manchmal kann die Lösung doch so einfach sein

    Ich habe bisher nur ganz kleine Sachen selbst gemacht. Wie ist das mit den Interrupts. Ich möchte den Int0 verwenden mehr hat der Tiny eh nicht. Das ist Pin B.1 ok wie genau funktioniert das? Springt der bei jedem Flankenwechsel in die ISR routine und bearbeitet diese genau einmal?
    Also sowohl bei steigender als auch bei fallender Flanke?

    Ich bin übersa Wochenende nicht zuhause und komme mal wieder nicht zum testen.

    Aber könnte das so funktionieren? Wenn die Routine Zaehlung bei Int0 ausgelößt wird.

    Zaehlung:
    If Pinb.1 = 0 Then Signal_alt = Timer0 Else Signal_neu = Timer0
    Return

    Soweit ok den Timer Konfiguriere ich dann auch also nur als "Config Timer0 = Timer ; Prescaler 8"

    Das heißt ich kann dann um ne PWM zu erzeugen einen vergleichswert nehmen, beim erreichen den Ausgang einschalten und wenn der Timer überläuft den Ausgang wieder auf null setzen. Das kommt dann im Endeffekt diesem Fast-PWM Mode ungefähr gleich.

    Da hab ich jetzt ja mal ne paar anhaltspunkte.

    Vielen Dank euch bis hierher schon mal

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.095
    Wie das in Bascom funktioniert weiß ich nicht. Ich würde die normale PWM einstellen (egal welchen PWM Mode), also Prescaler, und die anderen Register für den PWM Mode, den du verwenden willst. Zusätzlich gibst du den Timer Interrupt frei. Dieser wird immer ausgelöst wenn der Timer überläuft (von Zähler max auf 0 springt).


    Wie der Int 0 reagiert musst du einstellen (mit den Registern). Ich müsste nachschauen wie das bei dem uC ist, ich weiß ich nicht. Aber normalerweise kann ma wählen zwischen Flanke steigend, Flanke fallend, Flanke steigend und fallend bzw Pegel high bzw Pegel low.

    MfG Hannes

Ähnliche Themen

  1. LED-Scheinwerfer mit 3.000 Lumen
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 10
    Letzter Beitrag: 18.04.2013, 14:57
  2. Scheinwerfer und Blaulicht
    Von markus788 im Forum Robby RP6
    Antworten: 3
    Letzter Beitrag: 26.10.2012, 16:12
  3. LED- und IR- Scheinwerfer
    Von fabqu im Forum Robby RP6
    Antworten: 18
    Letzter Beitrag: 15.02.2011, 19:43
  4. Dmx RGB Led Scheinwerfer
    Von Maxtronik im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 7
    Letzter Beitrag: 07.06.2010, 22:39
  5. DMX-LED-RGB Scheinwerfer
    Von rideyourstyle im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 5
    Letzter Beitrag: 24.10.2008, 13:55

Berechtigungen

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

Solar Speicher und Akkus Tests