Forum: Mikrocontroller und Digitale Elektronik AVR: blink without delay, without interrupt, without CPU


von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Ein Mikrocontroller ist mehr als nur ein Mikroprozessor mit RAM.
Hier ist noch ein Beispiel-Code, der das demonstriert.
1
                         ATtiny402
2
3
                    VDD 1|‾‾‾‾‾‾‾|8 GND 
4
  LED ---- LUT0-OUT/PA6 2|       |7 PA3
5
                    PA7 3|       |6 UPDI 
6
                    PA1 4|_______|5 PA2
7
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
  PORTA.DIRSET = PIN6_bm;
6
7
  RTC.CLKSEL = RTC_CLKSEL_INT1K_gc;
8
  while(RTC.STATUS > 0){}
9
  RTC.PER = 0x000F;
10
  RTC.CTRLA = RTC_RUNSTDBY_bm | RTC_PRESCALER_DIV64_gc | RTC_RTCEN_bm;
11
12
  EVSYS.ASYNCCH0 = EVSYS_ASYNCCH0_RTC_OVF_gc;
13
  EVSYS.ASYNCUSER2 = EVSYS_ASYNCUSER2_ASYNCCH0_gc;
14
 
15
  CCL.SEQCTRL0 = CCL_SEQSEL_JK_gc;
16
  CCL.LUT0CTRLC = CCL_INSEL2_EVENT0_gc;
17
  CCL.TRUTH0 = 0x01;
18
  CCL.TRUTH1 = 0x01;
19
  CCL.LUT0CTRLA = CCL_CLKSRC_bm | CCL_OUTEN_bm | CCL_ENABLE_bm;
20
  CCL.LUT1CTRLA = CCL_ENABLE_bm;
21
  CCL.CTRLA = CCL_ENABLE_bm; 
22
23
  while(1)
24
  {
25
26
  }
27
}

von Gerhard H. (Gast)


Lesenswert?

Georg M. schrieb:
> Ein Mikrocontroller ist mehr als nur ein Mikroprozessor mit RAM

Aber nur mit CCL-Modul :)
Danke Georg für die Demo!

"Without CPU" ist natürlich nur eingeschränkt gülig.
Ohne Initialisierung gehts einfach nicht :)

Ich habe bislang für's CCL noch keinen sinnvollen, naheliegenden Einsatz 
gefunden. Vielleicht kannst Du dabei helfen.

von Florian L. (muut) Benutzerseite


Lesenswert?

Du nimmst ein RTC Timer Event, um die Lookuptable zu clocken.
Dann könntest du sogar direkt über das Eventsystem zum Pin gehen und 
sparst dir die CCL.

von N. M. (mani)


Lesenswert?

Und was ist da jetzt nochmal der Vorteil davon? Man könnte ja auch 
einfach einen PWM Timer initialisieren.

Edit:
Wenn der Takt langsam genug ist könnte man auch einfach den CLKOUT 
setzen und damit die LED blinken lassen. Dann wäre es komplett ohne uC.
Geht aber glaube ich nur CLKDIV8 bei Atmel, oder? 😁

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Einfach so einen Brocken Code hinwerfen, ohne jeden Kommentar oder 
Erklärung. Macht man das heute so?

Wo stelle ich die Puls- und die Pausenzeit ein oder schalte das Blinken 
an und aus?

Ich nehme gerne das Delay-Macro. Es hat den Charme, daß man alle Zeiten 
in Klartext hinschreiben kann, d.h. der Code ist besonders gut lesbar 
und wartbar.

: Bearbeitet durch User
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Peter D. schrieb:
> Ich nehme gerne das Delay-Macro. Es hat den Charme, daß man alle Zeiten
> in Klartext hinschreiben kann, d.h. der Code ist besonders gut lesbar
> und wartbar.

Nebenläufigkeiten sind bei dir kein Thema?
Selbst ISR Aufrufe verlängern die delay Zeit.

von Gerhard H. (Gast)


Lesenswert?

Arduino F. schrieb:
> Selbst ISR Aufrufe verlängern die delay Zeit.

Beim Blinken mutmaßlich unerheblich.
Beim Threadthema schlicht nicht vorhanden.

Peter D. schrieb:
> Wo stelle ich die Puls- und die Pausenzeit ein oder schalte das Blinken
> an und aus?

