Forum: Compiler & IDEs Codeschloss Timeout


von AlexL (Gast)


Lesenswert?

Hallo!

Ich habe ein Codeschloss für meine Eingangstür mit dem ATMEGA8 
realisiert. Es muss ein 6-stelliger Code eingegben werden, damit der 
Türöffner betätigt wird.

Ich suche nun nach einer Möglichkeit bei längerer Unterbrechung der 
Tastendrücke den Array-Counter zurückzusetzen und somit den Code als 
ungültig zu deklarieren.

Dazu habe ich mir mal den 16bit-Counter des Atmega8 angesehen - leider 
komme ich nicht weiter... irgendwie läuft er nicht...

1
ISR(TIMER1_CAPT_vect)
2
{
3
GICR |= (1<<INT0);   //Timer Interrupts einschalten
4
TIMSK |= (1<<TOIE1);   //Timer1 Interrupt enabled
5
j=0; //Arrayzähler zurücksetzen
6
PORTD |= (1<<PD3); //Akustikes Warnsignal für ungültige Eingabe ausgeben (Summer)
7
_delay_ms(500);
8
PORTD &= ~(1<<PD3);
9
}
10
11
12
int main() {
13
14
TIMSK |= (1<<TICIE1);
15
TCCR1B |= (1<<CS10)|(1<<CS11); //Vorzähler auf 64 = alle 4,19 Sekunden ohne Tastendruck zurücksetzen (nur Testweise - später längere Zeit (10 sek.)
16
...
17
}

Leider reagiert der Timer1 überhaupt nicht. Was habe ich falsch gemacht? 
Das Relais für den Türöffner zieht bei richtiger Kombination an.

von Stefan E. (sternst)


Lesenswert?

Erklär doch mal etwas genauer, wie du dir die Funktionsweise gedacht 
hattest. Ich sehe nämlich nicht, wie du über einen 
Input-Capture-Interrupt den Timeout realisieren willst.

von AlexL (Gast)


Lesenswert?

Der Timerzähler wird bei jedem Tastendruck auf 0 gesetzt um ihn vor dem 
Überlauf zu schützen. Wenn dieser Tastendruck eine Zeit lang ausbleibt 
gibt es einen Overflow und die array-Zähl-Variable j wird auf 0 
zurückgesetzt (=erste Zahl).

Ich vermute, dass ich die Interrupts falsch freigeschaltet habe - weiß 
aber nicht wo.

von Stefan E. (sternst)


Lesenswert?

> Wenn dieser Tastendruck eine Zeit lang ausbleibt
> gibt es einen Overflow ...

Du hast in deinem Code aber einen Input-Capture-Interrupt, keinen 
Overflow-Interrupt.

TIMSK |= (1<<TICIE1);  ->  TIMSK |= (1<<TOIE1);
ISR(TIMER1_CAPT_vect)  ->  ISR(TIMER1_OVF_vect)

von Walter (Gast)


Lesenswert?

ziemliche Raterei mit so codeschnipslen, trotzdem ein Tipp:

hast du irgendwo ein sei?

von AlexL (Gast)


Lesenswert?

