delay Funktion

Gast #2725856
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.
#2725863
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.
Gast #2727879
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!
Angehängte Dateien:
Gast #2728110
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.
Gast #2728216
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
Angehängte Dateien:
Gast #2728243
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
Gast #2728301
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?
Gast #2728365
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"
Angehängte Dateien:
Gast #2728394
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.
Gast #2728875
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
#2729324
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.

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