AVR: blink without delay, without interrupt, without CPU

OP #7673577
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
}
Angehängte Dateien:
Gast #7673582
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.

#7673601
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? 😁

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

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

Gast #7673666
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.

#7673708
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???)

#7673875
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)

(Firma: 1984now) #7673878
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.

OP #7673907
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
}

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