Gings darum?
Die Beitrags-Absicht ist doch mit der Thread-Überschrift klar umrissen.

von Norbert (der_norbert)


Lesenswert?

Gerhard H. schrieb:
> Beim Blinken mutmaßlich unerheblich.
> Beim Threadthema schlicht nicht vorhanden.

Darum geht's hier im Forum doch gar nicht.

Völlig egal was jemand schreibt, es muss zunächst einmal schlecht 
gemacht werden. Das ist die oberste Prämisse.

Wenn man da dann nichts finden kann, dann konstruiert man sich halt 
etwas.

Da ist es auch völlig egal ob es zum Thema passt.

von Gerhard H. (Gast)


Lesenswert?

Norbert schrieb:
> Völlig egal was jemand schreibt

Das ist unerheblich? Aha.

> Darum geht's hier im Forum doch gar nicht.

Sondern?`

Hast Du das Zitat überhaupt verstanden?

von Norbert (der_norbert)


Lesenswert?

Gerhard H. schrieb:
> Norbert schrieb:
>> Völlig egal was jemand schreibt
>
> Das ist unerheblich? Aha.
>
>> Darum geht's hier im Forum doch gar nicht.
>
> Sondern?`
>
> Hast Du das Zitat überhaupt verstanden?

Habe ich. Du allerdings meine Antwort fehl. ;-)

von Walter T. (nicolas)


Lesenswert?

Gerhard H. schrieb:
> Ich habe bislang für's CCL noch keinen sinnvollen, naheliegenden Einsatz
> gefunden. Vielleicht kannst Du dabei helfen.

https://www.mikrocontroller.net/wikifiles/thumb/3/3f/Schaltplan_quad_decoder.png/640px-Schaltplan_quad_decoder.png

Ich wollte es immer mal ausprobieren, und war jedes Mal zu faul.

: Bearbeitet durch User
von Gerhard H. (Gast)


Lesenswert?

Norbert schrieb:
> Du allerdings meine Antwort fehl. ;-)

Schau an. Eine bessere Antwort ist Dir wohl gerade nicht eingefallen :)

Walter T. schrieb:
> Ich wollte es immer mal ausprobieren, und war jedes Mal zu faul.

Mein Grund es nicht zu nutzen ist eher, daß CCL-Funktionalität in 
"normaler" Software allermeistens genauso geht. Insbesondere frei in 
der Auswahl der Pins. Ein AVR ist eigentlich so schon leistungsfähig 
genug.

von Walter T. (nicolas)


Lesenswert?

Gerhard H. schrieb:
> Mein Grund es nicht zu nutzen ist eher, daß CCL-Funktionalität in
> "normaler" Software allermeistens genauso geht.

Mag schon sein. Bei diesem Beispiel mit dem A/B-Signal konvertieren kann 
man aber z.B. die Abtastrate vierteln.

Die CCL-Einheite sind eher nice to have als game changer, weil man 
glue-logic einsparen kann. (Gibt es irgendwo einen Knopf, mit dem man 
zumindest für die Mittagspause sein Denglisch wieder abschalten kann???)

von Joachim B. (jar)


Lesenswert?

der Titel ist fake, wenn ich den "ATtiny402" rauswerfe blinkt nichts 
mehr.

von Gerhard H. (Gast)


Lesenswert?

ATtiny402 ≠ CPU


Walter T. schrieb:
> Die CCL-Einheiten sind eher nice to have

Das Event-System finde ich wesentlich nützlicher.

von Joachim B. (jar)


Lesenswert?

Gerhard H. schrieb:
> ATtiny402 ≠ CPU

was soll das, weil du auf CPU bestehst es eine MCU ist und kein Z80 oder 
6502?

von Gerhard H. (Gast)


Lesenswert?

Joachim B. schrieb:
> was soll das

Nun, Georg bezieht sich auf die Unabhängigkeit von jedweder 
Programmabarbeitung und nicht vom ganzen Chip.

von Joachim B. (jar)


Lesenswert?

