Hier ein Video, wie man eine blinkende LED auf einem STM32L432 realisiert:
https://www.youtube.com/watch?v=9FTUa-2eIDU
Ich habe das Gefühl, man könnte noch unter die 48 Bytes des Codes kommen ..
|
Anzeige
|
Blinking a mikrocontrollerHier ein Video, wie man eine blinkende LED auf einem STM32L432 realisiert: https://www.youtube.com/watch?v=9FTUa-2eIDU Ich habe das Gefühl, man könnte noch unter die 48 Bytes des Codes kommen ..
Ein Z80 mit NOP-Adapter schafft das mit 0 Byte Code ...
Nach dem Subject habe ich mich gefreut endlich mal zu sehen, wie ein Mikrocontroller blinkt, aber jetzt blinkt doch wieder nur eine LED. Hoffentlich passt der Vorwiderstand. Michael
interessant! Wie groß wäre der Code in Assembler? Wahnsinn, jetzt braucht man schon einen µC mit FPU fürs Blinken. Ein ATtiny13 braucht immerhin 18 Byte:
Das Listing:
Und man kann die Blinkfrequenz einfach durch wechseln des Pins wählen. Moin,
Entscheidend ist aber die Rueckverguetung von Microchip bzw. ST, die man sicherlich beantragen kann, wenn man fuer seine Software nicht alles Flash/RAM benoetigt. Fun fact: Auf einem 555 Microcontroller braucht eine blinkende LED nur 0 Byte. Beat dis! scnr, WK
AVR128DB48 Curiosity Nano (onboard LED PB3):
10.2.2 Toggling the Pin Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the SBI instruction can be used to toggle one single bit in a port. Hallo Peter, Die _delay_ms-Funktion hast du aber unterschlagen... rhf Moinsen,
Das dürfte auch ganz ohne IC funktionieren, Zeitglieder lassen sich auch mit einfachen RC Schaltungen realisieren...
Hat wer gesagt, wie schnell die blinkt? 😉
Muss aber
heißen. Ist zwar hier nicht relevant, aber ansonsten würdest du auch alle Bits toggeln, die im Register bereits 1 sind.
Nein, hat er nicht. Das ist die Zählschleife, und die steht ja sogar als Kommentar drüber. _delay_ms() selbst ist ein inline, das die Anzahl der benötigten Zyklen ermittelt und anschließend damit __builtin_avr_delay_cycles() befüttert – die, wie der Name sagt, ein Builtin des AVR-GCC ist und damit von diesem direkt aufgelöst wird.
Ah, den hatte ich übersehen. Danke.
Habs mal nachgerechnet: 0x752F = 29999 1.2MHz / 29999 / 4 = 10Hz = 100ms Das Listing stimmt. Die LED blinkt mit 5Hz. Hallo Jörg, hallo Peter, Peter D. schrieb im Beitrag #7855087:
Ihr habt natürlich Recht. Ich habe mir das Assemblerlisting gar nicht angesehen. Ich stell mich jetzt für 10 Minuten in die Ecke und schäme mich. rhf Welche IDE würdet ihr für den STM32L432 verwenden, um zu assemblieren? Moin,
as, vim, ggf. make. Gruss WK
STM32CubeIDE, und eben den C-Code aus dem Projekt löschen. Würde statt 24 und 25 .def XH = r27 .def XL = r26 .def YH = r29 .def YL = r28 .def ZH = r31 .def ZL = r30 nehmen. Wohl targetabhängig. aber "pseudo" 16 bit ciao gustav
Da ist ein Flipflop drin. Die blinkende LED mit dem NE555 braucht also 1 Bit.
Der AVR-GCC übersetzt schon richtig zu SBI und lt. Note ändert das nur den einen Pin. Nur beim ADCSRA-Register löscht ein SBI/CBI immer auch das ADIF-Bit: Beware that if doing a Read-Modify-Write on ADCSRA, a pending interrupt can be disabled. This also applies if the SBI and CBI instructions are used. Und beim ACSR-Register müßte das ACI-Bit auch mit gelöscht werden, steht aber nicht im Datenblatt. OK, stimmt: "Note that the SBI instruction can be used to toggle one single bit in a port." Brotlose Kunst - aber sei's drum: Wenn der Pull-up für die LED reicht, 8 Bytes:
Der 555 sind doch zwei OPVs....
Ja, so etwa 23 Transistoren. Heute herrscht halt der Trend vor, auch simple Aufgaben mit übermäßig komplexen Lösungen zu erschlagen. Anbei eine Blinkschaltung aus einem Experimentierkit für Teenager aus den 80ern.Dda kommt man mit zwei Transistoren aus. Dafür hat's Altersgerechte Erklärungen und Ausführungen bezüglich realem Einsatz.
Kann es sein, daß das etwas schneller als mit 5 Hz blinkt?
F_CPU / 2¹⁹ wäre jetzt meine ungefähre Schätzung. Edit: Habe etwas erhöht. an Harald K. & Norbert: Blinkfrequenz ist rund 2 Hz. Hintergrund: Die AVRe-Klasse wird (fast immer) mit 1 MHz Systemtakt ausgeliefert: 1 MHz / (2^16 * (2+2)) /2 = 1.91 Hz.
/Default/ Frequenz hatte ich gerade nicht parat, der Rest passt dann ja: 1 MHz / 2¹⁹
Ja, ja. Das waren noch Zeiten. Diese Art der Schaltung bildete bei mir in den 60er Jahren des vorigen Jahrhunderts die Grundlage für den Austausch des Blinkgebers am Motorrad. (mechanisch --> elektronisch) Bradward B.
Das Hauptmerkmal dieses Forums.
Ich schaffe das mit 50 Bytes weniger! (Nur 0xfffffffe Bytes)
????
Ein Kennzeichen mancher Foristen hier ist anscheinend die billige Provokation durch an den Haaren herbeigezogener Argumente. Wohl weil einem die Sachargumente ausgegangen sind.
Also die Schaltungsauslegung ist IMHO nicht besonders smart, der kleine µC kann lediglich 25 mA ab und schon an einem einzelnen der 22 GPIO-Pins wird ca. 15% dieses Strombudgets verheizt. Ja diese kleinen Kerlchen brauchen schon fast zum Schalten von mehreren LED's Schalttransistoren, um nicht von den Strömen gegrillt zu werden.
Magst du dies Aussage mal mit Zahlen und Zitaten aus dem Datenblatt belegen. Ich komme auf Werte die mindestens eine Größenordung abweichen und würde gerne wissen wie du auf deine Werte kommst.
Einfach mal im Datenblatt des STM32L432 nach eingespeisten Strömen (injected current) suchen. Da steht was von 25 mA, die der weg senken kann. Zu der Thematik gibt es auch eine Application Note bzgl. (Power-)LED:
"injected current" ist aber wenn z.B. 5V über einen Vorwiderstand an den 3.3V Port eingespeist werden und Richtung VDD über die Schutzdioden abfließen.
Da gehts aber um LEDs mit >= 25mA. Das funktioniert an einem einzelnen Pin nicht. Hat aber wiederrum nichts mit dem "injected current" zu tun. Die LED im Video wird mit ca. 2mA betrieben und der verwendete µC verträgt 100mA durch einen VDD Pin bzw. 140mA in Summe.
Nach dem Video sind es eher 4 mA (die Flussspannung der LED muss man anhand der Farbe raten) und nach der im Video gezeigten Beschaltung auf dem Steckbrett wird der Strom in den Controller getrieben. Ist bei einer einzelnen LED wie beschrieben im grünen Bereich, bei einer Massenbeschaltung ist man eher mit Schalttransistoren als minimale externe Schutzbeschaltung auf der langlebigeren Seite.
Ja, der strom fließt in den Controller. Aber es ist kein "injected current" da er eben nicht über die Schutzdiode gegen VDD fließt sondern mit dem Low-Side Transistor gegen Masse geschaltet wird. Und damit gilt der Grenzwert von 25mA nicht. Kurzer Test mit einem Nucleo-F446RE um die eingebaute LED an PA5 blinken zu lassen: 40 Bytes, davon 8 Bytes für den obligatorischen Reset Vektor und den Initialwert für den Stack. PA5 wird wie vorgesehen als Ausgang verwendet. Die Ein-/Auszeit beim Blinken beträgt ca. eine halbe Sekunde. OK, korrekterweise muss man noch das Konfigurationsbit mitzählen um IWDG als Hardware Watchdog zu konfigurieren, der ist für das Blinken zuständig.
Magst du den Assemblercode als Text posten, dann kann man damit rumspielen ohne es aus dem Youtube Video abtippen zu müssen 😁 Die 32 Byte Code sind ja auch schnell disassembliert (das sind 16 Assembler Befehle). Assembler Code mit ein paar Kommentaren siehe Anhang. Man kann alternativ die IO Adressen als Konstanten ablegen und PC relativ laden, das sollte aber keinen Unterschied in Bezug auf die Code-Größe machen.
Ja aber die Anstrengung 😉 Den Watchdog zu missbrauchen ist hinterhältig! Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|