mikrocontroller.net

Forum: Compiler & IDEs Codeschloss Timeout


Autor: AlexL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...



ISR(TIMER1_CAPT_vect)
{
GICR |= (1<<INT0);   //Timer Interrupts einschalten
TIMSK |= (1<<TOIE1);   //Timer1 Interrupt enabled
j=0; //Arrayzähler zurücksetzen
PORTD |= (1<<PD3); //Akustikes Warnsignal für ungültige Eingabe ausgeben (Summer)
_delay_ms(500);
PORTD &= ~(1<<PD3);
}


int main() {

TIMSK |= (1<<TICIE1);
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.)
...
}

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AlexL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ziemliche Raterei mit so codeschnipslen, trotzdem ein Tipp:

hast du irgendwo ein sei?

Autor: AlexL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry für die Rätselraterei. Hier der komplette Code:
#include <avr/io.h> 
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define F_CPU 1000000UL
#ifndef F_CPU 
#warning "F_CPU war noch nicht definiert, wird nun mit 1MHz definiert"
#define F_CPU 1000000UL     /* Quarz mit 1 Mhz  */
#endif
#include <util/delay.h>


int j;


ISR(TIMER1_OVF_vect)
{
GICR |= (1<<INT0);   
TIMSK |= (1<<TOIE1);   
j=0;
PORTC |= (1<<PC5);
_delay_ms(500);
PORTC &= ~(1<<PC5);
}



int main() {
TIMSK |= (1<<TOIE1);
TCCR1B |= (1<<CS10)|(1<<CS11);
int t[6]={0,0,0,0,0,0};

DDRC  = 0b00100111;
PORTC = 0b00011000;
DDRD  = 0b00001000;
PORTD = 0b00000011;

j=0;
while (1==1) {

//Scan
PORTC &= ~(1<<PC0);
PORTC |= (1<<PC2) | (1<<PC1);
_delay_ms(10);
if ( !(PINC & (1<<PINC3)) ) {t[j]=3; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PINC & (1<<PINC4)) ) {t[j]=6; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND1)) ) {t[j]=9; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND0)) ) {t[j]=12; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
PORTC &= ~(1<<PC1);
PORTC |= (1<<PC2) | (1<<PC0);
_delay_ms(10);
if ( !(PINC & (1<<PINC3)) ) {t[j]=2; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PINC & (1<<PINC4)) ) {t[j]=5; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND1)) ) {t[j]=8; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND0)) ) {t[j]=10; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
PORTC &= ~(1<<PC2);
PORTC |= (1<<PC1) | (1<<PC0);
_delay_ms(10);
if ( !(PINC & (1<<PINC3)) ) {t[j]=1; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PINC & (1<<PINC4)) ) {t[j]=4; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND1)) ) {t[j]=7; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND0)) ) {t[j]=11; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if (j>5) {
j=0;



if (t[0]==1 && t[1]==2 && t[2]==1 && t[3]==10 && t[4]==10 && t[5]==5) {
PORTC |= (1<<PC5);
_delay_ms(100);
PORTC &= ~(1<<PC5); 
_delay_ms(100);
PORTC |= (1<<PC5);
_delay_ms(100);
PORTC &= ~(1<<PC5); 

PORTD |= (1<<PD3);
_delay_ms(5000);
PORTD &= ~(1<<PD3);

} else {
//Code falsch
PORTC |= (1<<PC5);
_delay_ms(300);
PORTC &= ~(1<<PC5); 
_delay_ms(300);
PORTC |= (1<<PC5);
_delay_ms(300);
PORTC &= ~(1<<PC5); 
_delay_ms(300);
PORTC |= (1<<PC5);
_delay_ms(300);
PORTC &= ~(1<<PC5); 


}
}
}
}

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

Autor: AlexL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h> 
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define F_CPU 1000000UL
#ifndef F_CPU 
#warning "F_CPU war noch nicht definiert, wird nun mit 1MHz definiert"
#define F_CPU 1000000UL     /* Quarz mit 1 Mhz  */
#endif
#include <util/delay.h>
#include <avr/interrupt.h>  



volatile int j;



ISR(TIMER1_OVF_vect) {

j=0;
PORTC |= (1<<PC5); //Summer aktivieren
_delay_ms(500);
PORTC &= ~(1<<PC5); //Summer deaktivieren

}



int main() {
TCCR1B |= (1<<CS10)|(1<<CS11); //Vorteiler Interrupt auf 64 (=alle 4,1 Sek)
TIMSK |= (1<<TOIE1); //Timer1 Interrupt aktivieren
sei(); //Interrupts global aktivieren
int t[6]={0,0,0,0,0,0}; //Gedrückte Tasten-Array (000000=Initialwert)

DDRC  = 0b00100111; //Ein - Ausgänge beschalten
PORTC = 0b00011000;
DDRD  = 0b00001000;
PORTD = 0b00000011;

j=0; //Erste Stelle vom Codeschloss aktiv setzen
while (1==1) {

//Scan der Tasten
PORTC &= ~(1<<PC0);
PORTC |= (1<<PC2) | (1<<PC1);
_delay_ms(10);
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
if ( !(PINC & (1<<PINC4)) ) {t[j]=6; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND1)) ) {t[j]=9; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND0)) ) {t[j]=12; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
PORTC &= ~(1<<PC1);
PORTC |= (1<<PC2) | (1<<PC0);
_delay_ms(10);
if ( !(PINC & (1<<PINC3)) ) {t[j]=2; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PINC & (1<<PINC4)) ) {t[j]=5; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND1)) ) {t[j]=8; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND0)) ) {t[j]=10; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
PORTC &= ~(1<<PC2);
PORTC |= (1<<PC1) | (1<<PC0);
_delay_ms(10);
if ( !(PINC & (1<<PINC3)) ) {t[j]=1; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PINC & (1<<PINC4)) ) {t[j]=4; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND1)) ) {t[j]=7; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if ( !(PIND & (1<<PIND0)) ) {t[j]=11; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); }
if (j>5) {
j=0;



if (t[0]==1 && t[1]==2 && t[2]==1 && t[3]==10 && t[4]==10 && t[5]==5) {
//richtige Tastenfolge - 2 kurze Pieps und Relais für Türöffner (PD3) aktivieren 5sek. lang.
PORTC |= (1<<PC5);
_delay_ms(100);
PORTC &= ~(1<<PC5); 
_delay_ms(100);
PORTC |= (1<<PC5);
_delay_ms(100);
PORTC &= ~(1<<PC5); 

PORTD |= (1<<PD3);
_delay_ms(5000);
PORTD &= ~(1<<PD3);

} else {
//Code falsch
//3 lange Pieps über Summer PC5
PORTC |= (1<<PC5);
_delay_ms(300);
PORTC &= ~(1<<PC5); 
_delay_ms(300);
PORTC |= (1<<PC5);
_delay_ms(300);
PORTC &= ~(1<<PC5); 
_delay_ms(300);
PORTC |= (1<<PC5);
_delay_ms(300);
PORTC &= ~(1<<PC5); 
}
}
}
}


