Forum: Mikrocontroller und Digitale Elektronik AVR128DB - Clock Failure Detection


von Veit D. (devil-elec)


Lesenswert?

Hallo,

bin am rumspielen mit einem Microchip AVR128DB48 Curiosity Nano Board.
Allerdings funktioniert CFD nicht wie ich denke zu verstehen.

Auch der Bsp. Code funktioniert nicht. 
https://github.com/microchip-pic-avr-examples/avr128db48-getting-started-with-xoschf/blob/master/getting-started-with-xoschf/CFD-on-XOSCHF/main.c

Eigentlich müßte die onboard Led PB3 in irgendeiner Art und Weise 
takten, wenn ich das init vom externen Takt nicht ausführe. Richtig?
Der µC läuft dann mit internen Takt, default 4MHz, sehe ich auch am Pin 
PB0. Soweit passt das schon. Nur entweder wird der CFD Interrupt nicht 
ausgeführt oder was anderes stimmt noch nicht. Ideen?

mein Code
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
6
void CLOCK_XOSCHF_crystal_init (void);
7
void CLOCK_CFD_XOSCHF_init (void);
8
9
static inline void init_Leds (void)
10
{
11
    PORTB.DIRSET = PIN3_bm | PIN0_bm;
12
    PORTB.OUTSET = PIN3_bm | PIN0_bm;
13
    PORTB.PORTCTRL = PORT_SRL_bm;
14
}
15
16
static inline void led0_toggle(void)
17
{
18
    VPORTB.IN = PIN0_bm;
19
}
20
21
static inline void led3_toggle(void)
22
{
23
    VPORTB.IN = PIN3_bm;
24
}
25
26
int main(void)
27
{
28
  // CLOCK_XOSCHF_crystal_init();
29
  CLOCK_CFD_XOSCHF_init();
30
  init_Leds();
31
32
  sei();
33
34
  while(1)
35
  {
36
        led0_toggle();
37
  }
38
}
39
40
void CLOCK_XOSCHF_crystal_init(void)
41
{
42
  // Enable crystal oscillator with frequency range 16MHz and 4K cycles startup time
43
    CPU_CCP = CCP_IOREG_gc;
44
    CLKCTRL.XOSCHFCTRLA = (
45
                 CLKCTRL_RUNSTDBY_bm
46
               | CLKCTRL_CSUTHF_4K_gc
47
               | CLKCTRL_FRQRANGE_16M_gc
48
               | CLKCTRL_SELHF_CRYSTAL_gc
49
               | CLKCTRL_ENABLE_bm
50
    );
51
52
  // Confirm crystal oscillator start-up/
53
  while(!(CLKCTRL.MCLKSTATUS & CLKCTRL_EXTS_bm))
54
  { ; }
55
}
56
57
void CLOCK_CFD_XOSCHF_init(void)
58
{
59
  // Enable Clock Failure Detection on XOSCHF 
60
  CPU_CCP = CCP_IOREG_gc;
61
  CLKCTRL.MCLKCTRLC = (CLKCTRL_CFDSRC_XOSCHF_gc | CLKCTRL_CFDEN_bm);
62
63
  // Enable regular interrupt for CFD
64
  CPU_CCP = CCP_IOREG_gc;
65
  CLKCTRL.MCLKINTCTRL = CLKCTRL_CFD_bm;
66
}
67
68
ISR(CLKCTRL_CFD_vect)
69
{
70
  /* This interrupt will trigger every time the CFD detects XOSCHF has stopped
71
     The Main Clock source is OSCHF so the CPU is not affected */
72
  led3_toggle();
73
74
  // Clear the CFD interrupt flag
75
  CLKCTRL.MCLKINTFLAGS = CLKCTRL_CFD_bm;
76
}

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Veit D. schrieb:
> Ideen?

Es gibt einen Simulator für den AVR128DB Klotz, ABER nur im MPLAB X. 
Dann kannst du vielleicht besser rumspielen mit der Konfiguration und 
schauen was die Interrupts so tun.


