hallo Leute
der klatschalter macht eigentlich was er machen soll. Bei einem Geräusch
schaltet er die LED ein und nach drei sek. wieder aus. Was mir nicht klar ist
das ich eine delay von 20000 wählen muss um auf drei Sekunden zu kommen.
Eigentlich müsste eine delay von 3000 richtig sein. Kann mir jemand sagen
warum? es so ist.
1
//CPU 1200000
2
//ATTINY 13a
3
//Klatsch Schalter
4
#include<avr/io.h>
5
#include<util/delay.h>
6
intmain(void)
7
{
8
DDRB=0b00000001;
9
PORTB=0b00011000;
10
ADMUX=2;
11
ADCSRA=(1<<ADEN)+(1<<ADSC)+(1<<ADATE)+(1<<ADPS2);
12
13
_delay_ms(1000);
14
15
while(1)
16
{
17
while((ADCSRA&(1<<ADIF))==0);
18
if(ADC<1014)
19
20
{
21
PORTB|=0b00000001;
22
_delay_ms(20000);
23
PORTB&=~0b00000001;
24
//_delay_ms(1000);
25
}
26
ADCSRA|=(1<<ADIF);
27
}
28
}
[Mod: bitte künftig selber die [c] Tags setzen wie in der Bedienungsanleitung über jeder Texteingabebox beschrieben]
Auf was ist den F_CPU eingestellt, wie sind die Fuses eingestellt, und das ist deine Taktquelle? Das muss alles zusammenpassen, damit die Delays stimmen.
Wenn du 20000 statt 3000 einstellen musst, deutet das darauf hin, dass dein µC mit einem höheren Takt läuft als du per F_CPU angibst.
Durch den Datentyp des Parameters (double) kannst du eine maximale
Verzögerung von 6,5535 Sekunden erreichen.
Nix mit 20000!
Na doch. Das geht schon. Allerdings mit verringerter Auflösung von nur noch ner Zehntel MilliSekunde.
Steht im Manual
1
When the user request delay which exceed the maximum possible one, _delay_ms() provides a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of 1/10 ms, providing delays up to 6.5535 seconds (independent from CPU frequency). The user will not be informed about decreased resolution.
Oder interpretiere ich das falsch?
Ebenso steht dort, wenn man F_CPU nicht angibt, er als „fallback“ 1Mhz zur Berechnung verwendet.
In muss man aber doch fairerweise eingestehen, dass (20000), also 20Sekunden schon weit weg von den möglichen 6komma5 Sekunden sind, die dort als Maximum angegeben wurden. Auflösung hin oder her.
Muss man direkt mal ausprobieren (geht jetzt hier am Handy schlecht)
Das wurde oben mehrfach verlinkt. Zusammenfassung: Mit einer aktuellen AVR-GCC-Toolchain und konstantem Delay-Wert sind es rund 4295 Sekunden geteilt durch die CPU-Frequenz in MHz.
Das wurde oben mehrfach verlinkt. Zusammenfassung: Mit einer aktuellen
AVR-GCC-Toolchain und konstantem Delay-Wert sind es rund 4295 Sekunden
geteilt durch die CPU-Frequenz in MHz.
Da lobe ich mir doch die Arduino delay() Funktion.
Die ist (fast) gut Dokumentiert.
Man kann während dessen noch (kooperativ, dank yield()) anderen Kram erledigen.
Auch verlängern ISR Läufe nicht die delay() Zeit.
Meinen Dank, für die Gelegenheit, diesen Einwurf machen zu dürfen.
Da lobe ich mir doch die Arduino delay() Funktion.
Die ist (fast) gut Dokumentiert.
Man kann während dessen noch (kooperativ, dank yield()) anderen Kram
erledigen.
Auch verlängern ISR Läufe nicht die delay() Zeit.
Meinen Dank, für die Gelegenheit, diesen Einwurf machen zu dürfen.
auf 'nem ATtiny13. jo nee - iss klar. Viel Spaß mit "yield()"
Das passt irgendwie nicht zusammen.
Es gibt nur derbe abgespeckte t13 Cores für die Arduino IDE
Ja weiß ich. nehm ich auch ganz gern.
(hab da gerade einen Tiny2313 - kein t13! - mit mini-mikro-Oled und Betriebsspannungsanzeige am Basteln, der statt der originalen Ladekontrollleuchte in die Bajonettfassung gesteckt wird. (Moped MZ TS175) Allerdngs mit VSCode und PlatformIO. Wenns absolut nicht draufgeht, nehm ich wieder WinAVR und ProgrammersNotepad ;)
bislang kann ich micht erinnern, jemals mit dem Problem konfrontiert worden zu sein. delay(20000) wartet jedenfalls brav 20 Sekunden. Vorhin probiert. Müsste man sich das LST ausgeben lassen, was die dort veranstalten. wahrscheinlich, we oben angegeben eine while mit _delay_ms(1) lt. Doku ginge das ja sonst garnicht.
nochmal zum eigentlichen Thema,
#define F_CPU 12E6
oder #define F_CPU 12000000
mit vor die #include(s) sollte das eigentliche Problem abstellen, denke ich.
Hallo Leute
Vielen Dank für die zahlreichen Antworten. Habe den Fehler gefunden.
Es sieht so aus als wäre der Mikrochip das Problem. Ich habe einen neuen Chip genommen und siehe da es funktioniert auf Anhieb. Habe noch mit den "delay" verschiedene Zeiten probiert es klappt ohne Probleme.
Nochmals vielen Dank.
Wilfried
Nicht der Chip ist das Problem, sondern die Einstellung der "Fuses". Die Einstellung der Taktfrequenz passt einfach nicht zum Wert von F_CPU in Deinem Programm.