André D. schrieb:
> Ich habe mit AVR-Studio immer nur den Build-Button betätigt und
> fertig...
Das einzige, was ich mit AVR-Studio gemacht hab, war den Klops wieder zu
entsporgen. VOn daher kann ich dir da nicht weiterhelfen. Die IDE ist
u.a. eine Overfläche für den Compiler (avr-gcc). Wie der bedient wird
hat mit dem Studio nix zu tun.
André D. schrieb:
> Und warum ist bei den Definitionen in der iom8515.h der Adresswert von
> irgendeinem Port/Register oder was auch immer.... immer um 0x20
> niedriger als es mir im I/O-View des AVR-Studio angezeigt wird ???
> (z.B. OCR1A = 0x2A in iom und 0x4A im AVR Studio)
Keine Ahnung das der Klops anzeigt. Nicht-Xmega habe unterschiedliche
Adressen für IN / OUT bzw. LDS / STS. Adresse 0x0 für IN entspricht
z.B. Adresse 0x20 für LDS.
Um diese unterschiedlichen Offsets brauchst du dich aber nicht zu
kümmern, das wird alles vom Compiler erledigt. Diese Offsets musst du
nur bei (Inline-)Assembler beachten.
> JTAG-Interface eines ATmega16 per Software deaktivieren
Im Datebnblatt steht:
1 | MCU Control and Status Register - MCUCSR
|
2 |
|
3 | · Bit 7 - JTD: JTAG Interface Disable
|
4 |
|
5 | When this bit is zero, the JTAG interface is enabled if the JTAGEN
|
6 | Fuse is programmed. If this bit is one, the JTAG interface is disabled.
|
7 | In order to avoid unintentional disabling or enabling of the JTAG
|
8 | interface, a timed sequence must be followed when changing this bit:
|
9 | The application software must write this bit to the desired value twice
|
10 | within four cycles to change its value.
|
> MCUCSR |= (1<<JTD);
> MCUCSR |= (1<<JTD); // 2 mal in Folge ,vgl. Datenblatt fuer mehr
Mögliches Problem entsteht wenn der erzeugte Code länger als 4 Ticks
braucht, was z.B. bei deaktivierter Optimierung passieren könnte. Daher
würd ich da ne eigene Funktion machen, die das erledigt und eine
bestimmte Sequenz garantiert. Beispiel:
1 | #include <avr/io.h>
|
2 | #include <util/atomic.h>
|
3 |
|
4 | static inline void jtag_disable (void)
|
5 | {
|
6 | ATOMIC_BLOCK (ATOMIC_RESTORESTATE)
|
7 | {
|
8 | #if defined (__AVR_ATmega16__)
|
9 | uint8_t jtd = 1u << JTD;
|
10 | __asm volatile ("sts %a0, %1" "\n\t"
|
11 | "sts %a0, %1"
|
12 | :: "n" (& MCUCSR), "r" (jtd): "memory");
|
13 | #else
|
14 | #error Fix jtag_disable for MCU!
|
15 | #endif
|
16 | } // atomic block
|
17 | }
|
Außerdem würd ich auf keinen Fall eine 1 auf-odern, weil das Probleme
gibt falls das JTRF Flag gesetzt ist.
Falls der Wert von MCUCSR früh (vor main) gelesen werden soll, um die
Reset-Ursache (WatchDog, PowerDown, External, ...) zu erfahren, ist
nochmal anderer Code notwendig.