Quarz am MEGA16

Gast #788820
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 :
1
#include <avr/io.h>
2

3
int main()
4
{
5
    DDRB = 0b00010000;
6
    PORTB = 0b00010000;
7
    int i=0;
8
    
9
    while(1)
10
    {
11
      PORTB = 0;
12
      for (i=0;i<=10000;i++);
13
      PORTB = 0b00010000;
14
      for (i=0;i<=10000;i++);
15
    }
16

17
  return 0;
18
}

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"
Gast
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
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 ;-))))
Gast
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
Gast
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???
Gast
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ß
Gast
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.