ADC problem mit delay

OP #7729375
Lesenswert?

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
int main (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]

#7729482
Lesenswert?

Klaus H. schrieb:

Wilfried schrieb:

_delay_ms(20000);

Durch den Datentyp des Parameters (double) kannst du eine maximale Verzögerung von 6,5535 Sekunden erreichen.

Das hat nichts mit double zu tun. Mit dem Datentyp kannst du auch Delays angeben, die dem mehrfachen der Lebensdauer des Universums entsprechen. Die Begrenzung des Delays kommt dadurch, dass intern für die Warteschleife ein Zähler mit begrenzter Größe verwendet wird und liegt auch bei ganz anderen Werten. Siehe https://avrdudes.github.io/avr-libc/avr-libc-user-manual-2.2.0/group__util__delay.html#gad22e7a36b80e2f917324dc43a425e9d3

Nix mit 20000!

Bei sehr veralteten avr-Toolchains kann es tatsächlich sein, dass das zu lang ist, hängt aber vom Takt ab.

#7729483
Lesenswert?

Klaus H. schrieb:

Wilfried schrieb:

_delay_ms(20000);

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.

https://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

#7729640
Lesenswert?

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)

(Firma: Gast) #7729943
Lesenswert?

Hi hi hi.... Eine lustige Diskussion!

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.

#7729945
Lesenswert?

Arduino F. schrieb:

Hi hi hi.... Eine lustige Diskussion!

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.

(Firma: Gast) #7729965
Lesenswert?

Axel R. schrieb:

Das passt irgendwie nicht zusammen.

Einerseits hast du Wahr: Es gibt keinen t13 Arduino. Es gibt nur derbe abgespeckte t13 Cores für die Arduino IDE

Andererseits, ist die _delay_ms() eine Beilage für alle AVR Arduinos Nutzt dort nur kaum jemand.

Ausnahme: Die/Der Ersteller des https://github.com/MCUdude/MicroCore

1
void delay(uint16_t ms)
2
{
3
  while(ms--)
4
    _delay_ms(1);
5
}
#7730085
Lesenswert?

Arduino F. schrieb:

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.

Moderator (Firma: Titel) Persönliche Seite #7730093
Lesenswert?

Axel R. schrieb:

lt. Doku ginge das ja sonst garnicht.

Nochmal der Verweis auf die Doku:

wahrscheinlich we oben angegeben eine while mit _delay_ms(1)

Warhscheinlich mit einem _delay_ms(0,1) weil das ja die Auflösung ist und dann (2^32-1)*0,1s lange Delays möglich sind.

Man muss eben nur den Prescaler richtig einstellen. Wenn man den falsch einstellt, sind sogar noch deutlich längere Delays möglich.

Axel R. schrieb:

#define F_CPU 12000000

Da fehlt ein UL hinten dran. Denn 12000000 passt nicht in einen 16-Bit-Integer.

OP #7730183
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren