Moin,
(natürlich 100nF - wer hat das Zeichen um 180° gedreht) Habe in meinem
Programm mal einige Zeilen (// <-- ) eingefügt, um die Resetbedingung
herauszubekommen.
Am Port A messe ich folgendes timing:
PA0 PORF ist 1, wenn das Programm läuft, sonst 0
PA1 EXTRF ist 1, wenn das Programm läuft, sonst 0
PA2 BORF ist 1, wenn das Programm läuft, sonst 0
PA3 WDRF ist 1, wenn das Programm läuft, sonst 0
PA4 JTRF ist 0, wenn das Programm läuft, sonst 0
Ich habe also immer 4 gültige Resetbedingungen????
Was mir noch eingefallen ist. Das Programm hat schon mal richtig
funktioniert. Ich glaube der 644 hat dies Verhalten erst, seid ich die
WDTON Fuse gesetzt habe. Kann es sein, dass der 644 einfach 'nur' defekt
ist? Denn ein 'rumspielen' mit WDTON oder dem WDTCSR-Register zeigt
keine Wirkung.
Gruß
Peter
1 | #include <avr/io.h>
|
2 |
|
3 | int main (void) {
|
4 | char a = 0; // <-- Variable für Reset
|
5 | a = MCUSR; // <-- Resetbedingung Merken
|
6 |
|
7 | DDRA = 0xff; // <-- Datenrichtung PORT A setzen
|
8 | DDRC = 0xff;
|
9 |
|
10 | MCUSR |= // MCU Status Register löschen
|
11 | (0<<JTRF) // JTAG Reset Flag
|
12 | | (0<<WDRF) // Watchdog Reset Flag
|
13 | | (0<<BORF) // Brown-out Reset Flag
|
14 | | (0<<EXTRF) // External Reset Flag
|
15 | | (0<<PORF); // Power-on Reset Flag
|
16 |
|
17 | WDTCSR |= // Watchdog Timer Controll Register
|
18 | (1<<WDP0) // Watchdog Timer Prescaler 0
|
19 | | (0<<WDP1) // Watchdog Timer Prescaler 1
|
20 | | (0<<WDP2) // Watchdog Timer Prescaler 2
|
21 | | (1<<WDP3) // Watchdog Timer Prescaler 3
|
22 | | (0<<WDE) // Watchdog System Reset Enable
|
23 | | (0<<WDCE) // Watchdog Change Enable
|
24 | | (0<<WDIE) // Watchdog Interrupt Enable
|
25 | | (0<<WDIF); // Watchdog Interrupt Flag
|
26 |
|
27 | // Hauptprogramm (Endlosschleife)
|
28 | PORTA = a; // <-- Reset an Port A ausgeben
|
29 | while(1){
|
30 | PORTC ^= _BV(PC1); // toggel Pin PC1
|
31 | }
|
32 | return 0;
|
33 | }
|