Veit D. schrieb:
> { ; }
Meine "optisch gut erkannbare" Variante dazu ist
while (...) continue;

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich kann mir noch keinen Reim drauf machen. CFD hängt laut Blockdiagram 
12.2.1 zwischen den Clock Selektoren und dem Main Clock Switch. CFD 
sieht damit per default den onboard Quarztakt. Jetzt habe ich 
XOSCHFCTRLA so konfiguriert das nicht Crystal sondern Extclock aktiv ist 
und noch disabled. Also bewusst falsch. Damit sollte CFD keinen Takt von 
extern sehen und seinen Interrupt auslösen. Ergebnis, es tut sich 
dennoch nichts.
1
void CLOCK_XOSCHF_crystal_init(void)
2
{
3
   // bewusst falsch und disabled
4
   CPU_CCP = CCP_IOREG_gc;
5
   CLKCTRL.XOSCHFCTRLA = CLKCTRL_SELHF_EXTCLOCK_gc;
6
}

Edit:
MPLAB X installieren wollte ich eigentlich nicht nochmal.
Wenn mir nichts weiter einfällt, vielleicht ...   :-)
Danke.

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

nochmal gelesen und nachgedacht.  :-)
Vielleicht löst der Interrupt nur einmalig aus pro Ereignis.
Also external Crystal enable und disable gemacht. Siehe da, es tut sich 
was. Blinkt zwar nicht schön regelmäßig, stockt manchmal, aber optisch 
aktiv. Nimmt man das delay zu weit runter tut sich nichts mehr. Ich 
vermute CFD fragt nicht ständig die Quelle ab sondern aller paar 
unbekannten [ms].
Hängt vielleicht auch mit dem umchalten auf intern 4MHz zusammen o.ä.
Pin PB0 taktet dagegen sauber weiter als wenn nichts wäre.
Test beendet.  :-)
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <avr/interrupt.h>
6
7
void enable_CLOCK_XOSCHF_crystal (void);
8
void disable_CLOCK_XOSCHF_crystal (void);
9
void CLOCK_CFD_XOSCHF_init (void);
10
11
static inline void init_Leds (void)
12
{
13
    PORTB.DIRSET = PIN3_bm | PIN0_bm;
14
    PORTB.OUTSET = PIN3_bm | PIN0_bm;
15
    PORTB.PORTCTRL = PORT_SRL_bm;
16
}
17
18
static inline void led0_toggle(void)
19
{
20
    VPORTB.IN = PIN0_bm;
21
}
22
23
static inline void led3_toggle(void)
24
{
25
    VPORTB.IN = PIN3_bm;
26
}
27
28
int main(void)
29
{   
30
  disable_CLOCK_XOSCHF_crystal();
31
  CLOCK_CFD_XOSCHF_init();
32
  init_Leds();
33
34
  sei();
35
36
  while(1)
37
  {
38
        enable_CLOCK_XOSCHF_crystal();
39
        led0_toggle();
40
        _delay_ms(15);
41
        disable_CLOCK_XOSCHF_crystal();
42
        led0_toggle();
43
        _delay_ms(15);
44
  }
45
}
46
47
void enable_CLOCK_XOSCHF_crystal(void)
48
{
49
  // Enable crystal oscillator with frequency range 16MHz and 4K cycles startup time
50
  CPU_CCP = CCP_IOREG_gc;
51
    CLKCTRL.XOSCHFCTRLA = (
52
                          CLKCTRL_RUNSTDBY_bm
53
                      | CLKCTRL_CSUTHF_4K_gc
54
                      | CLKCTRL_FRQRANGE_16M_gc
55
                      | CLKCTRL_SELHF_CRYSTAL_gc
56
                      | CLKCTRL_ENABLE_bm
57
    );
58
59
  // Confirm crystal oscillator start-up/
60
  while(!(CLKCTRL.MCLKSTATUS & CLKCTRL_EXTS_bm)) 
61
  { ; }
62
}
63
64
void disable_CLOCK_XOSCHF_crystal(void)
65
{
66
  CPU_CCP = CCP_IOREG_gc;
67
    CLKCTRL.XOSCHFCTRLA = CLKCTRL_SELHF_EXTCLOCK_gc;        
68
}
69
70
void CLOCK_CFD_XOSCHF_init(void)
71
{
72
  // Enable Clock Failure Detection on XOSCHF 
73
  CPU_CCP = CCP_IOREG_gc;
74
    CLKCTRL.MCLKCTRLC = (CLKCTRL_CFDSRC_XOSCHF_gc | CLKCTRL_CFDEN_bm);
75
76
  // Enable regular interrupt for CFD
77
  CPU_CCP = CCP_IOREG_gc;
78
    CLKCTRL.MCLKINTCTRL = CLKCTRL_CFD_bm;
79
}
80
81
ISR(CLKCTRL_CFD_vect)
82
{
83
  /* This interrupt will trigger every time the CFD detects XOSCHF has stopped
84
     The Main Clock source is OSCHF so the CPU is not affected */
85
  led3_toggle();
86
87
  // Clear the CFD interrupt flag
88
  CLKCTRL.MCLKINTFLAGS = CLKCTRL_CFD_bm;
89
}

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Das Curiosity-Board habe ich auch bei Digikey gesehen. Allerdings 
einzeln µC aus der DB-Serie noch nicht. Hast Du eine aktuelle Quelle?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

