www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Quarz am MEGA16


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich hab ne Schaltung aufgebaut für nen Mega16L8, Funktioniert eigentlich 
auch bis auf den Takt... zur testen hab ich ne LED am PB und versuch Sie 
so zum blinken zu bringen :
#include <avr/io.h>

int main()
{
    DDRB = 0b00010000;
    PORTB = 0b00010000;
    int i=0;
    
    while(1)
    {
      PORTB = 0;
      for (i=0;i<=10000;i++);
      PORTB = 0b00010000;
      for (i=0;i<=10000;i++);
    }

  return 0;
}

Die LED ist aber immer nur an... die for-schleife zu verlängern bringt 
auch nichts...

Hab ein 8MHz Quarz dran und mit 22pF an masse...
fusebits sind auf
"Ext.Crystal/Resonator Hight Freq.; Start-up time 1k ck + 0ms"

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Anfängerfehler Nr. 4 (oder ähnlich weit vorne)

Probier's mal mit: volatile int i;

(Mach' Dir nichts draus - den Fehler haben fast alle mal gemacht :-))

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oha,

davon hab ich noch nie gehört, hab bisher alle Zählvariablen nur mir int 
deklariert, was ist denn der unterschied?

und vielen Dank schon blinkts...

Gruß Martin

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan Wimmer (wswbln)

>...Anfängerfehler Nr. 4 (oder ähnlich weit vorne)
>Probier's mal mit: volatile int i;

Oder noch besser. Vergiss die Schleifen, nimm dir richtigen Funktionen.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

MFG
Falk

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs kapiert :)

Wenn ich die Codekomprimierung des Compilers abschalte gehts auch :)
mensch war das doof :)

Gruß

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grob gesagt: das 'volatile' sagt dem Compiler, dass die Variable u.U. 
ausserhalb seiner direkten Kontrolle (z.B. durch eine ISR, oder weil es 
ein Portregister ist, ...) verändert werden KÖNNTE, und zwingt ihn dazu 
jeden Zugruiff darauf auch wirklich durchzuführen.

Ohne das 'volatile' merkt der Optimierer, dass Deine Zählschleife 
eigentlich nichts bewirkt (ein Zeitgefühl haben CPUs (noch? ;-) nicht) 
und optimiert die kurzerhand zu "i=10000". Damit blinkt's dann doch ein 
klein wenig zu schnell für unsere (um diese Zeit) müden Äuglein...


@Falk:
Delay-Funktionen oder gar Timer kommen doch erst in den nächsten 
Lektionen ;-))))

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja,

also ich hab AVR Studio erst wieder neu installiert vorher hatte ich die 
Code optimierung ausgeschaltet... hab ich jetzt auch wieder gemacht, 
niemand pfuscht in meinem Code rum :)

endlich kann ich weiterlöten, dachte schon ich hab was falsch gemacht :)

Vielen Dank nochmal, finds echt klasse dass ich hier immer in so kurzer 
Zeit so viele Antworten hab :)

Gute Nacht

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ehrlich gesagt wundert es mich, dass es geht. Bei 16MHz  10000  2 
komme ich auf 800Hz. Ich hab jetzt nicht die Zyklen für einen 
Schleifendurchlauf gezählt. Aber wenn ich nur 10 annehme, bleiben immer 
noch 80Hz. Mein Auge würde das nicht mehr auflösen und ich würde eher 
von einer PWM mit 50% Tastverhältnis sprechen.
Oder mache ich da einen Gedankenfehler???

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hab die 8 MHz überlesen, macht dann 40Hz also Flimmern. Eine 
Stubenfliege könnte das Blinken noch auflösen.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hatte ja geschrieben dass eine erhöhen der Zählschleife nichts nützt... 
und auch mit 10 000 seh ich ein deutliches Blinken... zwar schnell aber 
es ist bestimmt noch kein flimmern...

Der Fehler lag eindeutig an der Quelltextoptimierung vom AVR-Studio...

gruß

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin (Gast)

>Der Fehler lag eindeutig an der Quelltextoptimierung vom AVR-Studio...

Der Fehler sass vor der Tastatur . . .

duckundwech
Falk

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
grrrr... naja aber so könnte es auch gewesen sein...

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du ein deutliches Blinken siehst, würde ich mal nachsehen, ob auch 
wirklich der externe Quarz verwendet wird. Mir scheint es eher, dass der 
Controller auf dem internen 1MHz clock läuf - ist aber nur eine Idee.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.