Forum: Mikrocontroller und Digitale Elektronik delay Funktion


von Pimi (Gast)


Lesenswert?

Hallo,
Wie ich schon in meinem anderen Beitrag geschrieben habe
habe ich mein ATmega 8 durch einen ATmega 328 ersetzt. Unter anderen 
Problemen die ich habe ist die delay Funktion die bei ATmega 8 
funktioniert hat und bei ATmega 328 leider nicht.
Was kann die Ursache sein?
Kann ich die Funktion durch eine Warte Routine oder einen Timer 
ersetzen?
(Von Warte Routinen oder Timer habe ich noch keine Ahnung!
Für Anregungen bin ich sehr dankbar.

Mit freundlichen Grüßen
Paul

Auszug aus dem Programm:

#define F_CPU 3686400 // Taktferquenz des myAVR-Boards
#define BAUD 9600
#include <avr\io.h> // AVR Register und Konstantendefinitionen
#include <avr\delay.h> // Bibliothek mit Warteroutinen
#include <avr\interrupt.h>

while(1)
{
if (WS)
an_WA;
else
aus_WA;
if (start_BEETE)
PORTC |= 0b00100000; // Markise öffnen
if (start_HECKE)
PORTC &= 0b11011111; // Markise schließen
if (start_RASEN)
{
an_MA; // Anzeige Markise ZU
_delay_ms(3000); // Warten
}
aus_MA;
}

Noch eine kurze Erklärung:
WS, an_WA usw. habe ich natürlich entsprechen definiert.
Was mach das?
Nach betätigen WS, WA schaltet ein.
Nach betätigen „start_RASEN“, „MA“ schaltet ein und geht nicht mehr aus. 
Ganzes Programm hängt (Nach Ablauf der delay Funktion müsste wieder „MA“ 
ausschalten und alles andre funktionieren.

von Karl H. (kbuchegg)


Lesenswert?

Pimi schrieb:
> Hallo,
> Wie ich schon in meinem anderen Beitrag geschrieben

Schön.
Wir haben hier in 2 Tagen rund 150 Threads. Glaubst den kennt noch wer?

> habe
> habe ich mein ATmega 8 durch einen ATmega 328 ersetzt. Unter anderen
> Problemen die ich habe ist die delay Funktion die bei ATmega 8
> funktioniert hat und bei ATmega 328 leider nicht.
> Was kann die Ursache sein?

Falsche Projekteinstellungen (falscher µC eingetragen)
Falsche Fuses und der Mega328 läuft nich mit der Frequenz, die du 
angegeben hast.
Optimizer nicht eingeschaltet.

> Für Anregungen bin ich sehr dankbar.

Korrigier erst mal dieses drei Punkte. Dann sehen wir weiter.

> Auszug aus dem Programm:

Das Programm würd ich auch nicht ausführen.

von ... (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Pimi schrieb:
>> Hallo,
>> Wie ich schon in meinem anderen Beitrag geschrieben
>
> Wir haben hier in 2 Tagen rund 150 Threads. Glaubst den kennt noch wer?

War das der hier?
Beitrag "C++ für AVR (Wartefunktion)"

von Pimi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
Meine delay Funktion bei Einstellung 1 Sekunde braucht jetzt ca.4,1 Sek.
Die Low Fuse Eistellung seht ihr in Bild. Ich nutze einen externen Quarz 
3,6 MHz. Die Fuse Einstellung habe ich mit (SiSy-AVR) Software 
durchgeführt.
Was ist da falsch?

Danke für Hilde!

von Hubert G. (hubertg)


Lesenswert?

Interessant wären die Fuses Low und High Byte und der gesamte Code.

von Pimi (Gast)


Angehängte Dateien:

Lesenswert?

Hubert G. schrieb:
> Interessant wären die Fuses Low und High Byte und der gesamte Code.

Hallo,
Im Anhang ist ein kleines Quellcode und die High Fuse

von g457 (Gast)


Lesenswert?

> Im Anhang ist ein kleines Quellcode und die High Fuse

Der Code compiliert so nicht mal ansatzweise. Rück doch endlich mal das 
Original raus.

Und Du hast augenscheinlich CKDIV8 gesetzt, stimmt das mit
> #define F_CPU 3686400
überein?

HTH und nix für ungut.

von Hubert G. (hubertg)


Lesenswert?

Schau mal bei den Low Fuses, da ist ein Haken bei CKDIV8, den mach mal 
weg.

von Pimi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
g457 schrieb:
> Der Code compiliert so nicht mal ansatzweise. Rück doch endlich mal das
> Original raus.

Der Codecompiliert und das kleine Programm in der Form wie ist 
funktioniert.

g457 schrieb:
> Und Du hast augenscheinlich CKDIV8 gesetzt, stimmt das mit
>> #define F_CPU 3686400
> überein?

Hubert G. schrieb:
> Schau mal bei den Low Fuses, da ist ein Haken bei CKDIV8, den mach mal
> weg.


Ich finde den CKDIV8 bei mir nicht. Was ist das übrigens?
Bei den Low Fuse ist bei mir nur ein Häckchen. Schaut noch mal das Bild

von g457 (Gast)


Lesenswert?

> Der Codecompiliert und das kleine Programm in der Form wie ist
> funktioniert.

Dann nutzt Du irgendwas nicht-standardmäßiges. Wäre zweckmäßig das 
früher zu kommunizieren. Hierzuworkstation sieht das Ergebnis ungefähr 
so aus:
1
main.c: In function ‘init’:
2
main.c:6: warning: implicit declaration of function ‘cbi’
3
main.c:6: error: ‘DDRB’ undeclared (first use in this function)
4
main.c:6: error: (Each undeclared identifier is reported only once
5
main.c:6: error: for each function it appears in.)
6
main.c:7: warning: implicit declaration of function ‘sbi’
7
main.c:7: error: ‘DDRD’ undeclared (first use in this function)
8
main.c: At top level:
9
main.c:14: warning: return type defaults to ‘int’
10
main.c: In function ‘main’:
11
main.c:16: error: ‘true’ undeclared (first use in this function)
12
main.c:18: error: ‘PINB’ undeclared (first use in this function)
13
main.c:20: error: ‘PORTD’ undeclared (first use in this function)
14
main.c:21: warning: implicit declaration of function ‘_delay_ms’

> Ich finde den CKDIV8 bei mir nicht. Was ist das übrigens?

Vorteiler von 8 für den Haupttakt (-> Datenplatt). Der neue Screenshot 
erscheint mir inkonsistent mit dem davor. Überprüf den tatsächlichen 
Takt mal explizit und unabhängig (z.B. Timer/WG auf einen Pin geben, 
Ossi/Frequenzzähler/LED dranhängen und zählen (lassen)), 
behelfsweise(!!) mit einem Miniprogramm analog zu
1
while (1) { toggle_pin(); _delay_ms(1000); }

HTH

von ... (Gast)


Lesenswert?

g457 schrieb:
> Dann nutzt Du irgendwas nicht-standardmäßiges. Wäre zweckmäßig das
> früher zu kommunizieren. Hierzuworkstation sieht das Ergebnis ungefähr
> so aus:

Da fehlen dem Compiler grundlegende Include-Files (Portbezeichungen, 
Delay.h). Hast du den Prozessor richtig gesetzt und die Support-Files 
installiert?

von Pimi (Gast)


Angehängte Dateien:

Lesenswert?

g457 schrieb:
> Dann nutzt Du irgendwas nicht-standardmäßiges. Wäre zweckmäßig das

Ich arbeite mit (SiSy-AVR) Software. Im Programm haben die includes 
gefehlt, jetzt sind sie da, und das Programm läuft! Nur die Zeiten 
stimmen nicht überein!

g457 schrieb:
> Vorteiler von 8 für den Haupttakt (-> Datenplatt). Der neue Screenshot
> erscheint mir inkonsistent mit dem davor.

Ich weiß, dass man das schlecht in dem Bild Fuse davor sieht, aber die 
"devide clock by 8 internally" ist deaktiviert"

von Klaus (Gast)


Lesenswert?

Pimi schrieb:
> Programm.txt

C-Quelltext hat niemals die Endeung .txt sondern .c!

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Pimi schrieb:
> die delay Funktion die bei ATmega 8
> funktioniert hat und bei ATmega 328 leider nicht.
> Was kann die Ursache sein?
> Kann ich die Funktion durch eine Warte Routine oder einen Timer
> ersetzen?

Hm, was ist denn nach deiner Vorstellung der Unterschied zwischen einer 
"delay Funktion" und einer "Warte Routine"?

von Werner (Gast)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> Hm, was ist denn nach deiner Vorstellung der Unterschied zwischen einer
> "delay Funktion" und einer "Warte Routine"?

Eine Delay-Funktion schlägt eine bestimmte Zeit tot, eine 
Warte-Routine wartet, wie der Name schon sagt, auf ein bestimmtes 
Ereignis, z.B. darauf, dass eine Übertragung beendet ist oder ein ADC 
mit der Wandlung fertig ist.

von g457 (Gast)


Lesenswert?

> Im Programm haben die includes gefehlt

Ich weiss :-)

> das Programm läuft! Nur die Zeiten stimmen nicht überein!

Im wesentlichen hast du 3 Fehlerursachen:

- F_CPU falsch
- Vorteiler falsch (CKDIV8)
- Quarz defekt/verstimmt oder falsche Taktquelle

Mach mal den oben von mir vorgeschlagenen Test:
- Timer1 'toggle on compare match' (COM1A0)
- WGM auf 'CTC' (WGM12)
- OCR1A auf 3600
- Vorteiler auf 1024 (CS12 | CS10)
- OC1A auf Ausgang

Sodann häng eine LED (nebst passendem Widerstand) and OC1A und vergleich 
die Toggelfrequenz an der LED mit einem Zeitmesser Deiner Wahl. Sodann 
entweder selber zurückrechnen (anhand Datenplatt) was die tatsächliche 
Taktfrequenz ist oder hier nachfragen.

Ich hoff ich hab keine Fehler eingebaut.

HTH

von Pimi (Gast)


Lesenswert?

Die reaktionszeit der Funktion delay ist statt 1 Sek. -> ca. 4 Sek.

mit freundlichen Grüssen

von Karl H. (kbuchegg)


Lesenswert?

---> Dein µC läuft mit 1Mhz und nicht mit ca. 4Mhz

es ist wirklich so einfach.
Wenn ein _delay_ms( 1000 ) tatsächlich in der Realität 1 Sekunde dauert, 
bedeutet das, dass die F_CPU Angabe mit der Realität übereinstimmt.
Stimmt die Zeit nicht, dann taktet der µC mit einer anderen Frequenz als 
in F_CPU angegeben.

von Pimi (Gast)


Lesenswert?

Vielen Dank!

von Pimi (Gast)


Lesenswert?

Den Fehler habe ich mit Hilfe behoben:
Falsche Fuses:
Soll:
low  high  ext  lock
FD   DA   FF   FF

An Alle die mir Helfen wollten.
Besten Dank!

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.