AVR: blink without delay, without interrupt, without CPU

OP #7673577

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

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.

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

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.

Gast

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.

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

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.

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

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)

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

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

Eine eigene Frage? Dieser Thread ist über 2 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.