Forum: Mikrocontroller und Digitale Elektronik Blinking a mikrocontroller


von Christoph M. (mchris)


Lesenswert?

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 
..

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

> 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 ...

von Michael D. (nospam2000)


Lesenswert?

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

von Jens K. (jensky)


Lesenswert?

Christoph M. schrieb:
> unter die 48 Bytes des Codes kommen

interessant! Wie groß wäre der Code in Assembler?

von Peter D. (peda)


Lesenswert?

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>

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Dergute W. (derguteweka)


Lesenswert?

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

von Christoph M. (mchris)


Lesenswert?

>Ein ATtiny13 braucht immerhin 18 Byte:
Da sieht man es wieder: ARM is bloated :-)

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Peter D. schrieb:
> Wahnsinn, jetzt braucht man schon einen µC mit FPU fürs Blinken

Sagt wer?

von Norbert (der_norbert)


Lesenswert?

Peter D. schrieb:
> PINB |= 0x01;

Hmmm, kein XOR?

von Georg M. (g_m)


Lesenswert?

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
}

von Peter D. (peda)


Lesenswert?

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.

von Roland F. (rhf)


Lesenswert?

Hallo Peter,
Die _delay_ms-Funktion hast du aber unterschlagen...

rhf

von Thomas M. (elo-ocho)


Lesenswert?

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...

von Crazy Harry (crazy_h)


Lesenswert?

Roland F. schrieb:
> Hallo Peter,
> Die _delay_ms-Funktion hast du aber unterschlagen...
>
> rhf

Hat wer gesagt, wie schnell die blinkt? 😉

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Norbert (der_norbert)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Roland F. (rhf)


Lesenswert?

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

von Christoph M. (mchris)


Lesenswert?

Welche IDE würdet ihr für den STM32L432 verwenden, um zu assemblieren?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Christoph M. schrieb:
> Welche IDE würdet ihr für den STM32L432 verwenden, um zu
> assemblieren?

as, vim, ggf. make.

Gruss
WK

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Karl B. (gustav)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

OK, stimmt:

"Note that the SBI instruction can be used to toggle one single bit in a 
port."

von S. L. (sldt)


Lesenswert?

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

von Roland E. (roland0815)


Lesenswert?

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....

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Angehängte Dateien:

Lesenswert?

>>> 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
von Harald K. (kirnbichler)


Lesenswert?

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?

von Norbert (der_norbert)


Lesenswert?

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
von S. L. (sldt)


Lesenswert?

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.

von Norbert (der_norbert)


Lesenswert?

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¹⁹

von Wolle G. (wolleg)


Lesenswert?

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)

von Christoph M. (mchris)


Lesenswert?

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.

von Georg M. (g_m)


Lesenswert?

Christoph M. schrieb:
> Wichtig ist aber trotzdem Kommentare abzugeben.

Das Hauptmerkmal dieses Forums.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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)

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

>>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
von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

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.

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

> 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
von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

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.

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

> 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
von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

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.

von Dieter S. (ds1)



Lesenswert?

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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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 😁

von Dieter S. (ds1)


Angehängte Dateien:

Lesenswert?

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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.