Blinking a mikrocontroller

#7855039
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>
#7855078
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...

Moderator Persönliche Seite #7855080
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.

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

(Firma: Starfleet) #7855375
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.

Angehängte Dateien:
(Firma: Starfleet) #7855957
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.

Persönliche Seite #7856138
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.

(Firma: Starfleet) #7856144
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

Persönliche Seite #7856152
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.

(Firma: Starfleet) #7856155
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.

Persönliche Seite #7856167
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.

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

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

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren