- Labornetzteil AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: Ansteuerung RC LED Scheinwerfer

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Anzeige

    LiFePo4 Akku selber bauen - Video
    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?
    Es gibt ein paar Register mit denen man einstellen kann, ob der Interrupt bei steigender Flanke, fallender Flanke, bei jeder Flanke, einem High-Level oder einem Low-Level ausgelöst wird. Bascom erledigt das Setzen dieser Register, so dass man sie gar nicht im einzelnen kennen muss, sondern nur die richtige (und einfache!) Bascom-Syntax braucht. In der Bascom-Hilfe steht beim Befehl "Config INT0" alles wesentliche.

    Dann muss man noch wissen, dass man Interrupts aus- und einschalten kann, denn mitunter kann es ja mal sein, dass das Hauptprogramm für eine Zeit eben nicht durch Interrupts gestört werden darf. Dieses Aus- und Einschalten geschieht auf zwei Ebenen:
    Erstens muss man jeden einzelnen Interrupt aktiv freigeben, damit er ausgeführt werden kann. in diesem Falle wäre der Befehl Enable INT0.
    Zweitens muss man eine "globale" Aktivierung aller Interrupts vornehmen, und zwar mit dem Befehl Enable Interrupts.
    Nur wenn der einzelne Interrupt freigegeben ist UND die globale Freigabe erfolgt ist, werden Interrupts auch ausgeführt. Sinn dieser doppelten Freigabe-Ebene ist es, die Interrupts sowohl einzeln und gezielt ein- und ausschalten zu können, aber auch mit einem einzigen Befehl (disable Interrupts) global alle Interrupts zu deaktivieren, z.B. wenn der Controller gerade eine zeitkritische Aufgabe abarbeitet, bei der er nicht gestört werden darf.

    Interrupt-Routinen (ISR) sollte so kurz wie möglich sein, um den Ablauf des Hauptprogramms nicht allzusehr aufzuhalten. In Deinem Fall könnte man das Subtrahieren der Werte aber auch gleich mit der fallenden Flanke mit erledigen und dem Hauptprogramm durch setzen eines Flag-Bits singalisieren, dass es eine neu gemessene Pulsdauer gibt. Dein Code war schon nahe dran:

    Code:
    ...
    Dim Signal_alt as Byte
    Dim Signal_neu as Byte
    Dim Flag as Bit
    Dim Impulsdauer as Byte
    
    Config INT0 = change
    On INT0 Flanke
    enable INT0
    Enable Interrupts
    
    Do
    ...
    ...
    
     If Flag = 1 then
      Flag = 0
      ...
      (Schauen, ob der neue Impuls anders war als der zuletzt gemessene)
      ...
     End if
    
    Loop
    
    ISR_Flanke:
     If PINB.1 = 1 then 
      Signal_alt = Timer0
     Else
      Signal_neu = Timer0
      Impulsdauer = Signal_neu - Signal_alt
      Flag = 1
     End if
    Return

    So könntest Du erstmal einen einfachen Code stricken der zunächst einmal nur überprüft, ob sich die Impulslänge nennenswert verändert hat. Wenn dieser Code läuft, könnte man den PWM-Teil dazubasteln!
    Geändert von Sauerbruch (14.03.2016 um 20:53 Uhr)

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2016
    Beiträge
    9
    Also irgendwie komme ich nicht weiter.

    Habe den ganzen Tag rumexperimentiert mit bescheidenem Ergebnis.

    Ich habe jetzt einen Servotester vom Conrad als Empfängerersatz genommen, dieser bringt einen 1 -2 ms Sekunden langen Impuls raus aber nur mit 3 V. Deswegen hab ich wie bereits erwähnt einen kleinen Transistor davor gebaut der mir den PinB.1 auf GND zieht und hab den internen Pullup aktivierten. An PortB.0 hängt eine LED gegen GND.

    Ich habe jetzt folgendes Problem, die LED leuchtet immer schwach. Warum auch immer ist der Ausgang für 1ms an und dann 6ms aus wo das auch immer her kommt. Wenn ich den Servotester verstelle, gibt es irgendwo einen Punkt da wird die LED heller aber flackert manchmal und manchmal auch nicht. Ich kann es nicht nachvollziehen.

    Das hier hab ich jetzt mal zusammen geschrieben:

    $regfile = "attiny13a.dat" 'Attiny 13a
    $crystal = 4800000 'Attiny @ 4,8 Mhz
    $hwstack = 26 'HardwareStack
    $swstack = 20 'SoftwareStack
    $framesize = 10 'Framesize
    '$baud = 4800

    Config Portb.0 = Output 'Schaltausgang für LED an B.0

    Config Pinb.1 = Input 'Anschluss am Empfänger B.2
    Portb.1 = 1 'Pullupwiderstand einschalten

    Config Timer0 = Timer , Prescale = 64 'Timer0 als Timer mit prescaler 64 laufen lassen

    Config Int0 = Change

    Enable Interrupts 'generell Interrupts Zulassen
    Enable Int0 'Int0 freigeben

    On Int0 Zaehlung 'Zaehlung Routine anspringen bei Signalwechsel an Int0

    Dim Signal_alt As Byte 'Variable für die Empfänger Impulsbreite
    Dim Signal_neu As Byte
    Dim Signal As Byte


    Wait 1 'einfach Mal Abwarten

    Do 'Start Hauptschleife

    Signal = Signal_alt - Signal_neu
    If Signal >= 120 Then Portb.0 = 1 Else Portb.0 = 0


    Loop



    Zaehlung:

    If Pinb.0 = 0 Then Signal_alt = Timer0 Else Signal_neu = Timer0

    Return

    Ziel soll erst mal sein die Impulslänge zu messen.

    Eine PWM zu erzeugen hab ich geschafft ist aber hier nicht mehr mit drin, wollte vermeiden das es irgendwie daran liegt.

    Wenn einer eine Idee hat, bin für alles Dankbar

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Ich sehe einen kleinen "Schönheitsfehler":
    Wenn der Impuls beginnt, wird die Variable Signal_alt zwar aktualisiert, aber die Subtraktion in der Hauptschleife wird noch mit dem alten Wert von Signal_neu ausgeführt. Auch wenn dieser Zustand nur 1-2ms lang dauert, kommt in dieser Zeit nichts sinnvolles heraus.
    Mach die Subtraktion doch in der ISR nach dem Impulsende:

    Code:
    Zaehlung:
     If Pinb.0 = 0 then
      signal_alt = timer0
     else
      signal_neu = timer0
      Signal = Signal_neu - Signal_alt
     end if
    Return
    Dann hast Du schon mal immer einen "sauberen" Wert für die Variable Signal.

    Und spannend ist natürlich auch die Frage, ob der Controller auch tatsächlich mit 4,8 MHz läuft! Hast Du das mit den Fusebits korrekt eingestellt?

  4. #14
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    .. Scheinwerfer .. Servosignal auswerten .. LED-PWM .. Tiny 13 .. tiny2313 ..
    Mit nem tiny13 wird man das hinkriegen können. Ich würde trotzdem einen 2313 nehmen; bequem wie ich bin nehme ich die Controller meist zwei Nummern zu groß. Das hilft beim Debuggen per UART-Terminal-Ausgabe, beim Testen und so. Der 2313 hat auch gleich zwei Timer, einen 16bittigen und einen 8 bittigen. Da kann man den 8Bitter für die PWM nehmen und den 16Bitter fürs Dekodieren des Signals.

    Aktuell dekodiere ich das Servosignal per Interrupt durch Pegelerkennung am Pinn; Controller ist bei mir ein mega1284er. Dazu gibts bei allen Atmelcontrollern den Externen Interrupt INTx oder den Pin Change Interrupt PCINTx. Den 16bittigen Timer nehme ich zur Messung des Servopulses: getriggert wird auf any edge, bei steigender Flanke wird der Timer in der ISR auf Null gesetzt (TCNTx = 0), bei fallender Flanke liest die ISR den Timerstand TCNTx aus. Das ergibt ohne Prescaler bei meinem 20Mhz-Takt eine maximal mögliche Messdauer (bis zum Timerüberlauf) von rund 3 ms in einer Auflösung von 0,05 µs !!! so genau/stabil ist das Servosignal garnicht. Bei einem niedrigeren Takt - für Deine Aufgabe wird der interne 8MHz-Takt ausreichend sein bzw. die 9,6 MHz des tiny13; damit ist dann auch die Auflösung eher an die Gegebenheiten Deines Servosignals angepasst. ABER wichtiger Vorteil für Dich wäre bei zwei Timern die Nutzungsmöglichkeit des Timer0 fürs Dimmen der LED.
    Ohne den zweiten Timer könnte man Servopuls-Dekodierung und PWM mit einer etwas trickigen ISR lösen - vermute ich mal.
    Anm.: Ich programmiere in C, kann Dir daher mit Codebeispielen allenfalls in C helfen.
    Ciao sagt der JoeamBerg

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Ohne den zweiten Timer könnte man Servopuls-Dekodierung und PWM mit einer etwas trickigen ISR lösen - vermute ich mal.
    Sooo tricky ist das gar nicht - Timer einfach durchlaufen lassen, bei Impulsbeginn (steigende Flanke) Wert ablesen, bei Impulsende (fallende Flanke) nochmal Zählerstand ablesen, beide Stände voneinander subtrahieren - fertig! Und der durchlaufende Timer kann dann im Fast-PWM-Modus das PWM-Signal erzeugen.

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

    hab mal ein paar Fotos gemacht. Zum einen Vom Ausgang des Servotesters, dann vom Eingang nach meinem Transistor am Int0 (PinB.1) Am Oszi waren je 2V/div und 2ms/div man sieht das am Servotester nur 3V rauskommen weiß halt nicht ob der Tiny das immer als High interpretiert. Deshalb der Transistor. Auf dem Bild vom Int0 sieht man das der Signalpegel 5 V hat aber logicherweise Invertiert ist. Auf dem letzten bild sieht man den Ausgang auf dem die LED angeklemmt ist, dort allerdings mit 5ms/div

    Momentan ist es immer noch so, das ab einer bestimmten Position des Servotesters die LED leuchtet und bei der anderen Seite die LED blinkt wie im Bild zu sehen.

    Das ist der aktuelle Programmcode

    Do

    If Flag = 1 Then Flag = 0
    If Signal >= 160 Then Portb.0 = 1 Else Portb.0 = 0

    Loop

    Zaehlung:

    If Pinb.1 = 1 Then
    Signal_alt = Timer0
    Else
    Signal_neu = Timer0
    Signal = Signal_neu - Signal_alt
    Flag = 1
    End If

    Return

    Bei der Frage ob deriny wirklich mit 4,8 MHz läuft bin ich mir nicht 100% sicher.

    Ausgeliefert wird der Tiny 13 angeblich mit 9,6 und Ckdiv8 aktiv

    CKSEL1..0 Nominal Frequency

    10 = 9.6 MHz
    01 = 4,8 MHz

    so stehts im Handbuch habe die zwei Bits halt einfach getauscht und den Hacken bei Ckdiv8 entfernt.
    Die Fuses sind :

    HighFuse: FF
    LowFuse: 79

    Hoffe mal das stimmt so.

    Gruß
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Ausgang PortB.0.jpg   Ausgang Servotester.jpg   Servoimpulse an Int0.jpg  

  7. #17
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    .. am Servotester nur 3V rauskommen weiß halt nicht ob der Tiny das immer als High interpretiert. Deshalb der Transistor ..
    Solche Fragen lassen sich anhand des Datenblattes bestens und relativ sicher beantworten. In meinem Datenblatt zum tiny13, 8126F–AVR–05/12, steht auf Seite 117 ne Tabelle 18.2 DC Characteristics, in der u.A. diese Werte genannt werden:
    Code:
    ....
                             Min           Max
    Input High Voltage,
    Any Pin as I/O
    VCC = 1.8 - 2.4V        0.7VCC      VCC + 0.5 V
    VCC = 2.4 - 5.5V        0.6VCC      VCC + 0.5 V
    ....
    “Min” means the lowest value where the pin is guaranteed to be read as high.
    SEHR empfehlenswerter Lesestoff.
    Ciao sagt der JoeamBerg

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Das ist ja putzig - das Eingangssignal ist ja vollkommen okay, aber woher kommt dieses Ausgangssignal, dessen Periodendauer ja noch nichtmal ein Vielfaches der Eingangs-Periodendauer ist...?
    Die Fuses scheinen auch richtig zu sein; einen extrem nützlichen Fuse-Calculator gibt´s übrigens hier: http://www.engbedded.com/fusecalc/ (eines meiner meistgenutzten Lesezeichen!). Der gibt für Deine Einstellungen (4,8 MHz, CKDIV8 deaktiviert) genau FF und 79 an.
    Im Zweifelsfall kann man einen ganz einfachen Test machen, ob die bei $crystal angegebene Taktfrequenz tatsächlich stimmt:
    Code:
    Do
    Toggle PORTx.y
    waitms 500
    Loop
    An PORTx.y schließt man ´ne LED an, und wenn $crystal und die tatsächliche Taktfrequenz übereinstimmen, blinkt sie im 1Hz-Takt.

    Aber jetzt müssen wir Dein Problem glaube ich ein wenig einkreisen. Ich würde als erstes überprüfen, ob das Eingangssignal auch tatsächlich dazu führt, dass die ISR ausgeführt wird. Am einfachsten ginge das so:

    Code:
    Zaehlung:
    PORTB.0 = PINB.1
    Return
    Wenn die ISR korrekt angesprungen wird, liegt am PORTB.0 genau Dein Eingangssignal an - das würde das Problem schon einkreisen... probier das doch mal aus und berichte!

  9. #19
    Unregistriert
    Gast
    Zitat Zitat von StephanHD Beitrag anzeigen
    If Flag = 1 Then Flag = 0
    If Signal >= 160 Then Portb.0 = 1 Else Portb.0 = 0
    Was soll hier passieren? Änderung von PORTB.0 nur wenn Flag = 1 ist?

    Dann muß es so sein:
    Code:
    If Flag = 1 Then
      Flag = 0
      If Signal >= 160 Then Portb.0 = 1 Else Portb.0 = 0
    end if
    Lesbarer und angenehmer für die Hilfeleistenden ist es, wenn du Code tags zum Einschließen des Codes nutzt.
    [ CODE] zu Beginn und [ /CODE] zum Ende des Codes ohne die Leerzeichen nach der führenden eckigen Klammer.

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2016
    Beiträge
    9
    Hi,

    Also folgendes hab ich ausprobiert :

    Code:
    Do
    Toggle PORTb.0
    waitms 500
    Loop
    Die Led blinkt im Sekundentakt so wie se soll. Also sollte die Taktfrequenz ja mal stimmen, hätte mich auch gewundert, da ich mit den Vergleichswerten für die "Signal" Variable ja in dem Bereich liege den wir ganz am Anfang mal besprochen hatten.

    Code:
    Zaehlung:
    PORTB.0 = PINB.1
    Return
    Hab ich auch ausprobiert mit dem Oszi gemessen, ist das Ausgangssignal genau gleich dem Eingangssignal an PinB.1

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ä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
  •  

LiFePO4 Speicher Test