LGT8F328p - ein Nachbau vom ATMega328P oder sogar besser?

  • Es gibt einen Nachbau des Atmega328P, den LGT8F328p. Doch ist das wirklich ein Nachbau? Ich würde sagen, jain.

    Ich habe ihn mal getestet, dazu habe ich mir 2 Nano Varianten und einen Einzelchip zuschicken lassen.

    Variante 1 ist mit externen Oszillator auf dem Board, wie der normale Nano. Statt des CH340G oder FT232 hat das Modul einen HT42B534 zur USB-Kommunikation. Zumindest im Windows stellte das kein Problem dar, es wurde unbemerkt im Hintergrund innerhalb von 5 Sekunden installiert. Auch die Arduino IDE hatte kein Problem damit.

    Variante 2 arbeitet mit dem internen Oszillator, welcher im Lieferzustand auf 32 MHz eingestellt ist. Hier ist ein CH340 drauf, also auch kein Problem.

    Um ihn zu verwenden, muss das Board in der IDE installiert werden. Ich habe dieses verwendet:

    GitHub - dbuezas/lgt8fx: Board Package for Logic Green LGT8F328P LGT8F328D and LGT8F88D
    Board Package for Logic Green LGT8F328P LGT8F328D and LGT8F88D - dbuezas/lgt8fx
    github.com

    Dort steht auch, wie man es installiert.

    Die meisten Sketche können 1:1 oder mit wenigen Änderungen übernommen werden. Die Nano's sind pinkompatibel. Das Erstaunliche, ich habe mal mit dem Blink Sketch angefangen und beim hochladen vergessen, den LGT8F328p einzustellen. Die Einstellungen waren noch auf dem Nano, trotzdem wurde es hochgeladen und funktionierte. Das war eine echte Überraschung.

    void setup() {
      pinMode(LED_BUILTIN, OUTPUT);
    }

    void loop() {
      digitalWrite(LED_BUILTIN, HIGH);
      delay(1000);
      digitalWrite(LED_BUILTIN, LOW);
      delay(1000);
    }

    Doch nun zu den größten Unterschieden. Der Chip selber kann mit bis zu 32 MHz betrieben werden (ATMega nur 20 MHz). Er funktioniert schon mit 1,8 Volt - und das auch bei 32 MHz! Der ATMega kann die 16 MHz erst ab 4,5 Volt, bei 1,8 Volt maximal 4 MHz. Wie ich so bin, habe ich den LGT8F328p mal übertaktet. Mit 40 MHz und 3 Volt gab es keine Probleme.

    Der A/D Wandler kann auf 11 oder 12 Bit erhöht werden, beim ATMega sind es nur 10 Bit. Es sind sogar Differenzmessungen möglich.

    Es gibt 3 interne Referenzspannungen - 1,024 Volt, 2,048 Volt und 4,096 Volt, der ATMega hat nur 1.1 Volt. Im Gegensatz zum ATMega musste die Spannung nicht kalibriert werden, sie stimmte auf den beiden Modulen und dem Einzelchip absolut genau.

    Nun meine Dinge, warum ich den Chip jetzt verwende. Die Boards sind schon für 99 Cent bei Aliexpress erhältlich. Wie beim ATMega gibt es auch eine Version als Nano, Mini, Uno oder andere.

    Sie haben neben PWM auch einen echten Analogausgang. Wenn ich zum Beispiel eine Sinuswelle erzeugen will, muss ich im Anschluss nicht viel filtern. Ich kann auch einfach eine beliebige Gleichspannung ausgeben.

    Es gibt einen Hochstromausgang (muss im Sketch aktiviert werden), der liefert 80 mA. Da kann man schon ein ordentliches Relais (mit Freilaufdiode) anklemmen.

    Der LGT8F328p hat einen 16 Bit Timer mehr, die Frequenz beträgt bis zu 64 MHz, beim ATMega nur 20 MHz. Somit ist er nicht nur schneller, beim runterteilen lassen sich auch krumme Frequenzen genauer einstellen.

    Doch es gibt auch einen ganz großen Nachteil, der LGT8F328p hat keinen EEPROM. Dieser kann zwar simuliert werden, dann geht es aber vom Speicherplatz des Flash ab. Das wäre nicht so schlimm, man beachte aber, dass sich ein Flash nur ca. 10000 mal beschreiben lässt (EEPROM mehr als 100000 mal). Hier sollte man also nicht zu oft Informationen schreiben. Die Nutzung eines externen SPI EEPROM wäre die bessere Lösung.

    Hier mal einige Bilder des Analogausgangs ohne irgendwelche Filterung mit 25 Hz, 1 kHz und 1 MHz. Erstaunlich, oder?

    Fazit: Für die meisten Schaltungen werde ich jetzt den LGT8F328p benutzen.

    Liebe Grüße,
    der Jens wars gewesen...

    --------------------------------------------------------------
    Die Wege der Elektronen sind unergründlich.

  • Ich wurde nach dem Script dür den Sinus gefragt. Dies reiche ich nun nach.

    Ich programmiere immer etwas minimalistisch, aber bei dem kleinen Script sollte es für alle noch lesbar sein. Der Sinus wird nebenbei als Interrupt erzeugt.
    Erst wird ein Array berechnet, welches mit dem jeweiligen Wert des Winkels beschrieben wird. Man könnte das auch in Echtzeit machen und sich das Array sparen. Dabei geht allerdings im normalen Betrieb viel Rechenzeit drauf. Bei einem Megahertz ist er eigentlich nur noch damit beschäftigt. Darum die Lösung mit dem Array.
    Nun setzen wir den Timer, das Beispiel ist für die 25 Hertz. Wir geben 25 mal pro Sekunde 360 Werte Werte raus. Der Timer muss also auf 9000 Hz berechnet werden. Das bekommen wir fast genau hin, möglich ist 9009.009009009009 Hz.

    Im Script steht analogReference(DEFAULT);
    Das bedeutet, dass der maximale Wert VCC entspricht. Es gehen weitere Varianten:
    analogReference(EXTERNAL); > externe Referenzspannung
    analogReference(INTERNAL1V024); > interne Referenz 1,024 Volt
    analogReference(INTERNAL2V048); > interne Referenz 2,048 Volt
    analogReference(INTERNAL4V096); > interne Referenz 4,096 Volt
    Die internen Referenzspannungen sind sehr genau, man erhält auch bei Schwankungen an VCC die gleiche Amplitute.

    Bei Fragen einfach fragen.

    Liebe Grüße,
    der Jens wars gewesen...

    --------------------------------------------------------------
    Die Wege der Elektronen sind unergründlich.

  • Danke für den Hinweis zum Clone Jens!

    Wieviele Stützpunkte aus der Sinus-LUT nimmst du für das 1MHz Beispiel? Ich sehe zwar eindeutig ein paar Abstufungen im 1-MHz Signal welche wohl die Punkte aus der Tabelle sind, kann aber wirklich nur schätzen.

    Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
    Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")

  • 64 Punkte, mehr geht leider nicht. Das ist das maximale bei einem Prozessortakt von 32 MHz. Die Flanken der Ausgänge sind bei dieser Geschwindigkeit nicht so steil, sodass es schon ganz gut aussieht.

    Liebe Grüße,
    der Jens wars gewesen...

    --------------------------------------------------------------
    Die Wege der Elektronen sind unergründlich.

  • 64 Stützpunkte aus der LUT für eine Periode? Ich hätte auf viel weniger getippt, wenn ich das Bild vergrößert sehe. Habe mal ein paar mir(!) auffällige Stellen mit ROT markiert, wo ich gesagt hätte, ja hier nimmt er wieder einen Punkt, der Rest ist durch die Schaltung "interpoliert" und bei dem Minima GRÜN sprint er über den Minimalpunkt in der LUT weg.

    Erstes abgebildete Minimum gut mit Stützpunkten getroffen! Zweite Minimum Stützpunkte vor dem LUT-Minimum und dahinter, deshalb ein "geclippter" Sinus, beim dritten Minimum noch etwas weiter danaben und dann, was nicht abgebildet wird, fängt er sich wieder bzw. springt dann im Maxima über den LUT-Max-Wert. Und so weiter und so weiter, was aber normal ist, wenn die Schrittweite nicht ganzzahlig durch die Anzahl der LUT-Werte teilbar ist.

    Was ich mich allerdings Frage, der Timer kann mit 2xQuarzfrequenz takten, wie sieht es mit dem Rechenwerk aus, ist da auch ein Multiplier davor?

    Bei 25 Hz: Alle 360 LUT-Werte (eine Periode) 25 mal die Sekunde = 360*25 = 9000 Hz, hast Du ja geschrieben. Also 9000x die ISR pro Sekunde, da bleibt viel Spielraum.

    Bei 1 MHz: 64 LUT-Werte pro Periode, 1.000.000 mal die Sekunde = 64.000.000 Hz (64MHz), also wird die ISR 64 Mio mal pro Sekunde angesprungen. Wie arbeitet das Rechenwerk mit 32 MHz Takt denn jedesmal die ISRs ab?

    64 Mio mal die Sekunde:

    - Kontextwechsel (Register sichern) ,

    - in die ISR springen, andere ISR Blockieren,

    - LUT-Wert laden und in DAC Register schreiben,

    - Inkrementieren zum nächsten LUT-Wert

    - Prüfen auf Indexüberlauf

    - andere ISR Freigeben

    - Kontextwechel zurück (gespeichere Register wieder zurück schreiben)


    und das auf einem 32 MHz getakteten Rechenwerk? Wenn jeder Schritt nur ein Takt braucht ist das doch schon zu viel, es müsste alles zusammen aber nur 0.5 Takte brauchen. Zauberrei oder habe ich was übersehen?

    Oder meinest Du eher eine Schrittweite von 64 durch die 360 Grad LUT? Das wären dann nur 5,625 Stützpunkte, also fast 6, aber dafür sieht die Sinus nun wieder fast zu gut aus.

    Wie gesagt, der Rest nach dem Komma sorgt sowieso für ein periodisches immer wiederkehrendes Überspringen der Min/Max-Werte der LUT, aber rechnerisch wird dann halt nur 5625000 mal pro Sekunde die ISR aufgerufen, wenn die Schrittweite 64 ist. Das wiederum ist für ein 32 MHz Rechenwerk nicht so sehr eine Zauberrei, auch wenn das Signal dann eher schei** ausieht.

    Allerdings wenn der Controller schon für einen Sprung in die ISR, also bis zur ISR-execution 4 Takte benötigt (also noch nichtmal ein Return from Interrupt mitgerechnet, auch nicht das was eigentlich gemacht werden soll, schon gar nicht mit Arduino-Libs) bedeutet das, dass hier nur für den Sprung schon 22.500.000 Takte flöten gehen, bei 32.000.000 gesamt!

    Aber 64 MHz ISR auf 32 MHz Rechenwerk?

    Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
    Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")

    Edited once, last by Bernhard45 (April 27, 2025 at 9:36 PM).

  • Hallo Jens,

    vielen Dank für diesen interessanten Tip! Ich werde dann mal ein paar bestellen!

    Viele Grüße
    Semir

    "Alle sagten: Das geht nicht. Dann kam einer der wusste das nicht, und hat es gemacht."
    (Prof. Hilbert Meyer, Uni Oldenburg)

    "Those who would give up essential Liberty, to purchase a little temporary Safety, deserve neither Liberty nor Safety."
    (Benjamin Franklin)

  • Soo...gerade einige bestellt :)

    Viele Grüße
    Semir

    "Alle sagten: Das geht nicht. Dann kam einer der wusste das nicht, und hat es gemacht."
    (Prof. Hilbert Meyer, Uni Oldenburg)

    "Those who would give up essential Liberty, to purchase a little temporary Safety, deserve neither Liberty nor Safety."
    (Benjamin Franklin)

  • Jens meint, alle 5,625 Grad ein Stützpunkt, also eine 64 Elemente lange Tabelle.

    Dies sind dann die Sinuswerte um das Minimum herum:

    Winkel in °Sinuswertint(Sinuswert)
    258.7500003.4402693
    264.3750001.6115401
    270.0000001.0000001
    275.6250001.6115401
    281.2500003.4402693

    In der Arduino-Referenz steht, daß die int()-Funktion den Datentyp wie in C konvertiert; also rundet sie ab. Daher haben wir dreimal hintereinander die 1 stehen, die - so vermute ich - für die Abplattung sorgt.

    Nimmt man nur 48 statt 64 Stützpunkte, so ist die Abplattung weg:

    Winkel in °Sinuswertint(Sinuswert)
    255.0000005.3274205
    262.5000002.0865032
    270.0000001.0000001
    277.5000002.0865032
    285.0000005.3274205

    Gruß, Frank

    Keiner von uns kommt lebend hier raus. Also spart nicht alles für später auf. Eßt leckeres Essen. Spaziert in der Sonne. Springt ins Meer. Sagt die Wahrheit und tragt euer Herz auf der Zunge. Seid albern. Seid freundlich. Seid komisch. Bastelt mit Radios. Für nichts anderes ist Zeit.

  • Die 1 MHz sind ein Beispiel, ich würde es nicht machen, da der Prozessor damit an seine Grenzen stößt. Tatsächlich arbeitet der Timer mit doppelter Prozessorgeschwindigkeit, also 64 MHz und setzt 64 Punkte pro Periode. In wieweit er jeden Punkt richtig setzt oder ob er welche überspringt, wovon auszugehen ist, kann ich nicht sagen. Dass das Endergebnis nicht perfekt werden kann, ist ja logisch. Trotzdem sieht die Kurve für diese Umstände sehr gut aus, das ist der Kernpunkt. Die 25 Hz oder 1 kHz sind allerdings perfekt mit 360 Punkten pro Periode.

    Liebe Grüße,
    der Jens wars gewesen...

    --------------------------------------------------------------
    Die Wege der Elektronen sind unergründlich.

  • Nimmt man nur 48 statt 64 Stützpunkte, so ist die Abplattung weg...

    Auch ein guter Hinweis für andere Projekte, danke. Aber wie oben beschrieben, wollte ich nur mal die Grenzen testen. 48 Punkte gehen allerdings nicht, da man den Timer nicht entsprechend setzen kann.

    Liebe Grüße,
    der Jens wars gewesen...

    --------------------------------------------------------------
    Die Wege der Elektronen sind unergründlich.

  • Ja Frank, genauso habe ich das auch aufgefasst, 64er LUT, jeder Step also 5,625 Grad. Nach seinen Oszibild für die 1 MHz hätte ich auf viel weniger Punkte geschätzt.

    Wenn man die LUT wirklich als [0..63] aufbaut, bekommt man beim Zeigerumlauf auch immer den gleichen Phasenjitter, allerdings müssten dann die Minima auch immer gleich aussehen! Das erste Minima ist aber gut getroffen, dann scheint sich der Fehler zunächst nur zu addieren und wahrscheinlich später wieder zu minimieren bzw. aufs Maxima zu wechseln. Daher rate ich mal, wenn das keine Messfehler sind, im Quellcode ist immer noch die 360 Grad LUT drin und es wird nur in anderer Schrittweite drübergegangen, sodaß man um die "ungünstigen" Stellen indexmäßig schwebend ist. Das konnte, das Bild erklären.

    157768-20250426-201720-jpg

    Wenn Jens zusätzlich den Codeteil auch für die 1 MHz nimmt if(deg>359){deg=0;} müsste man eigentlich nach einer Periode immer einen größeren Phasensprung sehen, das ist aber nicht der Fall, also wird er das mit einer angepasst großen LUT machen, nur das erklärt wieder nicht die gleitende Veränderung des Extremas.

    So oder so bleibt aber das Problem der Berechenbarkeit! Bisher konnte ich nur finden, daß man zwar den Timer mit 2xOszillatorfrequenz, also 64 MHz betreiben kann, das Rechenwerk aber direkt die 32 MHz bekommt und keine Vervielfachung/PLL davor ist, die einen höheren Takt ableitet, so wie das größere Controller haben.

    Bei 64 Punkten/Signalperiode muss also bei 1 MHz auch jeder Timertick genutzt werden um durch die LUT zu schreiten, Wert auf DAC zu schreiben. Also 64 Mio mal ein Interrupt nach seinen oben gemachten Angaben. Bloß die Doku sagt zum Interrupt

    making any interrupts available in the four system clock cycles
    response. After four system clock cycles, the interrupt service routine enters the execution cycle.

    Also 4 Takte zum reinspringen und nach dem Instruction Set des Prozessors kommen nochmal für den Rückkehrbefehl RETI 2 clock cycles hinzu. Wir sind also schon bei 6 Takten pro Interrupt und haben in der Interrupt Service Routine noch gar nichts gemacht.

    6 cycles * 64 MHz = 384 Mio cycles/Sekunde, ein bisschen viel für ein 32 MHz getaktetes Rechenwerk. Es kommen ja noch pro Interrupt nach seinem Codevorbild mindestens je 1 Takt für SEI und CLI hinzu, dann Werte aus LUT holen und mit einer Arduinoimplementierung von analogWrite schreiben, Indexüberlauf prüfen. Das macht sicher nochmal mehr cylces nötig als eine direkte Assemblerimplementierung dieser Aufgabe. Aber es reicht ja rechnerisch schon nichtmal für rein in Interrupt/raus aus Interrupt.

    Bei 48 Stützpunkten Frank, wären immer noch 288 MHz nötig nur für rein / raus aus dem Interrupt. Und selbst wenn Jens es so gemeint hat, wie ich oben im Fall 2, also in 64er Schritten durch eine 360er LUT, also nur 5,625 Stützpunkte pro Signalperiode sind es immer noch bei 1 MHz nur für Sprung in die Interrupt Service Routine und zurück 22.500.000 Takte die von 32.000.000 Takten abgezogen werden müssen. Wenn jetzt noch SEI und CLI dazukommen, dann die eigentliche Ausgabe... Das wird nichts auf einem 32 MHz core, wenn der ohne PLL direkt getaktet ist.

    Also entweder ist da ein Rechenwerk aus Feenstaub drin, ein gefakter Prozessor der in Wirklichkeit ein STM32.... mit Taktvervielfältigung des Quarzes ist, oder ich weiß es nicht. Sowas wie ein dediziertes Rechenwerk nur für I/O wie diese PIO State Machines eines RP2040 gibt es ja auch nicht, DMA hat er auch nicht oder habe ich die falsche Dokus zum LGT8F328 erwischt?


    Die 1 MHz sind ein Beispiel, ich würde es nicht machen, da der Prozessor damit an seine Grenzen stößt. Tatsächlich arbeitet der Timer mit doppelter Prozessorgeschwindigkeit, also 64 MHz und setzt 64 Punkte pro Periode. In wieweit er jeden Punkt richtig setzt oder ob er welche überspringt, wovon auszugehen ist, kann ich nicht sagen. Dass das Endergebnis nicht perfekt werden kann, ist ja logisch. Trotzdem sieht die Kurve für diese Umstände sehr gut aus, das ist der Kernpunkt. Die 25 Hz oder 1 kHz sind allerdings perfekt mit 360 Punkten pro Periode.

    Ja die 25 Hz / 1 kHz sind sehr gut, aber das würde ein normaler ATmega328 wohl auch so hinbekommen, der Kernpunkt aber bei 1 MHz ist nicht die "hübsche" Sinuskurve, sondern es stößt der Prozessor eigentlich nicht an seine Grenzen, rechnerisch (nach den Dokus) hat er die Grenzen schon mehrfach überschritten und könnte das Signal so gar nicht unter diesen Randbedingen erzeugen!

    Jens lade doch bitte mal dein 1 MHz Beispielcode als Projekt mit allen gemachten Prozessorsettings hoch, der die dieses Zauberwerk auf nach Herstellerdoku völlig ungeeigneter Hardware vollbringen soll! Dann kann das jeder der einen solchen Prozessor mal bestellt hat, auch auf seinem Modul selbst analysieren.

    Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
    Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")

  • Es sind 64 Punkte pro Periode berechnet. Wieviele tatsächlich ausgegeben, das weiß ich nicht. Der Code ist der gleiche wie bei den 25 Hz, nur statt 360 nur 64 Punkte und entsprechend gesetzten Timer. Auch das Oszilloskop selbst zaubert hier Effekte ins Bild. Die meisten Stufen die Du da siehst, kommen vermutlich nicht vom Prozessor, sondern vom Oszilloskop. Bei der Geschwindigkeit wird man bei 254 Spannungswerten kaum Stufen vom Prozessor sehen. Dazu ist der Ausgang viel zu träge. Was Du da siehst, ist die Auflösung vom Oszilloskop. Denn wenn Du mal bei 25 Hz mit 360 Werten schaust, siehst Du exakt das gleiche Raster.

    Liebe Grüße,
    der Jens wars gewesen...

    --------------------------------------------------------------
    Die Wege der Elektronen sind unergründlich.

  • Hier darfst Du gerne nochmal Punkte zählen, das ist ein Signal von einem guten Generator. Die Stufen kommen tatsächlich vom Oszilloskop.

    Liebe Grüße,
    der Jens wars gewesen...

    --------------------------------------------------------------
    Die Wege der Elektronen sind unergründlich.

  • Ehrlich gesagt, sehe ich die angesprochenen Stellen nur im 1 MHz Sinus, nicht im 25 Hz Screenshot und auch nicht im letzten Bild. Das sind ja auch absolut unterschiedliche Rechen- und Auslastungssituationen bzw. im letzten Bild mit anderem Generator wie Du sagst, auch ein anderes Rechenwerk.

    Ich denke das Oszi hat beim 1 MHz Sinus schon ganz gut die oben besprochenen Probleme wiedergegeben, weitere Screens die mit dem eigentlichen Problem der (Nicht-) Berechenbarkeit des Problems durch IRQ Überlastung des Rechenwerks auf dem genutzen System (also dem LGT8F328) einhergehen, bringen da nichts außer eine Ablenkung zur eigentlichen rechnerischen Aufklärung des "Wunders", was da auf dem Rechenwerk gesehen sein soll und schieben die Beträge dazu nur ins "off" des Threads. Es wird nur nebulöser, das mit dem 1 MHz Signal. :)

    Du schreibst ja indirekt selbst irgendwie das du nicht weißt was da auf dem System vorgeht:

    Quote

    Wieviele tatsächlich ausgegeben, das weiß ich nicht.

    Ich bin mal gespannt wie die Ergebnisse bei anderen LGT8F328-Käufern aussehen, dein Code und die Änderungen hast du ja beschrieben die zum dargestellten 1 MHz Sinus führten. Schauen wir mal was dabei rauskommt ...

    Im Grunde dürfte doch der Prozessor bei IRQ-Überlast das so abarbeiten:

    - Timer schiebt mit 64 MHz Unterbrecheranfragen rein (IRQ)

    - Ein IRQ kommt durch/Sprung in die Interruptbehandlung: (4 cycles)

    - Sperrung für andere IRQ (1 cycle)

    - LUT_WERT holen, DAC setzen, Inkrementieren des LUT-Zeigers/Prüfung auf Überlauf (viele weitere cycles)

    - Aufheben der Sperre für weitere IRQ ( 1 cycle)

    - Rücksprung auf der Interruptbehandlung (2 cycles)

    Während zwischen "IRQ kommt durch" und Rücksprung alles auf dem 32 MHz Core gerechnet wird, gibt es Timer-gesteuert mit 64 MHz viele weitere Unterbrecheranfragen, die aber ignoriert werden, weil die Sperre gesetzt ist. Es entsteht zwar ein Sinus über alle Punkte (das Inkrementieren des LUT-Zeigers geht ja immer nur in der Interruptbehandlung), der Sinus ist aber viel viel langsamger getaktet, als es erforderlich wäre für 1 MHz (64MHz/64 LUT-Punkte pro Periode), da die Interruptbehandlung nur bei 1. halben Timertakt also Systemtakt läuft und 2. viele Takte aus des gleichen Quartz benötigt um die Aufgabe zu erledigen (alles dürfte aber nur 0.5 Takte dauern).

    Und das Wunder ist halt, wie kommt der nun viel langsamere Sinus doch zu einem 1 MHz aufs Oszi. ;) Mal ganz davon abgesehen das nach einem IRQ und Sprung in die ISR schon wieder für 4 cycles, also bei doppeltem Timertakt 8 weitere IRQs zwischenhauen wollen und beim Rücksprung 4.

    Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
    Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")

    Edited 2 times, last by Bernhard45 (April 28, 2025 at 9:57 AM).

  • Gibt es dort eine rechentechnische Analyse, wie das 1 MHz Oszibild mit dem Code einer 64 Punkt LUT und den Datenblättern des LGT8F328 in Einklang zu bringen sind? Wenn du eine Erklärung hast, poste Sie doch für alle hier, damit wir Kreaturen und alle im Netz nicht mehr leiden müssen.:smiley58: Ehrlich, ich sehe im Moment NICHT wie es mit dem Rechenwerk gehen sollte.

    Oder kommst Du schlicht nicht, wenn ich sage ich komme. ;(

    Sag niemals nie.

    Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
    Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")

    Edited once, last by Bernhard45 (April 28, 2025 at 1:14 PM).

  • Ich habe hier einen LGT8F328P.
    Dies sind Oszillogramme für 1 kHz mit Jens' Programm:

    Beide mit 0,1 ms/Kästchen. Rechts erkennt man die Abplattung.

    Für 1 MHz bräuchte ich Jens' Code. Ich gebe zu, ich traue dem Braten noch nicht so ganz :).

    Gruß, Frank

    Keiner von uns kommt lebend hier raus. Also spart nicht alles für später auf. Eßt leckeres Essen. Spaziert in der Sonne. Springt ins Meer. Sagt die Wahrheit und tragt euer Herz auf der Zunge. Seid albern. Seid freundlich. Seid komisch. Bastelt mit Radios. Für nichts anderes ist Zeit.

  • Ja man könnte das DC-Offset in der LUT auf genau 127.5 setzen, dann stimmt die Aussteuerung genau auf 8 Bit, ungefähr so könnte man die Sinus-LUT mit 64 Punkten vorberechnen lassen.

    Code
    #define LUT_SIZE 64
    uint8_t sinus_lut[LUT_SIZE];
    
    void generate_sinus_lut() {
        for (int i = 0; i < LUT_SIZE; i++) {
            sinus_lut[i] = (uint8_t)((sin((2 * PI * i) / LUT_SIZE) + 1) * 127.5);
        }
    }

    Für verschiedenen Frequenzen mit der 64er LUT könnte man die Timervorbelegungen zum Beispiel mit Arduino Web Timers durchspielen, der auch einen LGT8F329P unterstützt, man kann sich ja an Jens "Vorschlägen" orientieren, also Timer2

    https://dbuezas.github.io/arduino-web-timers/#mcu=LGT8F328P&timer=2

    Bei maximaler Timerfreq. hat man ja sowieso für OCR2A wenig Auswahl, aber was nützt es wenn der 32 MHz Core die ISR für so hohe Timerfrequenzen und damit IRQs nicht berechnen kann.

    Für (viel) niedrigere Frequenzen findet man durch verschieben von OCR2A dann die passenden Settings bzw. es wird der setup-Code schon geschrieben, durchgetestet habe ich das für einen LGT8F329P freilich noch nicht.

    Vielleicht hat ja noch jemand eine Idee bei der Durchsicht des Datenblatts, oder Jens meldet sich nochmal wo er das "Overdrivebit" für die MCU gefunden hat, das das so mit dem 1 MHz Sinus mit 64 Punkten klappt.

    Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
    Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!