- LiTime Speicher und Akkus         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 36

Thema: Machbarkeitsfrage

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Ich find eden Aspekt von radbruch gut, dass die Prüfung der Impulse im Hintergrund liefe.. Verstehe leider nicht genau wie es gemeint ist
    Um das zu verstehen müsstest du dich mal über die Funktion von Timern und Interrupts bei Mikrocontrollern schlau machen.

    Ein Timer zählt im Prinzip die Takte die der Controller ausführt. Mit 8 bit kann man die dezimalen Zahlen von 0 bis 255 abbilden, daher kann ein 8 bit Timer nur bis 255 hochzählen und fängt dann wieder bei 0 an. Wenn der Timer von 255 auf 0 zurückspringt, wird ein sogenannter Interrupt ausgelöst.
    In seinem Programm kann man dann eine Routine definieren die immer von diesem Interrupt aufgerufen wird.

    Egal, was du den Controller sonst noch alles in deinem Programm machen lässt, der Timer zählt immer weiter und die Interrupt-Routine wird automatisch in festen Intervallen aufgerufen.

    Daher spricht man hier auch davon, dass das was du in deiner Interrupt-Routine definiert hast "im Hintergrund" abläuft.

  2. #12
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Ja, es ist schwierig mit Worten zu erklären. Der Timer wird so initialisiert, dass die ISR (interruptserviceroutine) ca. alle 0,01ms (100kHz, bei 8MHz prescaller=/8 und ocr=9)) aufgerufen wird (häufiger oder seltener beeinflußt den Wertebereich/die Auflösung der Positionen). In der ISR macht man dann mit den (Start-)Variablen rc_count=0 und rc_pos=0 und rc_(Eingangs)pin folgendes:

    isr(TIMER0_COMP_vect)
    {
    if (rc_pin) rc_count++; else if (rc_count) { rc_pos=rc_count; rc_count=0; }
    }

    Ab dem ersten Impuls (man könnte nach der Initialisierung kurz warten bis der erste gültige Wert ansteht: while(!rc_pos); ) kann dann das Hauptprogramm mit rc_pos arbeiten. Das basiert übrigens auf dem Servo-Beispielcode im RN-Wissen...

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    20.11.2007
    Beiträge
    26
    ok dann werde ich mal etwas mit timern und iterrupts üben...
    mfg

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    20.11.2007
    Beiträge
    26
    Wenn ich richtig gerechnet habe gitb es wenn es alle 22.5 us unterbrechen soll
    eine Frequenz von 44444.4444 also 8 bit Timer....

  5. #15
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich weiß nicht, wie du auf die 22,5 kommst (es sind wohl ms), aber löse dich davon. Um die Position des Steuerknüppels erkennen zu können ist es nahezu unerheblich in welchem Abstand die Impulse kommen, die Dauer der Impulse ist das Entscheidende. Auch für den Intervall des Timers ist die Impulsdauer uninteressant, er muss nur in regelmäßigen Abständen (das "regelmäßig" wiederrum ist wichtig) den Pin abfragen an dem das RC-Signal anliegt. Je schneller das geschied, umso größer sind die Werte der gemessenen Impulslängen und umso genauer die Position (und umso weniger Zeit bleibt für's Hauptprogramm. Bei 8MHz und 100kHz Timerfrequenz werden Impulslängen von ca. 50-200 gemessen, das passt wunderbar. Es bleiben dann 80 Taktzyklen zwischen den Interrupts minus den Zyklen während des Interrupts für's Hauptprogramm) .

    Die ISR funktioniert so (in Worten, wenn man den Code oben nicht versteht):

    Solange das Signal am Pin low ist(=kein Impuls), passiert nichts. Sobald es nach High wechselt, wird jedesmal wenn die ISR den Pin abfragt ein Zähler erhöht (rc_count im Beispiel oben) und das solange wie der Pegel auf high bleibt. Wenn nun der Pegel am Pin wieder low wird (=Impuls zu Ende) erkennt dies der nächste Aufruf der ISR. Nun hat der Zähler einen Wert (if (rc_count)...) der der Impulsdauer entspricht (abhängig vom Intervall des Timers). Dieser Wert wird gespeichert (rc_pos) und der Zähler gelöscht. Ab jetzt "warten" wir wieder bis die ISR den Start des nächsten Impuls erkennt.

    Da in rc_pos immer die zuletzt gemessene Impulslänge gespeichert ist, kann man diesen Wert dann im Hauptprogramm auswerten. Bei meiner Fernbedienung sind die Mitte-Werte ca. 130 (Gesamtbereich 90-170). Ob das an meinem Code oder an der Fernbedienung liegt kann ich noch nicht sagen, ist aber unerheblich, wenn man die Werte kennt.

    Vielleicht noch ein Versuch die Funktion der ISR zu veranschaulichen:

    Ein Lattenzaun hat einige Lücken, wieviele Bretter fehlen jeweils in den Lücken(=Impulsdauer)?. Mit geschlossenen Augen laufen wir im Tangoschritt(=Hauptprogramm) am Zaun entlang und klopfen (=wir sind die ISR) gleichmaßig schnell (=Timerintervall) gegen den Zaun (=fragen den Pin ab). Sobald wir das erste Mal in eine Lücke hauen(=Impulsstart), beginnen wir zu zählen(=rc_count) wie oft wir ins Leere hauen. Wir tanzen, klopfen und zählen weiter, bis wir wieder auf eine Latten treffen(=Impulsende). Viele fehlende Latten(=lange Impulse) ergeben hohe Zählwerte, wenige fehlende Latte ergeben niedrige Zählwerte.

    Wenn wir schneller klopfen erhöhen sich alle Zählwerte(=höhere Timerfrequenz), klopfen wir langsamer, werden die Werte kleiner(=kleinere Timerfrequenz). Wenn wir zu langsam klopfen, könnten wir eine Lücke überspringen, wenn wir zu schnell klopfen, werden wir stolpern, weil wir keine Zeit mehr haben, mit den Beinen Tango zu tanzen.

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Ich hätt´ noch einen ganz anderen Ansatz zum Nachdenken anzubieten, der bei mir in einer Modellbau-Anwendung tadellos funktioniert:

    Du generiertst mit dem Timer-Interrupt nicht ein Zeit-Raster, in dem der Eingangspin abgefragt wird, sondern Du lässt bei jeder steigenden Flanke auf dem Eingangspin einen Timer starten, und bei der fallenden Flanke wieder stoppen. Nach jedem Stoppen weist Du den gemessenen Timer-Stand einer Variablen zu (Impulslänge), die Du als Array anlegst und durchzählen lässt.
    Die Timer-Dimensionierung sollte so ergfolgen, dass der Timer bei Positiv-Impulsdauern über 5ms überläuft. Dadurch kannst Du am Timer-Interrupt den (30ms-) Synchronisationsimpuls erkennen, denn "normale" Steuerimpulse sind eigentlich nie länger als 2,5ms.
    Mit 3,6864 MHz und Prescale=1 läuft der 16-Bit-Timer z.B. nach ca. 18ms über - ein idealer Wert!

    Code:
    $Crystal=3686400
    
    Dim Impuls(3) as Word
    Dim N as Byte
    N=1
    
    Config timer1=Timer, prescale = 1
    on timer1 Synchronisationsimpuls   'ISR bei Timer-Overflow
    Enable timer1
    
    Config IntX = Change
    On IntX Flanke   'ISR bei Flankenwechsel
    Enable IntX
    Enable Interrupts
    
    
    Do
    ...
    Loop  'Hier läuft Dein Hauptprogramm
    
    
    Flanke:
    If PinX.Y = 1 then '(PinX.Y = der Interrupt-Pin!)
      start timer1
    Else
      Stop timer1
      Impulsdauer(N) = Timer1
      N=N+1
      Timer1=0
    End if
    Return
    
    Synchronisationsimpuls:
    N=1
    return

    ...nur so als Beispiel
    Dein gesamtes Programm kann unbeeinträchtigt weiterlaufen. Die Flanken starten und stoppen den Zähl-Timer, und wenn er überläuft war der Impuls länger als 18ms, so dass die Zählvariable N einfach nur auf 1 zurückgesetzt werden muss.

  7. #17
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich hätt´ noch einen ganz anderen Ansatz zum Nachdenken anzubieten
    Das würde ich ablehnen, weil für jeden RC-Eingangskanal ein Timer belegt werden muss. Oder sehe ich das falsch?

    Was mir sehr gut gefällt ist die schlanke Formulierung des Codes. Ich kenne Bascom nicht, dachte aber, der Zugriff auf Interrupts und Timer wäre komplizierter.

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    weil für jeden RC-Eingangskanal ein Timer belegt werden muss. Oder sehe ich das falsch?
    Ich glaube, schon
    Zumindestens komt dieser Code mit genau einem Timer aus, wenn man die einzelnen Impulse nacheinander als ein einzige serielles Signal verbindet, was ja z.B. durch oder-Verknüpfen mit Dioden ein leichtes ist.

    Über einen Eingangspin gehen alle Impulse nacheinander seriell rein, und bei jeder Low-Phase dazwischen wird der Zähler "N" eins weitergestellt.

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    20.11.2007
    Beiträge
    26
    @ Sauerbruch in deiner Lösung kämen alle Signal Kabel auf einem PIN sehe ich das richtig ? Wäre sicher praktisch da dann nnoch viele frei bleiben mfg

  10. #20
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Zumindestens komt dieser Code mit genau einem Timer aus, wenn man die einzelnen Impulse nacheinander als ein einzige serielles Signal verbindet, was ja z.B. durch oder-Verknüpfen mit Dioden ein leichtes ist.
    Ich glaube, wenn man das Signal an der richtigen Stelle am Empfänger abgreift, kann man sich das sparen, da es eigentlich schon ein serielles Signal ist.
    Dieses serielle Signal wird dann im Empfänger für die verschiedenen Servo-Kanäle aufgesplittet und auf die Stecker nach aussen verteilt.

    D.h. man muss eigentlich nur den richtigen Kontakt finden um das gesamte Signal abzugreifen und dabei kann eine Suche hier im Forum oder auch über Google sicherlich behilflich sein.

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test