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.
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.
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!
> 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.
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
> 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
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?
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"
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"?
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.
> 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
---> 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.