die AVR128DBxx sind zwar laut Microchip in Produktion und bei Mouser 
gelistet aber noch nicht bestellbar. Das einzigste was laut Microchip 
möglich wäre direkt bei denen Samples bestellen. Habe gerade geschaut.
Ich könnte dir allerdings auch ein Curiosity-Board verkaufen.
Beitrag "[V] Microchip Curiosity Nano Boards mit AVR128DB48 / ATmega4809"
Wollte zwar noch etwas warten. Ich würde auf 10,- pro Board runtergehen.

von Wilhelm M. (wimalopaan)


Lesenswert?

Vielen Dank für das Angebot: ich brauche aber direkt die µC.
Danke!!!

von S. Landolt (Gast)


Lesenswert?

an Wilhelm M.:

Ich habe, wie auch das 'AVR128DB48 Curiosity Nano Evaluation kit', 
AVR128DB28-I/SP bei 'microchip DIRECT' (merkwürdige Schreibweise) 
bestellt, am 13. Es läuft z.Z. aber etwas chaotisch dort: Ersteres war 
mit Lieferdatum 22. avisiert, kam am 16., also letzten Freitag, an, 
allerdings die alte Revision 2, 'A09‑3372/02'. Bei Letzteren wechselt 
ständig das "Estimated Ship Date", per E-Mail:
14. 08:44: "03-Dec-2020"
15. 10:44: "06-Mar-2021"
15. 23:14: "04-Feb-2021"
16. 23:14: "30-Oct-2020"

Dass als VAT 19 % berechnet werden, war zu erwarten.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

woran erkennst du die Revision?
Auf der Curiosity Nano Schachtel steht A09-3336/2.
Das bezieht sich bestimmt auf das Board und nicht auf den µC.
Auf dem µC steht AVR128DB48   2020   9JR.
Laut Errata gibts nur Revision 4 und 5 wobei 4 nie ausgeliefert wurde, 
also bleibt nur Revision 5 übrig.
19% MwSt. wurden mir auch berechnet, etwas frech.

Edit:
Alles klar, ich nehme alles zurück. In der Doku zum Board stehts drin. 
Board Rev.2 mit Chip Rev.4. Bin ich jetzt nicht davon ausgegangen wenn 
man das Chip Errata liest. Etwas ärgerlich.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> woran erkennst du die Revision?
Schrieb ich doch:
> 'A09‑3372/02'
Das steht auf dem Aufkleber der Platine. Und im User-Guide steht:

6.1 Identifying Product ID and Revision
...
6.2 Revision 3
AVR128DB48 silicon revision A5 or later is mounted on this revision of 
the board.
6.3 Revision 2
Revision 2 is the initially released board revision.
AVR128DB48 silicon revision A4 is mounted on this revision of the board.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

okay. Erklärt vielleicht mein Problemchen mit dem CFD in der Rev.4 
Errata 2.5.1 wenn ein Fehler im Status Bit ist mit external Clock.

Kann man sich bei denen beschweren das die alte Revisionen ausliefern? 
Also nehmen die das ernst oder lachen darüber?

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> Also nehmen die das ernst oder lachen darüber?

Weiß ich nicht, vielleicht wundern sie sich auch.
Was mich betrifft, so bin ich mit dem Board zufrieden, das Allermeiste 
lässt sich ja austesten. Noch zufriedener wäre ich, wenn denn die 
28-PDIP tatsächlich Anfang November kämen (which I am doubtful of).

von Veit D. (devil-elec)


Lesenswert?

Hallo,

kannst du erkennen welche Revision deine einzelnen µC haben?
Die sollten theoretisch Rev.5 sein.

von S. Landolt (Gast)


Lesenswert?

Kann ich beantworten, wenn ich sie habe, Anfang November.
Bislang ist ja nur diese Platine aus der Anfangsproduktion angekommen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