Georg M. schrieb:
> int main(void)
> {
>   PORTA.DIRSET = PIN6_bm;
>   RTC.CLKSEL = RTC_CLKSEL_INT1K_gc;
>   while(RTC.STATUS > 0){}

Gerhard H. schrieb:
> Unabhängigkeit von jedweder
> Programmabarbeitung

sehe ich nicht so, das obige ist Programm

von Gerhard H. (Gast)


Lesenswert?

Joachim B. schrieb:
> sehe ich nicht so, das obige ist Programm

Gerhard H. schrieb:
> "Without CPU" ist natürlich nur eingeschränkt gülig.
> Ohne Initialisierung gehts einfach nicht

Strenggenommen bezieht sich Georgs Titel ja nur auf die reine 
Blink-Phase :)

von S. L. (sldt)


Lesenswert?

> without CPU

Nun ja, mag sein - nur arbeitet diese gar geschäftig im Hintergrund und 
benötigt dabei 1.1 mA; wenn der mit
> RTC.CTRLA = RTC_RUNSTDBY_bm | ...
vorbereitete Stand-by-Sleep auch realisiert wäre, wären's nur noch 0.04 
mA.

(alles bei ATtiny412, mangels 402)

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

N. M. schrieb:

> Und was ist da jetzt nochmal der Vorteil davon? Man könnte ja auch
> einfach einen PWM Timer initialisieren.

Ja, logisch. Es ging hier primär wohl eher darum, erste Übungen mit der 
CCL und dem Eventsystem zu machen, nicht darum, eine LED blinken zu 
lassen.

> Edit:
> Wenn der Takt langsam genug ist könnte man auch einfach den CLKOUT
> setzen und damit die LED blinken lassen. Dann wäre es komplett ohne uC.
> Geht aber glaube ich nur CLKDIV8 bei Atmel, oder? 😁

Nö. Bei sehr vielen gibt es ja auch noch das CLKPR-Register. Damit kommt 
man schon ziemlich weit runter.

von Georg M. (g_m)


Lesenswert?

S. L. schrieb:
> ... Stand-by-Sleep auch realisiert wäre ...
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
  PORTA.PIN1CTRL = PORT_ISC_INPUT_DISABLE_gc;
6
  PORTA.PIN2CTRL = PORT_ISC_INPUT_DISABLE_gc;
7
  PORTA.PIN3CTRL = PORT_ISC_INPUT_DISABLE_gc;
8
  PORTA.PIN6CTRL = PORT_ISC_INPUT_DISABLE_gc;
9
  PORTA.PIN7CTRL = PORT_ISC_INPUT_DISABLE_gc;
10
11
  PORTA.DIRSET = PIN6_bm;
12
13
  RTC.CLKSEL = RTC_CLKSEL_INT1K_gc;
14
  while(RTC.STATUS > 0){}
15
//  RTC.PER = 0x000F;     // 1s
16
  RTC.PER = 0x007F;       // 8s (for current measurement)
17
  RTC.CTRLA = RTC_RUNSTDBY_bm | RTC_PRESCALER_DIV64_gc | RTC_RTCEN_bm;
18
19
  EVSYS.ASYNCCH0 = EVSYS_ASYNCCH0_RTC_OVF_gc;
20
  EVSYS.ASYNCUSER2 = EVSYS_ASYNCUSER2_ASYNCCH0_gc;
21
 
22
  CCL.SEQCTRL0 = CCL_SEQSEL_JK_gc;
23
  CCL.LUT0CTRLC = CCL_INSEL2_EVENT0_gc;
24
  CCL.TRUTH0 = 0x01;
25
  CCL.TRUTH1 = 0x01;
26
  CCL.LUT0CTRLA = CCL_CLKSRC_bm | CCL_OUTEN_bm | CCL_ENABLE_bm;
27
  CCL.LUT1CTRLA = CCL_ENABLE_bm;
28
  CCL.CTRLA = CCL_ENABLE_bm;
29
30
  SLPCTRL.CTRLA = SLPCTRL_SMODE_STDBY_gc | SLPCTRL_SEN_bm;
31
32
  while(1)
33
  {
34
    __asm__ __volatile__ ("sleep" "\n\t" :: );
35
  }
36
}

von S. L. (sldt)


Lesenswert?

Ah, sehr schön - ja, die offenen Eingänge. Mit Ihrem Programm kommt mein 
ATtiny412 jetzt auf 0.6 uA (bei 3.0 V, und natürlich ohne die LED).

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.