Hallo,
da ich mich in das Thema µC einarbeiten wollte, habe ich mir das STK500
bestellt. Ich bin auf diesem Gebiet noch absoluter Anfänger und hätte da
einige grundlegende Fragen, die mir das beigelegte Handbuch nicht
beantworten konnte.
Die Inbetriebnahme lief problemlos und die ersten kleinen Programme
konnten geschrieben werden und liefen auf Anhieb. Nun wollte ich in ein
Programm ein Delay einbauen. Leider wird es nicht ausgeführt und ich
glaube, dass es mit den Einstellungen in der Programmieroberfläche zu
tun hat.
Es handelt sich um das STK500 mit dem ATMega8515L.
Programmiert wird mit AVR-Studio 4.13 und dem WinAVR in c.
Hier erstmal das Programm:
1
#include<avr/io.h>
2
3
#define F_CPU 3686400UL
4
5
#include<util/delay.h>
6
7
8
9
voidioinit(void);
10
11
// Hauptprogramm
12
intmain(void)
13
{
14
15
// Initialisierung
16
DDRB=0xff;// PortB als Ausgang deklarieren
17
PORTB=0xff;// LED's aus
18
DDRD=0x00;// PortD als Eingang deklarieren
19
PORTD=0xff;// Pull-up's von PortD auf high
20
21
// Endlosschleife
22
while(1)
23
{
24
if(PIND==0xfe)// Taster gedrückt?
25
{
26
PORTB&=0xfe;
27
_delay_ms(2000);
28
PORTB&=0x00;
29
_delay_ms(2000);
30
PORTB=0xff;
31
}
32
else
33
PORTB=0xff;
34
}
35
36
return0;
37
}
Die Frequenz hab ich im Programm auf 3686400Hz gestellt. Unter den
Projekt-Optionen hab ich bei Frequency ebenfalls 3686400Hz eingestellt.
Diese Frequenzen hab ich so mal übernommen, da beim Programmieren des
8515 im Menüpunkt "Board" unter "Oscillator and ISP-Clock" bei "STK500
Osc" 3,686 MHz steht.
Das Programm führt mit den genannten Einstellungen nicht den Delay aus.
Was mache ich da falsch?
Sind die 3,686MHz überhaupt die Frequenz des 8515?
Und wo kann ich sie richtig einstellen.
Ich hoffe ihr könnt mir weiterhelfen und die Fragen sind nicht all zu
blöde.
Gruß
Ted
Öh ich bin selbst noch Anfänger, deshalb vertraue nicht 100%tig auf
meine Antwort, bin mir selbst nicht allzusicher.
Hat der µC nicht 1 MHz normalerweise. Für andere Frequenzen => Quarz
Und du kannst wenn du den µC programmierst auch bei Fuse Bits die
Frequenz auswählen. Schau dort mal nach.
Aja hab irgendwo mal gelesen, dass man statt :
1
DDRB=0xff;// PortB als Ausgang deklarieren
2
PORTB=0xff;// LED's aus
so schreiben sollte:
1
PORTB=0xff;// LED's aus
2
DDRB=0xff;// PortB als Ausgang deklarieren
Hat irgendetwas mit Pullups zu tun, damit nicht kurz ein Signal kommt
oder so???? Vielleicht kann das irgendwer hier erklären, hab das nur mal
gelesen...
Hi Michael, danke schon mal für die Antwort und den Tip mit dem
initialisieren.
Ich werd das mal mit 1MHz probieren. Dass der 8515 mit 1MHz läuft, hab
ich bisher nicht in der Doku gesehen :o( daher bin ich von den 3,686MHz
ausgegangen.
Wenn diese 3,686MHz nicht die Oszillator-Frequenz des 8515 ist, was gibt
sie dann im "Board"-Menü an?
Gruß
Ted
@Edit: Ich hab es jetzt mit 1MHz probiert und damit funktioniert der
Delay, aber es sind nicht 2000ms = 2 Sek. Es ist definitiv kürzer. Woran
liegt das und was kann man tun damit das richtig abgearbeitet wird?
G. F. wrote:
> Ich werd das mal mit 1MHz probieren. Dass der 8515 mit 1MHz läuft, hab> ich bisher nicht in der Doku gesehen :o( daher bin ich von den 3,686MHz> ausgegangen.> Wenn diese 3,686MHz nicht die Oszillator-Frequenz des 8515 ist, was gibt> sie dann im "Board"-Menü an?
Das ist die Frequenz des On-Board-Oszillators des STK500. Wenn die Fuses
des µC auf "external clock" gesetzt sind und der entsprechende Jumper
auf dem Board gesetzt ist, dann kann der µC diesen Takt verwenden. Im
Auslieferungszustand stehen die Fuses aber auf "internal RC oscillator 1
MHz".
Hmm tut mir leid, sry mit dem 8515 habe ich bis jetzt noch nicht
gearbeitet, deshalb weiß ich das nicht so genau.
In der Datei delay.h wird F_cpu nochmal definiert, aber eig. ist eh ein
ifndef dabei, aber kannst ja trotzdem mal versuchen auch dort zu ändern.
G. F. wrote:
> if (PIND == 0xfe) // Taster gedrückt?
Wenn Du einzelne Bits abfragen willst, dann besser so, wie es im Artikel
Bitmanipulation beschrieben ist. So eine Abfrage kann schnell in die
Hose gehen.
> _delay_ms(2000);
So lange Zeiten macht man einfach nicht mit _delay_irgendwas. Die
delay-Funktionen sind für kurze Wartezeiten gemacht. Ältere Versionen
konnten gar keine so langen Zeiten.
Abgesehen davon: Hast Du die Compiler-Optimierung eingeschaltet? Die
Funktionen aus "util/delay.h" funktionieren nur mit Optimierung korrekt.
> Die Frequenz hab ich im Programm auf 3686400Hz gestellt. Unter den> Projekt-Optionen hab ich bei Frequency ebenfalls 3686400Hz eingestellt.
Solange Du die Fuses nicht entsprechend setzt, kannst Du alles Mögliche
einstellen, da passiert gar nichts.
STK500-Besitzer wrote:
> Kann es sein, dass _delay_ms keine 2 Sekunden "warten" kann?
Wie gesagt, neuere Varianten der lib können das angeblich.
> Ich benutze das nicht, deswegen die Frage...
Nun, ich benutze die delays zwar, aber nicht so exzessiv...
ahh, jetzt wird mir einiges klar. Bei mir waren die fuses auf extern
gestellt. Jetzt hab ich es mit 1MHz probiert und es klappt. Und jetzt
verstehe ich auch wofür die 3,686MHz sind. :o)
Okay, das mit den delays war mir so nicht klar. Danke für den Tip. Und
den Code änder ich entsprechend der Bitmanipulation.
Ich danke euch.
Gruß
Ted
G. F. wrote:
> ahh, jetzt wird mir einiges klar. Bei mir waren die fuses auf extern> gestellt. Jetzt hab ich es mit 1MHz probiert und es klappt.
Hä? Muss ich jetzt nicht verstehen, oder? Wenn die Fuses auf "external
clock" standen und der Clock-Jumper auf dem STK gesetzt war, dann wäre
das doch korrekt gewesen.
> Und jetzt verstehe ich auch wofür die 3,686MHz sind. :o)
Warum habe ich da so meine Zweifel?
> Warum habe ich da so meine Zweifel?
Muss dafür nicht ein externer Quarz angeschlossen sein? Da keiner dran
ist, denke ich, dass der 8515 seine interne Standard-Frequnz nutzte.
G. F. wrote:
>> Warum habe ich da so meine Zweifel?> Muss dafür nicht ein externer Quarz angeschlossen sein? Da keiner dran> ist, denke ich, dass der 8515 seine interne Standard-Frequnz nutzte.
Wenn der On-Board-Oszillator des STK500 auf 3,xyz MHz eingestellt und
der Jumper gesetzt ist, dann wird auch der Takt genommen.
Und bei "external clock" kommst Du mit einem Quarz nicht weit, da muss
ein externer Takt (z.B. von einem Quarzoszillator) angeschlossen
werden!
Und nochmal: Der Takt richtet sich nicht danach, was angeschlossen
ist, sondern nach dem, was mit den Fuses eingestellt ist! Wenn Du
einen externen Quarz einstellst, aber keinen anschließt, dann läuft der
µC gar nicht. Einzige Ausnahme: In allen Einstellungen, die ein
externes Bauteil vorsehen (also "external crystal/resonator", "external
RC oscillator" und (logischerweise) "external clock") kann man den µC
immer mit einem externen Takt speisen. Das ist ein klassisches Rezept,
um einen versehentlich falsch konfigurierten AVR zu retten.
Okay, ich denke ich weiß was du meinst. Der Jumper XTAL1 war gesetzt
aber der OSCSEL war ebenfalls auf 1-2 gesetzt = SW Oscillator.
Mit der fuse-Einstellung extern hat es leider nicht funktioniert, warum
auch immer.
Wie gesagt, ich hab noch viel zu lernen und bin froh, dass ihr mir hier
weiter helft.
@edit: er stand standardmäßig auf Ext.Clock nicht auf Ext. RC. Wie
gesagt, die kleinen Programme liefen problemlos.