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.
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)"
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!
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
> 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
1 | while (1) { toggle_pin(); _delay_ms(1000); } |
HTH
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
Die reaktionszeit der Funktion delay ist statt 1 Sek. -> ca. 4 Sek. mit freundlichen Grüssen
---> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.