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 ..
> 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 ...
Christoph M. schrieb: > Blinking a mikrocontroller 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
Christoph M. schrieb: > unter die 48 Bytes des Codes kommen 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:
1 | #define F_CPU 1.2e6
|
2 | #include <util/delay.h> |
3 | #include <avr/io.h> |
4 | |
5 | int main(void) |
6 | {
|
7 | DDRB |= 0x01; |
8 | while(1) { |
9 | PINB |= 0x01; |
10 | _delay_ms( 100 ); |
11 | }
|
12 | return 0; |
13 | }
|
Das Listing:
1 | int main(void) |
2 | {
|
3 | DDRB |= 0x01; |
4 | 0: b8 9a sbi 0x17, 0 ; 23 |
5 | while(1) { |
6 | PINB |= 0x01; |
7 | 2: b0 9a sbi 0x16, 0 ; 22 |
8 | #else
|
9 | //round up by default
|
10 | __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); |
11 | #endif
|
12 | |
13 | __builtin_avr_delay_cycles(__ticks_dc); |
14 | 4: 8f e2 ldi r24, 0x2F ; 47 |
15 | 6: 95 e7 ldi r25, 0x75 ; 117 |
16 | 8: 01 97 sbiw r24, 0x01 ; 1 |
17 | a: f1 f7 brne .-4 ; 0x8 <__zero_reg__+0x7> |
18 | c: 00 c0 rjmp .+0 ; 0xe <__zero_reg__+0xd> |
19 | e: 00 00 nop |
20 | 10: f8 cf rjmp .-16 ; 0x2 <__zero_reg__+0x1> |
Bradward B. schrieb: > Ein Z80 mit NOP-Adapter schafft das mit 0 Byte Code ... Und man kann die Blinkfrequenz einfach durch wechseln des Pins wählen.
Moin, Peter D. schrieb: > Ein ATtiny13 braucht immerhin 18 Byte: 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):
1 | #include <avr/io.h> |
2 | |
3 | int main(void) |
4 | {
|
5 | while(1) |
6 | {
|
7 | PORTB.DIRTGL = PIN3_bm; |
8 | __builtin_avr_delay_cycles(4000000); |
9 | }
|
10 | }
|
Norbert schrieb: > Hmmm, kein XOR? 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, Dergute W. schrieb: > Moin, > > Peter D. schrieb: >> Ein ATtiny13 braucht immerhin 18 Byte: > > 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 Das dürfte auch ganz ohne IC funktionieren, Zeitglieder lassen sich auch mit einfachen RC Schaltungen realisieren...
Roland F. schrieb: > Hallo Peter, > Die _delay_ms-Funktion hast du aber unterschlagen... > > rhf Hat wer gesagt, wie schnell die blinkt? 😉
Peter D. schrieb: > Norbert schrieb: >> Hmmm, kein XOR? > > 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. Muss aber
1 | PINB = 0x01; |
heißen. Ist zwar hier nicht relevant, aber ansonsten würdest du auch alle Bits toggeln, die im Register bereits 1 sind. Roland F. schrieb: > Hallo Peter, > Die _delay_ms-Funktion hast du aber unterschlagen... 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.
Peter D. schrieb: > Norbert schrieb: >> Hmmm, kein XOR? > > 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. Ah, den hatte ich übersehen. Danke.
Roland F. schrieb: > Die _delay_ms-Funktion hast du aber unterschlagen... 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: > Habs mal nachgerechnet: 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, Christoph M. schrieb: > Welche IDE würdet ihr für den STM32L432 verwenden, um zu > assemblieren? as, vim, ggf. make. Gruss WK
Christoph M. schrieb: > Welche IDE würdet ihr für den STM32L432 verwenden, um zu assemblieren? 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
Dergute W. schrieb: > Auf einem 555 Microcontroller braucht eine blinkende LED nur 0 Byte. > Beat dis! Da ist ein Flipflop drin. Die blinkende LED mit dem NE555 braucht also 1 Bit.
Jörg W. schrieb: > Muss aber PINB = 0x01; > heißen. Ist zwar hier nicht relevant, aber ansonsten würdest du auch > alle Bits toggeln, die im Register bereits 1 sind. 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:
1 | .include "m48PAdef.inc" |
2 | |
3 | sbiw z,1 |
4 | brne pc-1 |
5 | sbi PINB,0 |
6 | rjmp pc-3 |
Lothar M. schrieb: > Dergute W. schrieb: >> Auf einem 555 Microcontroller braucht eine blinkende LED nur 0 Byte. >> Beat dis! > Da ist ein Flipflop drin. Die blinkende LED mit dem NE555 braucht also 1 > Bit. Der 555 sind doch zwei OPVs....
>>> Auf einem 555 Microcontroller braucht eine blinkende LED nur 0 Byte. >>> Beat dis! >> Da ist ein Flipflop drin. Die blinkende LED mit dem NE555 braucht also 1 >> Bit. > > 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.
:
Bearbeitet durch User
S. L. schrieb: > Wenn der Pull-up für die LED reicht, 8 Bytes: Kann es sein, daß das etwas schneller als mit 5 Hz blinkt?
Harald K. schrieb: > 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.
:
Bearbeitet durch User
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.
S. L. schrieb: > 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¹⁹
Bradward B. schrieb: > Dafür hat's > Altersgerechte Erklärungen und Ausführungen bezüglich realem Einsatz. 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. >Anbei eine Blinkschaltung aus einem Experimentierkit für Teenager aus >den 80ern.Dda kommt man mit zwei Transistoren aus. Scheinbar hast du das Eröffnungsvideo nicht angeschaut. Wichtig ist aber trotzdem Kommentare abzugeben.
Christoph M. schrieb: > Wichtig ist aber trotzdem Kommentare abzugeben. Das Hauptmerkmal dieses Forums.
Christoph M. schrieb: > Ich habe das Gefühl, man könnte noch unter die 48 Bytes des Codes kommen Ich schaffe das mit 50 Bytes weniger! (Nur 0xfffffffe Bytes)
>>Anbei eine Blinkschaltung aus einem Experimentierkit für Teenager aus >>den 80ern. Da kommt man mit zwei Transistoren aus. > Scheinbar hast du das Eröffnungsvideo nicht angeschaut. Wichtig ist aber > trotzdem Kommentare abzugeben. ???? >> Wichtig ist aber trotzdem Kommentare abzugeben. > Das Hauptmerkmal dieses Forums. Ein Kennzeichen mancher Foristen hier ist anscheinend die billige Provokation durch an den Haaren herbeigezogener Argumente. Wohl weil einem die Sachargumente ausgegangen sind. > Hoffentlich passt der Vorwiderstand. 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.
:
Bearbeitet durch User
Bradward B. schrieb: >> Hoffentlich passt der Vorwiderstand. > 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.
> 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: https://www.st.com/resource/en/application_note/an4899-stm32-microcontroller-gpio-hardware-settings-and-lowpower-consumption-stmicroelectronics.pdf
:
Bearbeitet durch User
Bradward B. schrieb: > Einfach mal im Datenblatt des STM32L432 nach eingespeisten Strömen > (injected current) suchen. Da steht was von 25 mA, die der weg senken > kann. "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. Bradward B. schrieb: > Zu der Thematik gibt es auch eine Application Note bzgl. (Power-)LED: > > https://www.st.com/resource/en/application_note/an4899-stm32-microcontroller-gpio-hardware-settings-and-lowpower-consumption-stmicroelectronics.pdf 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.
> IMHO > 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.
:
Bearbeitet durch User
Bradward B. schrieb: >> IMHO >> 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. 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.
Dieter S. schrieb: > Kurzer Test mit einem Nucleo-F446RE um die eingebaute LED an PA5 blinken > zu lassen: 40 Bytes, davon 8 Bytes 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.
Dieter S. schrieb: > Die 32 Byte Code sind ja auch schnell disassembliert (das sind 16 > Assembler Befehle). Ja aber die Anstrengung 😉 Den Watchdog zu missbrauchen ist hinterhältig!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.