achso, ich dachte du hättest schon Einzellieferungen bekommen die nach 
und nach eintrudeln. Alles klar.

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

an Veit Devil:

Ich habe es mal ausprobiert, und da ich mich glaube zu erinnern, dass 
Sie, zumindest früher, auch in Assembler programmieren, hänge ich das 
Programm an: die LED auf der Platine ist zunächst aus, ein Antippen von 
J215 mit einem Schraubendreher schaltet sie ein.

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

Noch eine Spielerei (bevor ich mich verabschiede): schnelles Blinken 
zeigt den Normalbetrieb (16 MHz) an, ein paarmal langsam blinken den 
"Notbetrieb" (4 MHz).

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Danke für den Test, habe aber mit Assembler noch nichts gemacht.  :-)
Habe versucht es zu übersetzen, bin auch sicher das es genau 1:1 
nachgebaut ist, funktioniert leider nicht wenn ich J215 berühre. Hatte 
auch noch deine Bits statt den Defines probiert.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
int main(void)
5
{
6
    VPORTB_DIR = 0x03;
7
    VPORTB_OUT = 0x03;
8
    
9
    // enable CFD Interrupt
10
    CPU_CCP = CCP_IOREG_gc;
11
    CLKCTRL.MCLKINTCTRL = CLKCTRL_CFD_bm;
12
    
13
    // enable crystal oscillator with frequency range 16MHz
14
    CPU_CCP = CCP_IOREG_gc;
15
    CLKCTRL.XOSCHFCTRLA = (CLKCTRL_FRQRANGE_16M_gc | CLKCTRL_ENABLE_bm);
16
        
17
    // select external clock
18
    CPU_CCP = CCP_IOREG_gc;
19
    CLKCTRL.MCLKCTRLA = CLKCTRL_CLKSEL_EXTCLK_gc;
20
        
21
    // enable CFD on XOSCHF
22
    CPU_CCP = CCP_IOREG_gc;
23
    CLKCTRL.MCLKCTRLC = CLKCTRL_CFDEN_bm;
24
    
25
    while (1) 
26
    {
27
    }
28
}
29
30
ISR(CLKCTRL_CFD_vect)
31
{
32
  VPORTB_IN = 0x03;                       // toggle
33
  CLKCTRL.MCLKINTFLAGS = CLKCTRL_CFD_bm;  // clear the CFD interrupt flag
34
}

von S. Landolt (Gast)


Lesenswert?

Guten Morgen,

die LED ist an B3 angeschlossen, folglich alle drei '0x03' ersetzen 
durch '0x08' bzw. '(1<<3)'.
  cbi und sbi greifen auf die Bitposition zu: 'Clear Bit in I/O 
Register' bzw. 'Set Bit ...'.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ja stimmt, Bitfehler und sei() fehlte noch.
Danke. Funktioniert.  :-)

von S. Landolt (Gast)


Lesenswert?

> Funktioniert.
Prima.
Sonst wäre es ja auch kein CFD, sondern ein CDF - Clock Detection 
Failure.

Aber eine andere Frage: Haben Sie ein besseres Datenblatt der 
AVR128DB-Serie, oder wie kommen Sie an diesem äußerst lästigen 'Content 
Copying: Not Allowed' vorbei? Ich kann nicht mal eben zitieren, 
geschweige denn diese ellenlangen Variablennamen schnell mit copy&paste 
ins Programm übernehmen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wollen wir nicht mal langsam Du sagen?   :-)   Ich bin Veit.

Ich arbeite parallel mit dem Headerfile. Aber man kann das pdf 
problemlos hier https://smallpdf.com/de/pdf-passwort-entfernen von allen 
befreien lassen. Musst nur das große Indianerehrenwort abnicken.  :-)

Abschließend Sicherheitshalber nochmal durch den Virenscanner jagen.
https://www.virustotal.com   Alles clean.

von S. Landolt (Gast)


Lesenswert?

Guten Morgen, Veit,

ganz herzlichen Dank für den Tipp, hat geklappt. Wobei ich mich 
allerdings frage, weshalb dabei aus 5.5 MB 6.8 werden, aber erstmal 
egal.
  Welcher Teufel hat bloß Microchip geritten, plötzlich Datenblätter in 
dieser Art zu beschränken, das gab's doch früher nicht.

