Forum: Mikrocontroller und Digitale Elektronik Fragen zum STK500, speziell den Einstellungen


von G. F. (ted)


Lesenswert?

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
void ioinit(void);
10
11
// Hauptprogramm
12
int main(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
    return 0;
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

von Michael (Gast)


Lesenswert?

Ö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...

von G. F. (ted)


Lesenswert?

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?

von Johannes M. (johnny-m)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

Kann es sein, dass _delay_ms keine 2 Sekunden "warten" kann?
Ich benutze das nicht, deswegen die Frage...

von Johannes M. (johnny-m)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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...

von G. F. (ted)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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?

von G. F. (ted)


Lesenswert?

> 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.

von Johannes M. (johnny-m)


Lesenswert?

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.

von G. F. (ted)


Lesenswert?

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.

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.