sorry für die Rätselraterei. Hier der komplette Code:
1
#include <avr/io.h> 
2
#include <stdint.h>
3
#include <stdio.h>
4
#include <stdlib.h>
5
#define F_CPU 1000000UL
6
#ifndef F_CPU 
7
#warning "F_CPU war noch nicht definiert, wird nun mit 1MHz definiert"
8
#define F_CPU 1000000UL     /* Quarz mit 1 Mhz  */
9
#endif
10
#include <util/delay.h>
11
12
13
int j;
14
15
16
ISR(TIMER1_OVF_vect)
17
{
18
GICR |= (1<<INT0);   
19
TIMSK |= (1<<TOIE1);   
20
j=0;
21
PORTC |= (1<<PC5);
22
_delay_ms(500);
23
PORTC &= ~(1<<PC5);
24
}
25
26
27
28
int main() {
29
TIMSK |= (1<<TOIE1);
30
TCCR1B |= (1<<CS10)|(1<<CS11);
31
int t[6]={0,0,0,0,0,0};
32
33
DDRC  = 0b00100111;
34
PORTC = 0b00011000;
35
DDRD  = 0b00001000;
36
PORTD = 0b00000011;
37
38
j=0;
39
while (1==1) {
40
41
//Scan
42
PORTC &= ~(1<<PC0);
43
PORTC |= (1<<PC2) | (1<<PC1);
44
_delay_ms(10);
45
if ( !(PINC & (1<<PINC3)) ) {t[j]=3; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
46
if ( !(PINC & (1<<PINC4)) ) {t[j]=6; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
47
if ( !(PIND & (1<<PIND1)) ) {t[j]=9; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
48
if ( !(PIND & (1<<PIND0)) ) {t[j]=12; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
49
PORTC &= ~(1<<PC1);
50
PORTC |= (1<<PC2) | (1<<PC0);
51
_delay_ms(10);
52
if ( !(PINC & (1<<PINC3)) ) {t[j]=2; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
53
if ( !(PINC & (1<<PINC4)) ) {t[j]=5; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
54
if ( !(PIND & (1<<PIND1)) ) {t[j]=8; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
55
if ( !(PIND & (1<<PIND0)) ) {t[j]=10; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
56
PORTC &= ~(1<<PC2);
57
PORTC |= (1<<PC1) | (1<<PC0);
58
_delay_ms(10);
59
if ( !(PINC & (1<<PINC3)) ) {t[j]=1; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
60
if ( !(PINC & (1<<PINC4)) ) {t[j]=4; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
61
if ( !(PIND & (1<<PIND1)) ) {t[j]=7; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
62
if ( !(PIND & (1<<PIND0)) ) {t[j]=11; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
63
if (j>5) {
64
j=0;
65
66
67
68
if (t[0]==1 && t[1]==2 && t[2]==1 && t[3]==10 && t[4]==10 && t[5]==5) {
69
PORTC |= (1<<PC5);
70
_delay_ms(100);
71
PORTC &= ~(1<<PC5); 
72
_delay_ms(100);
73
PORTC |= (1<<PC5);
74
_delay_ms(100);
75
PORTC &= ~(1<<PC5); 
76
77
PORTD |= (1<<PD3);
78
_delay_ms(5000);
79
PORTD &= ~(1<<PD3);
80
81
} else {
82
//Code falsch
83
PORTC |= (1<<PC5);
84
_delay_ms(300);
85
PORTC &= ~(1<<PC5); 
86
_delay_ms(300);
87
PORTC |= (1<<PC5);
88
_delay_ms(300);
89
PORTC &= ~(1<<PC5); 
90
_delay_ms(300);
91
PORTC |= (1<<PC5);
92
_delay_ms(300);
93
PORTC &= ~(1<<PC5); 
94
95
96
}
97
}
98
}
99
}

nein, ein sei hab ich nicht - was ist das?

von AlexL (Gast)


Lesenswert?

Hallo nochmal!

Sorry für den Doppelpost. Habe mich mal im Internet bzw. hier im 
Tutorial schlau gemacht was sei(); ist. Hier mein aktueller Code, 
welcher leider immer noch nicht funktioniert... habe ein paar Kommentare 
zum besseren Verständnis in den Code gebaut.

Wie kann ich den Interrupt-Timer auf 0 zurücksetzen?

So wie es zur Zeit programmiert ist müsste der Summer alle 4,1 Sek. 
einen Pieps von sich geben, was er aber nicht macht. Scheinbar wird die 
INT-Routine nicht aufgerufen.
1
#include <avr/io.h> 
2
#include <stdint.h>
3
#include <stdio.h>
4
#include <stdlib.h>
5
#define F_CPU 1000000UL
6
#ifndef F_CPU 
7
#warning "F_CPU war noch nicht definiert, wird nun mit 1MHz definiert"
8
#define F_CPU 1000000UL     /* Quarz mit 1 Mhz  */
9
#endif
10
#include <util/delay.h>
11
#include <avr/interrupt.h>  
12
13
14
15
volatile int j;
16
17
18
19
ISR(TIMER1_OVF_vect) {
20
21
j=0;
22
PORTC |= (1<<PC5); //Summer aktivieren
23
_delay_ms(500);
24
PORTC &= ~(1<<PC5); //Summer deaktivieren
25
26
}
27
28
29
30
int main() {
31
TCCR1B |= (1<<CS10)|(1<<CS11); //Vorteiler Interrupt auf 64 (=alle 4,1 Sek)
32
TIMSK |= (1<<TOIE1); //Timer1 Interrupt aktivieren
33
sei(); //Interrupts global aktivieren
34
int t[6]={0,0,0,0,0,0}; //Gedrückte Tasten-Array (000000=Initialwert)
35
36
DDRC  = 0b00100111; //Ein - Ausgänge beschalten
37
PORTC = 0b00011000;
38
DDRD  = 0b00001000;
39
PORTD = 0b00000011;
40
41
j=0; //Erste Stelle vom Codeschloss aktiv setzen
42
while (1==1) {
43
44
//Scan der Tasten
45
PORTC &= ~(1<<PC0);
46
PORTC |= (1<<PC2) | (1<<PC1);
47
_delay_ms(10);
48
if ( !(PINC & (1<<PINC3)) ) {t[j]=3; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); } //Hier würde ich gerne jedesmal den INTR-Zähler auf 0 setzen
49
if ( !(PINC & (1<<PINC4)) ) {t[j]=6; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
50
if ( !(PIND & (1<<PIND1)) ) {t[j]=9; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
51
if ( !(PIND & (1<<PIND0)) ) {t[j]=12; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
52
PORTC &= ~(1<<PC1);
53
PORTC |= (1<<PC2) | (1<<PC0);
54
_delay_ms(10);
55
if ( !(PINC & (1<<PINC3)) ) {t[j]=2; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
56
if ( !(PINC & (1<<PINC4)) ) {t[j]=5; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
57
if ( !(PIND & (1<<PIND1)) ) {t[j]=8; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
58
if ( !(PIND & (1<<PIND0)) ) {t[j]=10; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
59
PORTC &= ~(1<<PC2);
60
PORTC |= (1<<PC1) | (1<<PC0);
61
_delay_ms(10);
62
if ( !(PINC & (1<<PINC3)) ) {t[j]=1; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
63
if ( !(PINC & (1<<PINC4)) ) {t[j]=4; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
64
if ( !(PIND & (1<<PIND1)) ) {t[j]=7; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
65
if ( !(PIND & (1<<PIND0)) ) {t[j]=11; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
66
if (j>5) {
67
j=0;
68
69
70
71
if (t[0]==1 && t[1]==2 && t[2]==1 && t[3]==10 && t[4]==10 && t[5]==5) {
72
//richtige Tastenfolge - 2 kurze Pieps und Relais für Türöffner (PD3) aktivieren 5sek. lang.
73
PORTC |= (1<<PC5);
74
_delay_ms(100);
75
PORTC &= ~(1<<PC5); 
76
_delay_ms(100);
77
PORTC |= (1<<PC5);
78
_delay_ms(100);
79
PORTC &= ~(1<<PC5); 
80
81
PORTD |= (1<<PD3);
82
_delay_ms(5000);
83
PORTD &= ~(1<<PD3);
84
85
} else {
86
//Code falsch
87
//3 lange Pieps über Summer PC5
88
PORTC |= (1<<PC5);
89
_delay_ms(300);
90
PORTC &= ~(1<<PC5); 
91
_delay_ms(300);
92
PORTC |= (1<<PC5);
93
_delay_ms(300);
94
PORTC &= ~(1<<PC5); 
95
_delay_ms(300);
96
PORTC |= (1<<PC5);
97
_delay_ms(300);
98
PORTC &= ~(1<<PC5); 
99
}
100
}
101
}
102
}


Gruß,

Alex

von Stefan E. (sternst)


Lesenswert?

> Wie kann ich den Interrupt-Timer auf 0 zurücksetzen?

TCNT1 = 0;

> So wie es zur Zeit programmiert ist müsste der Summer alle 4,1 Sek.
> einen Pieps von sich geben, was er aber nicht macht. Scheinbar wird die
> INT-Routine nicht aufgerufen.

Ich kann keinen Fehler sehen, und in der Simulation wird der Interrupt 
brav alle 4,19 Sek ausgeführt.

von AlexL (Gast)


Lesenswert?

sehr seltsam.... muß man evtl. wenn man ein einer ISR auf einen Port 
zugreift irgend etwas beachten?

von Stefan E. (sternst)


Lesenswert?

AlexL wrote:
> sehr seltsam.... muß man evtl. wenn man ein einer ISR auf einen Port
> zugreift irgend etwas beachten?

Nein.

Gibt der Compiler irgendwelche Meldungen/Warnungen aus?
Funktioniert das Flashen einwandfrei?
Flasht du vielleicht ein altes HEX-File?
Geht der Summer überhaupt?

von AlexL (Gast)


Lesenswert?

Build succeeded with 0 Warnings...
Summer geht. Habe eben testweise statt dem Summer das Relais ansprechen 
lassen - funktioniert auch nicht.  Das Hex-File das ich geladen habe 
ändert sich mit jedem Build - ist also das richtige. Hab Verify 
angestellt. Verify successful.

von X. H. (shadow0815)


Lesenswert?

#define F_CPU 1000000UL     /* Quarz mit 1 Mhz  */
//Vorteiler Interrupt auf 64 (=alle 4,1 Sek)
---
Wie kommt man auf 4,1 Sek?


1000000/64=15625

1/15625= 64us

von Stefan E. (sternst)


Lesenswert?

X. H. wrote:
> #define F_CPU 1000000UL     /* Quarz mit 1 Mhz  */
> //Vorteiler Interrupt auf 64 (=alle 4,1 Sek)
> ---
> Wie kommt man auf 4,1 Sek?
>
>
> 1000000/64=15625
>
> 1/15625= 64us

64µs * 65536 = 4,194304s

Der Interrupt kommt immer, wenn der Timer (16-Bit) überläuft.

von AlexL (Gast)


Lesenswert?

Habe eine komische Beobachtung durch Zufall gemacht. Die Funktion main 
sollte ja erst ab while(1) {] ständig wiederholt werden. Jedoch zieht 
das Relais alle 4,1 Sekunden an, obwohl das nur am Anfang passieren 
sollte. Scheinbar macht der AVR bei jedem Timerüberlauf einen Reset - 
Durch was könnte das ausgelöst werden? Watchdog? Ist eigentlich nicht 
aktiviert...
1
#include <avr/interrupt.h>  
2
#include <avr/io.h> 
3
#include <stdint.h>
4
#include <stdio.h>
5
#include <stdlib.h>
6
#define F_CPU 1000000UL
7
#ifndef F_CPU 
8
#warning "F_CPU war noch nicht definiert, wird nun mit 1MHz definiert"
9
#define F_CPU 1000000UL     /* Quarz mit 1 Mhz  */
10
#endif
11
#include <util/delay.h>
12
13
14
15
16
volatile int j;
17
18
19
20
ISR(TIMER1_OVF_vect) {
21
//j=0;
22
//PORTD |= (1<<PD3);
23
//_delay_ms(200);
24
//PORTD &= ~(1<<PD3);
25
26
}
27
28
29
30
int main() {
31
sei();
32
TCCR1B |= (1<<CS10)|(1<<CS11); //Vorteiler Interrupt auf 64 (=alle 4,1 Sek)
33
TIMSK |= (1<<TOIE1); //Timer1 Interrupt aktivieren
34
//RELAIS ANZIEHEN - DAS HIER WIRD KOMISCHERWEISE ALLE 4,1 SEK ohne Tastendruck wiederholt.
35
PORTD |= (1<<PD3);
36
_delay_ms(200);
37
PORTD &= ~(1<<PD3);
38
39
int t[6]={0,0,0,0,0,0};
40
41
DDRC  = 0b00100111;
42
PORTC = 0b00011000;
43
DDRD  = 0b00001000;
44
PORTD = 0b00000011;
45
j=0;
46
while (1) {
47
48
//Scan
49
PORTC &= ~(1<<PC0);
50
PORTC |= (1<<PC2) | (1<<PC1);
51
_delay_ms(10);
52
if ( !(PINC & (1<<PINC3)) ) {t[j]=3; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
53
}
54
if ( !(PINC & (1<<PINC4)) ) {t[j]=6; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
55
}
56
if ( !(PIND & (1<<PIND1)) ) {t[j]=9; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
57
}
58
if ( !(PIND & (1<<PIND0)) ) {t[j]=12; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
59
}
60
PORTC &= ~(1<<PC1);
61
PORTC |= (1<<PC2) | (1<<PC0);
62
_delay_ms(10);
63
if ( !(PINC & (1<<PINC3)) ) {t[j]=2; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
64
}
65
if ( !(PINC & (1<<PINC4)) ) {t[j]=5; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
66
}
67
if ( !(PIND & (1<<PIND1)) ) {t[j]=8; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
68
}
69
if ( !(PIND & (1<<PIND0)) ) {t[j]=10; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
70
}
71
PORTC &= ~(1<<PC2);
72
PORTC |= (1<<PC1) | (1<<PC0);
73
_delay_ms(10);
74
if ( !(PINC & (1<<PINC3)) ) {t[j]=1; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
75
}
76
if ( !(PINC & (1<<PINC4)) ) {t[j]=4; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
77
}
78
if ( !(PIND & (1<<PIND1)) ) {t[j]=7; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
79
}
80
if ( !(PIND & (1<<PIND0)) ) {t[j]=11; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
81
}
82
if (j>5) {
83
j=0;
84
85
86
87
if (t[0]==1 && t[1]==2 && t[2]==1 && t[3]==10 && t[4]==10 && t[5]==5) {
88
PORTC |= (1<<PC5);
89
_delay_ms(100);
90
PORTC &= ~(1<<PC5); 
91
_delay_ms(100);
92
PORTC |= (1<<PC5);
93
_delay_ms(100);
94
PORTC &= ~(1<<PC5); 
95
96
PORTD |= (1<<PD3);
97
_delay_ms(5000);
98
PORTD &= ~(1<<PD3);
99
100
} else {
101
//Code falsch
102
PORTC |= (1<<PC5);
103
_delay_ms(300);
104
PORTC &= ~(1<<PC5); 
105
_delay_ms(300);
106
PORTC |= (1<<PC5);
107
_delay_ms(300);
108
PORTC &= ~(1<<PC5); 
109
_delay_ms(300);
110
PORTC |= (1<<PC5);
111
_delay_ms(300);
112
PORTC &= ~(1<<PC5); 
113
114
115
}
116
}
117
118
}
119
}

von Stefan E. (sternst)


Lesenswert?

Gibst du dem Compiler auch den korrekten mcu-Wert mit?

von AlexL (Gast)


Lesenswert?

Was ist denn der mcu-Wert? Ich denke nicht... finde in Google aber 
nichts darüber.

von AlexL (Gast)


Lesenswert?

achso.... falls du den Controller-Typ meinst... ja, unter Project -> 
Configuration Options ist bei Device "atmega8" ausgewählt.

von Stefan E. (sternst)


Lesenswert?

Und du benutzt auch wirklich einen Mega8, keinen Mega88 oder so?

von AlexL (Gast)


Lesenswert?

ja. Auf dem Chip steht ATMEGA8-16PU.

von AlexL (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch ergänzend das Schaltbild. Vielleicht hilft das weiter falls 
ich was übersehen habe...

von Stefan E. (sternst)


Lesenswert?

Ok, letzter Versuch.
Mach mal bitte ein "Rebuild All" und poste die Zeilen, die mit 
"avr-gcc.exe" beginnen.

von AlexL (Gast)


Lesenswert?

Build started 15.6.2008 at 14:02:13
      0 [main] sh 816 sync_with_child: child 1732(0x120) died before 
initialization with status code 0x0
  65636 [main] sh 816 sync_with_child: *** child state waiting for 
longjmp
/usr/bin/sh: fork: Resource temporarily unavailable
avr-gcc.exe  -mmcu=atmega8 -Wall -gdwarf-2    -DF_CPU=1000000UL -Os 
-fsigned-char -MD -MP -MT Türschloss.o -MF dep/Türschloss.o.d  -c 
../Türschloss.c
avr-gcc.exe -mmcu=atmega8  Türschloss.o     -o Türschloss.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 --no-change-warnings -O ihex 
Türschloss.hex Türschloss.eep || exit 0
      0 [main] sh 5012 sync_with_child: child 4792(0x118) died before 
initialization with status code 0x0
  53029 [main] sh 5012 sync_with_child: *** child state waiting for 
longjmp
/usr/bin/sh: fork: Resource temporarily unavailable
make: [Türschloss.eep] Error 128 (ignored)

AVR Memory Usage
----------------
Device: atmega8

Program:    1212 bytes (14.8% Full)
(.text + .data + .bootloader)

Data:          2 bytes (0.2% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...

von Stefan E. (sternst)


Lesenswert?

Bei der Hardware fehlt auf jeden Fall noch ein Abblockkondensator am µC.

von AlexL (Gast)


Lesenswert?

zwischen VCC und GND meinst du? Welche Größe? 100n? Löte ich gleich ein.

von Stefan E. (sternst)


Lesenswert?

Ja, Keramik oder Folie, möglichst nahe am IC.

von AlexL (Gast)


Lesenswert?

hab einen 100nF Kerko 0805 direkt zwischen Pin 7 und 8 gelötet - leider 
keine Besserung.

von AlexL (Gast)


Lesenswert?

Was ein Sonntag...  ;)

Ich habe noch ein paar Dinge ausprobiert...

1. Ich habe mein stab. Labornetzteil hinter den Festspannungsregler 
gelegt (dachte vielleicht reicht der Strom nicht aus)

2. Habe mit dem Oszi am Resetpin gemessen - kein GND-Impuls - also 
eigentlich auch kein ungewollter Reset.

3. Fuses habe ich kontrolliert, dass kein Watchdog oder Brown-Out 
aktiviert ist. 1MHz interner Takt ist aktiv.

Irgendwie fängt der µC nach Ablauf des Timer1 das Programm von vorne an 
zu durchlaufen. Habe testweise mal den Timer0 genommen - genau das 
gleiche. Das der Ablauf des Timers dafür verantwortlich ist ist ziemlich 
sicher... wenn ich nämlich Tasten drücke während er läuft verzögert sich 
der Reset um weitere 4,1 Sek.

Mir scheint es fast so als kenne er die Einsprungadresse für den 
Timer1Overflow INTR nicht und nimmt dann anstelle dieser Adresse die 
Adresse 0000.

Hätte ich den µC nicht fest in die Schaltung eingelötet würde ich mal 
den Baustein wechseln - aber es gehen ja alle anderen Funktionen...

Hat noch jemand eine Idee? Dankeschön!

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.