Was nun den anderen Punkt betrifft, so kann ich ja schlecht sagen 
"Hallo, ich bin der S." - aber Spaß beiseite, ich tue mich schwer mit 
der ubiquitären Duzerei und bleibe lieber beim 'Sie', und solange sich 
auch der Forumsbetreiber noch nicht gänzlich davon verabschiedet hat 
(siehe unten), fühle ich mich in nicht allzu schlechter Gesellschaft.
  Das soll aber unsere Freundschaft nicht trüben, schreiben Sie ruhig 
'du'; mir jedoch geht es einfach nicht aus den zehn Fingern.

von Wilhelm M. (wimalopaan)


Lesenswert?

S. Landolt schrieb:
>> Also nehmen die das ernst oder lachen darüber?
>
> Weiß ich nicht, vielleicht wundern sie sich auch.
> Was mich betrifft, so bin ich mit dem Board zufrieden, das Allermeiste
> lässt sich ja austesten. Noch zufriedener wäre ich, wenn denn die
> 28-PDIP tatsächlich Anfang November kämen (which I am doubtful of).

Gerade kam die Mail, dass die AVR128DB32 am 06.01.2021 ausgeliefert 
werden sollen :-(

von S. Landolt (Gast)


Lesenswert?

> ... die AVR128DB32 am 06.01.2021 ...

Tja, schlecht.
Bei mir nicht Neues, also sollte noch "30-Oct-2020" gelten - aber bei 
meiner doch eher ungebräuchlichen Gehäusevariante PDIP ...

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

S. Landolt schrieb:
> Tja, schlecht.
> Bei mir nicht Neues, also sollte noch "30-Oct-2020" gelten - aber bei
> meiner doch eher ungebräuchlichen Gehäusevariante PDIP ...

Warum hast du keine Samples bestellt, das ging bei mir deutlich 
schneller.
Nach 3/4 Wochen langen die PDIP's im Brifkasten. Jetzt musss ich nur 
noch GCC 10.x dazu bringen die Klötzer zu mögen.

Von Mplabx mit AVR bin ich fast geheilt, da geht LTO nicht ohne prof 
Licence. Dreist!
AS7 ist bei mir viel stabiler und performater als Mplabx.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich habe zu der Dateigröße nur eine Vermutung. Das PW wird nicht durch 
bearbeiten von paar Bits entfernt, es werden alle Seiten durchgegangen 
und das pdf neu abgespeichert. Jetzt vermute ich das dabei vorbeugend 
eine höhere Qualitätsstufe für die Komprimierung angewendet wird, um 
keine krassen/zusätzlichen Verluste für die eingebetteten Bilder zu 
erhalten. Das ist der Nachteil vom nochmaligen speichern mit weniger 
Komprimierung. Größere  Dateigröße ohne Detailgewinn.

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Apollo M. schrieb:

> Jetzt musss ich nur noch GCC 10.x dazu bringen die Klötzer zu mögen.

Wenn ich auch einmal etwas zurückgeben darf. Ich habe mir dafür 3 
Batchdateien gebaut.
Im Bild sieht man meine Ordnerstruktur.
Die entpackten DevicePacks und den Ordner von der Toolchain.
Jetzt muss man nur noch in allen .bat Files in den ersten beiden Zeilen 
die Pfade/Ordnername vom DevicePack und seinem Toolchain Ordner ändern.
Danach alle .bat ausführen lassen. Zum Schluss noch die µC in die io.h 
eintragen.
1
/* begin new AVR128DBxx */
2
#elif defined (__AVR_AVR128DB28__)
3
#  include <avr/ioavr128db28.h>
4
#elif defined (__AVR_AVR128DB32__)
5
#  include <avr/ioavr128db32.h>
6
#elif defined (__AVR_AVR128DB48__)
7
#  include <avr/ioavr128db48.h>
8
#elif defined (__AVR_AVR128DB64__)
9
#  include <avr/ioavr128db64.h>
10
/* end new AVR128DBxx */

Wenn die µC irgendwann im avr-gcc schon eingebaut sind, ist das kopieren 
der specfiles nicht mehr notwendig. Darüber weiß Johann mehr wie ich. 
:-)

Wer die .bat erstmal trocken testen möchte, schreibt in die Zeile 
Optionen noch ein '/L' rein und schaut sich die Ausgaben oder das 
Logfile an.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

weil jemand nach einer Bezugsquelle fragte. TME hat mehrere AVR128DA und 
drei   verschiedene AVR128DB (28, 48 und 64 Pin) auf Lager laut deren 
Anzeige. Filter "AVR128" und "auf Lager" setzen.

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.