Gruß,

Alex

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AlexL (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: AlexL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: X. H. (shadow0815)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AlexL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
#include <avr/interrupt.h>  
#include <avr/io.h> 
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define F_CPU 1000000UL
#ifndef F_CPU 
#warning "F_CPU war noch nicht definiert, wird nun mit 1MHz definiert"
#define F_CPU 1000000UL     /* Quarz mit 1 Mhz  */
#endif
#include <util/delay.h>




volatile int j;



ISR(TIMER1_OVF_vect) {
//j=0;
//PORTD |= (1<<PD3);
//_delay_ms(200);
//PORTD &= ~(1<<PD3);

}



int main() {
sei();
TCCR1B |= (1<<CS10)|(1<<CS11); //Vorteiler Interrupt auf 64 (=alle 4,1 Sek)
TIMSK |= (1<<TOIE1); //Timer1 Interrupt aktivieren
//RELAIS ANZIEHEN - DAS HIER WIRD KOMISCHERWEISE ALLE 4,1 SEK ohne Tastendruck wiederholt.
PORTD |= (1<<PD3);
_delay_ms(200);
PORTD &= ~(1<<PD3);

int t[6]={0,0,0,0,0,0};

DDRC  = 0b00100111;
PORTC = 0b00011000;
DDRD  = 0b00001000;
PORTD = 0b00000011;
j=0;
while (1) {

//Scan
PORTC &= ~(1<<PC0);
PORTC |= (1<<PC2) | (1<<PC1);
_delay_ms(10);
if ( !(PINC & (1<<PINC3)) ) {t[j]=3; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
if ( !(PINC & (1<<PINC4)) ) {t[j]=6; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
if ( !(PIND & (1<<PIND1)) ) {t[j]=9; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
if ( !(PIND & (1<<PIND0)) ) {t[j]=12; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
PORTC &= ~(1<<PC1);
PORTC |= (1<<PC2) | (1<<PC0);
_delay_ms(10);
if ( !(PINC & (1<<PINC3)) ) {t[j]=2; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
if ( !(PINC & (1<<PINC4)) ) {t[j]=5; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
if ( !(PIND & (1<<PIND1)) ) {t[j]=8; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
if ( !(PIND & (1<<PIND0)) ) {t[j]=10; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
PORTC &= ~(1<<PC2);
PORTC |= (1<<PC1) | (1<<PC0);
_delay_ms(10);
if ( !(PINC & (1<<PINC3)) ) {t[j]=1; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
if ( !(PINC & (1<<PINC4)) ) {t[j]=4; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
if ( !(PIND & (1<<PIND1)) ) {t[j]=7; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
if ( !(PIND & (1<<PIND0)) ) {t[j]=11; j++; PORTC |= (1<<PC5); _delay_ms(200); PORTC &= ~(1<<PC5); TCNT1 = 0;
}
if (j>5) {
j=0;



if (t[0]==1 && t[1]==2 && t[2]==1 && t[3]==10 && t[4]==10 && t[5]==5) {
PORTC |= (1<<PC5);
_delay_ms(100);
PORTC &= ~(1<<PC5); 
_delay_ms(100);
PORTC |= (1<<PC5);
_delay_ms(100);
PORTC &= ~(1<<PC5); 

PORTD |= (1<<PD3);
_delay_ms(5000);
PORTD &= ~(1<<PD3);

} else {
//Code falsch
PORTC |= (1<<PC5);
_delay_ms(300);
PORTC &= ~(1<<PC5); 
_delay_ms(300);
PORTC |= (1<<PC5);
_delay_ms(300);
PORTC &= ~(1<<PC5); 
_delay_ms(300);
PORTC |= (1<<PC5);
_delay_ms(300);
PORTC &= ~(1<<PC5); 


}
}

}
}


Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibst du dem Compiler auch den korrekten mcu-Wert mit?

Autor: AlexL (Gast)
Datum:

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

Autor: AlexL (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und du benutzt auch wirklich einen Mega8, keinen Mega88 oder so?

Autor: AlexL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja. Auf dem Chip steht ATMEGA8-16PU.

Autor: AlexL (Gast)
Datum:
Angehängte Dateien:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: AlexL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei der Hardware fehlt auf jeden Fall noch ein Abblockkondensator am µC.

Autor: AlexL (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Keramik oder Folie, möglichst nahe am IC.

Autor: AlexL (Gast)
Datum:

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

Autor: AlexL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.