Software-Schnipsel Sammelthread

  • Es wird hier im Forum ja immer wieder nach bestimmten Sachen gefragt, z.B. wie funktioniert ne SW-PWM, HSV-zu-RGB-Umrechnung, DMX-Empfang, Fernbedienung auswerten, etc.


    oft werden dann irgendwo in nem Thread SW-Schnipsel gepostet, die dort natürlich irgendwann wieder "verloren gehen", weil keiner mehr weiß, in welchem Zusammenhang was wo gepostet wurde.


    Daher dieser Thread, darin sollen solche Codes/Routinen gesammelt werden, damit man sie schneller wieder findet.


    Bitte diesen Thread "sauber" halten, keine Fragen zu SW oder geposteten Routinen, wenn die Beschreibung nicht ausführlich genug ist, dann den Ersteller des jeweiligen Posts per PN fragen, dieser soll dann ggfs. noch weitere Infos ergänzen - aber nur spezifische Dinge, bitte niemanden per PN mit Grundlagenfragen nerven, wie man Bascom installiert o.ä. - Spam in diesem Thread wird ohne Benachrichtigung gelöscht.


    Wer hier nen Code postet, sollte bitte gleich im Titel (per Abkürzung [ C] [asm] oder [Bascom]) nennen, in welcher Sprache der Code vorliegt - sowie dann den Code ausführlich genug erläutern, was er wie macht, bei asm z.B. auch, welche Register benutzt werden etc. - dies kann im Thread, oder ideal gleich direkt im Quelltext erfolgen.


    kurze Schnipsel kann man direkt in den Thread stellen (mit den "Code"-Tags), längere Teile dann bitte als .zip - ich habe den Thread abonniert, bekomme also neue Posts mit und füge die dann in's Inhaltsverzeichnis ein.


    Inhaltsverzeichnis:


    Links zu anderen Seiten:

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

    3 Mal editiert, zuletzt von Pesi ()

  • Hier verschiedene Routinen, um Farben aus dem HSV-Farbraum nach RGB umzurechnen.


    Der Code stammt von Neni (User "synvox"), bereits hier im Forum veröffentlicht. Dort, sowie in den nachfolgenden Posts gibt es noch weitere Infos zu den Umrechnungen.


    Die Berechnungen sind so gemacht, dass durch geschicktes Anpassen der Konstanten keine Division, ausser durch 256, nötig ist, diese kann einfach durch verschieben um 8 Bit nach rechts durchgeführt werden. Dadurch brauchen die Routinen wenig Rechenleistung, und lassen sich auch ganz einfach nach C und Assembler portieren.


    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

    2 Mal editiert, zuletzt von Pesi ()

  • Hallo Forum, hab mir gerade für meine Matrix nen kleinen Plasmaeffekt ähnlich wie in Glediator erstellt.
    Möchte natürlich nicht immer den PC dafür anhaben.


    Infos dazu gibts hier:


    http://lodev.org/cgtutor/plasma.html



    Natürlich sind Fließkommazahlen und sinus Funktionen ganz schön harter Stoff für so nen kleines 8 Bit Rechenwerk.


    Habe mir auch mal den Sourcecode von Glediator angeschaut, aber zwei Sinusfunktionen pro Pixel und noch eine pro Line lassen die Performance auch schnell sinken... :(


    Komme mit dem Source von Pepe auf ca. 6 Bilder die Sekunde bei 24 MHz und ohne Prozessorlast um die Daten in die Matrix zu schauffeln, was bei ATMegas noch dazu kommt.


    Also gibts jetzt stat Fließkommazahlen, ganze Zahlen und für die Sinusfunktion gibts ne LUT im Flash. Der Farbraum liegt auch im Flash wie die Gammakorrektur...


    Letztendlich Schupst man ein paar Bits und schaut nur noch in den Tabellen nach den richtigen Werten...
    Wie schnell das jetzt auf dem 24 MHz 8 Bitter läuft habe ich nicht gemessen. Aber irgendwas über 100 Bilder die Sekunde, denn ich seh die LED nicht mehr toggeln ;)


    Hier nun die Funktion:



    Kann natürlich nach belieben angepasst werden, einfach die Funktionen in Temp1 bis 4 verändern...


    Die Sinus_LUT und den Farbraum hänge ich mal als Datei an... die gamma LUT sollte klar sein und die mapper lookup table ist für die Anordnung meiner Matrixpixel zuständig. Das hängt ja dann auch von euch ab...



    Ich poste das hier, weil ich noch keinen "schnellen" Source für 8 Bit Mirkrokontroller im Netz gefunden habe, aber vielleicht gibts auch schon was?!



    Viel Spaß damit


    Grüße


    Basti


    EDIT Pesi: Fragen etc. zu diesem Code bitte dort posten, danke!

  • Hier ein Programm zur Ansteuerung von WS2801-Pixel per DMX



    Das Programm sollte nach Anpassen von $regfile auf allen Atmega's mit 16Mhz Quartz und mindestens 1KB Ram laufen (getestet mit Atmega328P)


    Viel Spaß bei ausprobieren


    Andreas

  • $regfile = "m16def.dat"
    $crystal = 15000000
    $baud = 115200


    $hwstack = 40
    $swstack = 40
    $framesize = 40


    'Timer0 konfigurieren
    '150000000 (Systemtakt) / 64 (Prescaler) = 234375 (Counts)
    Config Timer1 = Timer , Prescale = 64
    'Soft-SPI konfigurieren
    Config Spi = Soft , Din = Portd.3 , Dout = Portd.4 , Ss = None , Clock = Portd.5
    Spiinit


    'LED1 an PD.6
    Led1 Alias Portd.6
    Config Led1 = Output
    Led1 = 0


    'SCHALTER1 an PA0
    Schalter1 Alias Pina.0
    Config Schalter1 = Input
    Porta.0 = 1 'PullUp-Widerstand einschalten


    'SCHALTER2 an PA1
    Schalter2 Alias Pina.1
    Config Schalter2 = Input
    Porta.1 = 1 'PullUp-Widerstand einschalten


    'SCHALTER3 an PA2
    Schalter3 Alias Pina.2
    Config Schalter3 = Input
    Porta.2 = 1 'PullUp-Widerstand einschalten


    'SCHALTER4 an PA3
    Schalter4 Alias Pina.3
    Config Schalter4 = Input
    Porta.3 = 1 'PullUp-Widerstand einschalten


    'SCHALTER5 an PA4
    Schalter5 Alias Pina.4
    Config Schalter5 = Input
    Porta.4 = 1 'PullUp-Widerstand einschalten


    'SCHALTER6 an PA5
    Schalter6 Alias Pina.5
    Config Schalter6 = Input
    Porta.5 = 1 'PullUp-Widerstand einschalten


    'SCHALTER7 an PA6
    Schalter7 Alias Pina.6
    Config Schalter7 = Input
    Porta.6 = 1 'PullUp-Widerstand einschalten


    'SCHALTER8 an PA7
    Schalter8 Alias Pina.7
    Config Schalter8 = Input
    Porta.7 = 1 'PullUp-Widerstand einschalten
    'Dip Schalter für Pixelmengenangabe




    Dim Zaehler As Integer ' Zähler für Wertmenge zur Ausgabe von Startpunkt zu Startpunkt
    Dim Rgb(450) As Byte ' Werte für jede Farbe R-G-B * 150 LEDs
    Dim Startpunkt As Bit ' Startpunktdefinition wenn Wert 1 gefunden wurde wird Bit gesetzt
    Dim Zwischenwert As Byte ' Zwischenwert Variable die jeden durch URD übertragenen Wert annimmt
    Dim Zwischenzaehler As Byte 'Togglebit Setzen resetzen von 1 zu 1
    Dim Startausgabe As Byte
    Dim Takt As Bit
    Dim X As Byte
    Dim Test As Byte
    Dim Aktiv As Bit
    Dim Pixelmenge As Integer
    Dim Überlauf As Integer


    Aktiv = 0
    Startpunkt = 0
    Zwischenzaehler = 0
    Zaehler = 0
    Überlauf = 0





    'Interupts definieren und Einschalten
    On Urxc Onrxd 'Interupt für RS232 Schnittstelle
    Enable Urxc 'Einschalten Interupt RS232


    On Ovf1 On_ovf1
    Enable Ovf1 'Timer0 Overflow Interrupt 'Dieser Interrupt wird beim Überlauf (255 nach 0) ausgelöst
    '234375 (Counts) / 65535 (16-Bit Timer) = 3,576 (Interrupts die Sekunde)
    Enable Interrupts 'Einschalten Interupts gesamt


    Led1 = 1
    Gosub Pixelmengenrechner 'Ermitteln wieviele Lampen eingestellt sind
    Gosub Starten 'Einsprung zum löschen aller Werte der Lampen beim Einschalten


    Do






    If Takt = 1 Then
    If Zwischenwert = 1 Then Startpunkt = 1


    If Startpunkt = 1 And Zwischenwert <> 1 Then
    Incr Zaehler
    Rgb(zaehler) = Zwischenwert
    If Zaehler = Pixelmenge Then Gosub Ausgabe
    End If


    Takt = 0
    End If



    Loop
    End



    Onrxd: 'RS 232 Empfang verarbeiten
    Zwischenwert = Udr
    Takt = 1
    Überlauf = 1


    Return




    Ausgabe:
    If Zaehler <= 255 Then
    Spiout Rgb(1) , Zaehler
    Startpunkt = 0
    Zaehler = 0
    Else
    Spiout Rgb(1) , 255
    Spiout Rgb(256) , Zaehler
    Startpunkt = 0
    Zaehler = 0
    End If
    Return


    Starten: ' Unterprogramm um alle LEDs beim Start von 155 nach 0 zu löschen
    For X = 155 To 0 Step -1 ' hierbei wird ermittelt ob die Einzelnen LEDs Farbtechnisch OK sind
    Waitms 4
    For Zaehler = 1 To Pixelmenge
    Rgb(zaehler) = X
    Next Zaehler


    If Pixelmenge =< 255 Then
    Spiout Rgb(1) , Pixelmenge
    Else
    Spiout Rgb(1) , 255
    Spiout Rgb(256) , Pixelmenge
    End If
    Next X
    Startpunkt = 0
    Zwischenzaehler = 0
    Zaehler = 0


    Return



    'Anhand der Dip Schalter einstellen wieviele Pixel am Bus hängen
    Pixelmengenrechner:
    Pixelmenge = 255


    If Schalter1 = 0 Then Pixelmenge = Pixelmenge -1
    If Schalter2 = 0 Then Pixelmenge = Pixelmenge -2
    If Schalter3 = 0 Then Pixelmenge = Pixelmenge -4
    If Schalter4 = 0 Then Pixelmenge = Pixelmenge -8
    If Schalter5 = 0 Then Pixelmenge = Pixelmenge -16
    If Schalter6 = 0 Then Pixelmenge = Pixelmenge -32
    If Schalter7 = 0 Then Pixelmenge = Pixelmenge -64
    If Schalter8 = 0 Then Pixelmenge = Pixelmenge -128


    Pixelmenge = Pixelmenge * 3


    'Print "Ausgabe Kanäle R-G-B :" ; Pixelmenge
    Waitms 20


    Return




    'Timer0 Overflow Interrupt
    On_ovf1:
    Incr Überlauf
    If Überlauf => 8 Then Goto Starten


    Print Überlauf


    Return