Forum: Mikrocontroller und Digitale Elektronik Quarzoszillator & ATMEGA32 (Fuses?)


von Dominik .. (dominik84)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche gerade einen AVR ATMEGA32 mit einen 8MHz Quarzoszillator 
zum laufen zu bringen.

Was geht:

Wenn ich den anhängenden Quellcode (XTAL = 1000000) und den 
Standard-Fuses (Fuses.jpg --> Interner Oszi) laufen lasse, funktioniert 
alles tadellos.

Was nicht geht:

Sobald ich meinen Quarzoszillator ( 
http://www.reichelt.de/Oszillatoren/OSZI-8-000000/3/index.html?;ACTION=3;LA=2;ARTICLE=13723;GROUPID=3174;artnr=OSZI+8%2C000000;SID=11UM44G38AAAIAAAfKjlQb48908975a5e92dcd4091680ed08415d 
) und die Fuses wie in "Fuses-Quarzoszi.jpg" einstelle, kann mein LCD 
nicht mehr init. werden (1. Zeile lauter schwarze Balken).
In anderen Versuchen (UART - Danneger) wird ein Teil des Codes 
abgefertigt (Signal am Ausgang des UART (TX) kann gemessen werden).
Aber das Timing passt hier vermutlich auch nicht. Am Ausgang für PD7 
(Datenleitung, im 4 Bit Modus zum LCD) kann ein sehr sehr schwaches 
regelmäßiges Signal gemessen werden, was aber nicht wirklich was ist...


Was ich schon probiert habe:

Mit einem Oszilloskop hab ich den XTAL1 (PIN 13) gemessen. Hier ist die 
Schwingung deutlich zu messen (ca. 7,9 MHz). Andere ATMEGA32 habe ich 
auch bereits ohne Erfolg probiert. XTAL2 ist mit nichts verbunden.


Wo ist mein Fehler? Fuses (Wäre jetzt peinlich ;-) ) Quelltext 
(Abgekupfert von Herrn Danneger :-) ) ?

Danke euch allen schon im Voraus!


Gruß
Dominik

von Karl H. (kbuchegg)


Lesenswert?

Dominik ... schrieb:

> Aber das Timing passt hier vermutlich auch nicht.

Was heißt 'vermutlich'?

Es gibt eine ganz einfache Möglichkeit, wie du das auch ohne Oszi 
überprüfen kannst.

Verkabel eine LED an einen Portpin und dann benutzt du _delay_ms um die 
LEd zum Blinken zu bringen
1
#define F_CPU 8000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
#define LED_DDR  DDRB
7
#define LED_PORT PORTB
8
#define LED      PB0
9
10
int main()
11
{
12
  LED_DDR |= ( 1 << LED );
13
14
  while( 1 )
15
  {
16
    _delay_ms( 1000 );
17
    LED_PORT |= ( 1 << LED );
18
    _delay_ms( 1000 );
19
    LED_PORT &= ~( 1 << LED );
20
  }
21
}

wenn die tatsächliche, physikalische Taktfrequenz mit dem bei F_CPU 
eingetragenen Wert übereistimmt, dann ist deine LED 1 Sekunde an, 1 
Sekunde aus. Stimmt sie nicht überein, weil zb der µC immer noch auf 
1Mhz läuft, dann blinkt die LED nicht mit 1 Sekunde, sondern mit 8 
Sekunden. Das sieht man auch mit freiem Auge ohne Messinstrumente.

von Dominik .. (dominik84)


Lesenswert?

Guten Morgen Herr Buchegger,

vielen Dank für die Antwort. Bin dadurch einen großen Schritt 
weitergekommen!

Karl Heinz Buchegger schrieb:
> Was heißt 'vermutlich'?
Das heißt, ich bin Anfänger und wusste nicht weiter :-)

> "LED Blink Routine"
Diese sollte man in sein Standard-Baukasten mit aufnehmen!!!!

Wenn ich diese Routine allein laufen lasse, so wie Sie mir den 
Quellecode zur Verfügung gestellt haben, schaltet die LED im Sekunden 
Takt(Mit dem Oszi gemessen). Juhuuu, die Fuses scheinen richtig :-)
Füge ich diese Routine in meinen Quelltext ein blinkt die LED wesentlich 
schneller. Laut Oszi schaltet die LED ca. alle 100mS.

Also ist der Fehler vermutlich (ja des vermutlich soll verdeutlichen, 
dass ich Anfänger bin ;-) ) im Quelltext....irgendwo in den Delay 
Funktionen. Wenn ich die Lösung habe, werde ich natürlich Bescheid 
geben. Bin natürlich auch dankbar, wenn jemand den Fehler auf Anhieb 
findet!


Gruß
Dominik

von Dominik .. (dominik84)


Lesenswert?

Ich melde mich nochmal, hab das Problem zumindest zum Teil gelöst.


1. Die LED hat alle 125ms geschalten (Man sollte beim analogen Oszi 
genauer hinschauen).

2. Anscheinend hat der in der delay.h nicht die 8MHz übernommen (F_CPU = 
8000000). Hab diese jetzt kopiert, den Wert manuell geändert, zum 
Projekt dazu gelegt und eingebunden. Somit funktioniert es.



Vielleicht hat jemand eine Idee, was ich falsch gemacht hab. Der 
Quelltext liegt noch im obigen Post.


Zum Programmieren verwende ich den AVR Dragon über JTAG.

Atmel Studio 6 (Version: 6.0.1938 - Service Pack 1)
OS Version: Microsoft Windows NT 6.2.9200.0
Platform: Win32NT
Installed Packages: ARMGCC - 3.3.1.115
ARM Toolchain
Version: 4.7.0.49 - GCC  4.7.0
CMSIS
Version: ${cmsisFileVersion}
Package GUID: b55b919b-ef5f-4608-97eb-ddf473177814

Installed Packages: Atmel Software Framework - 3.1.3.114
ASF
Version: 3.1.3
ASF
Version: 3.0.1
ASF
Version: 2.11.1
ASF
Version: 2.10.0
ASF
Version: 2.9.0
Installed Packages: Atmel Studio Extension Manager - 1.1
Atmel Studio Extension Manager
Version: 1.1
Installed Packages: AVRAssembler - 2.1.51.46
AVR Assembler
Version: 2.1.39.227
Installed Packages: AVRGCC - 3.4.0.65
AVR Toolchain 8 Bit
Version: 3.4.0.663 - GCC  4.6.2
AVR Toolchain 32 Bit
Version: 3.4.0.332 - GCC  4.4.3
Installed Packages: Visual Assist X for Atmel Studio - 10.7.1904.0
Visual Assist X for Atmel Studio
Version: 10.7.1904.0

von Dietrich L. (dietrichl)


Lesenswert?

Dominik ... schrieb:
> Anscheinend hat der in der delay.h nicht die 8MHz übernommen (F_CPU =
> 8000000)

F_CPU muss auch vor dem include von delay.h definiert werden. Dann 
brauchst Du delay.h nicht ändern.

Gruß Dietrich

von Dominik .. (dominik84)


Lesenswert?

Danke! :-)

Den Wald vor lauter Bäumen nicht gesehen!!!

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.