www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie schnell blinkt die Led


Autor: xBlinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich versuche gerade herauszufinden wie schnell meine Led blinkt... Also 
ich verwende aus dem Pollin Board den ATmega8 an dem ein Quarz 
angeschlossen ist(steht K16.000 drauf ich geh davon aus, damit ist 16 
MHz gemeint...). Hab als Prescaler 1024 eingestellt und Timer 0 ( 8 Bit) 
verwendet. Aber dafür blinkt die Led viel zu langsam! Ich würd jetzt auf 
6 Hz höchstens tippen wobei rein rechnerisch ca 30 Hz rauskommen 
müssten! Wie kann das sein? Hat das Quarz gar keine 16 MHz oder 
verwendet der Controller das gar nicht sondern i-wie was internes?
Danke

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  xBlinker (Gast)

>verwendet. Aber dafür blinkt die Led viel zu langsam! Ich würd jetzt auf
>6 Hz höchstens tippen wobei rein rechnerisch ca 30 Hz rauskommen
>müssten!

6x8 = 48.

> Wie kann das sein?

CLKDIV Fuse?

Siehe AVR Fuses

MfG
Falk

Autor: Julian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> CLKDIV Fuse?

hat der Mega8 nicht.

Kannst du den Quarz ablöten? Dann siehst du sofort ob der AVR den 
internen Takt verwendet oder nicht.

Alternativ kannst du natürlich auch mal das Datenblatt zu Rate ziehen 
und im Kapitel "System Clock and Clock Options" nachgucken

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
xBlinker schrieb:
> Hallo
> Ich versuche gerade herauszufinden wie schnell meine Led blinkt... Also
> ich verwende aus dem Pollin Board den ATmega8 an dem ein Quarz
> angeschlossen ist(steht K16.000 drauf ich geh davon aus, damit ist 16
> MHz gemeint...).

Letzten endes ist das auch egal, wenn der Quarz gar nicht benutzt wird.

Probier mal
#define F_CPU 16000000UL

#include <avr/io.h>
#include <utils/delay.h>

#define LED_DDR   DDR....     // du setzt ein, wo die LED hängt
#define LED_PORT  PORT...     // du setzt ein, wo die LED hängt
#define LED_PIN   P...        // du setzt ein, wo die LED hängt

int main()
{
  LED_DDR = ( 1 << LED_PIN );

  while( 1 ) {
    LED_PORT |= ( 1 << LED_PIN );
    _delay_ms( 1000 );

    LED_PORT &= ~( 1 << LED_PIN );
    _delay_ms( 1000 );
  }
}

Die LED sollte 1 Sekunde an sein und 1 Sekunde aus sein. Es geht nicht 
darum, ob das jetzt auf die Millisekunde genau 1 Sekunde sind. Aber wenn 
dein Mega mit 8Mhz läuft, dann ist die LED 2 Sekunden an und 2 Sekunden 
aus und das kannst du mit freiem Auge sehen. Läuft der Prozessor 
hingegen mit nur 1Mhz, also dem Auslieferungszustand, dann ist die LED 
16 Sekunden an und 16 Sekunden aus. Und den Unterschied kann ein Blinder 
greifen.

Da muss man nichts auslöten. Einfach nur einen möglichst einfachen 
Prozess benutzen (zb LED blinken) und den so aufbauen, dass er von der 
tatsächlich vorliegenden Taktfrequenz abhängt (in dem Fall _delay_ms) 
und das ganze so in den Werten zurechtbiegen, dass man auch ohne 
Messinstrumente eine einigermassen vernünftige Aussage machen kann.

Autor: Rene Zimmermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
_delay_ms( 1000 );

bei

#define F_CPU 16000000UL

das geht nicht!

Gruß Rene

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rene Zimmermann schrieb:
> _delay_ms( 1000 );
>
> bei
>
> #define F_CPU 16000000UL
>
> das geht nicht!

sagt wer?
Schon mal ins Header File reingeschaut, welches seit über einem Jahr 
ausgeliefert wird?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Rene Zimmermann (Gast)

>das geht nicht!

Kommt drauf an.

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

Autor: xBlinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat vll jemand so nen Code für Assembler? Vll hilft euch ja mein 
Programmcode weiter:
.include "m8def.inc"
.def temp = r16
.def led = r17

 
.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler
 
main:
    ldi     temp, LOW(RAMEND)     ; Stackpointer initialisieren
    out     SPL, temp
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp

    ldi   led, 0b01100000
    out    DDRD, led
    ldi   led, 0b00100000
    out    PORTD, led

    ldi     temp, (1<<CS00) | (1<<CS02)       ; CS00 setzen: Teiler 64
    out     TCCR0, temp
 
    ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer Overflow
    out     TIMSK, temp

    sei

loop: rjmp loop

timer0_overflow:
    cpi   led, 0b00100000
    BREQ  ausschalten
    BRNE  einschalten
    reti
    
ausschalten:
      ldi    led, 0b01000000
      out   PORTD, led
      sei
      ret

einschalten:
      ldi    led, 0b00100000
      out   PORTD, led
      sei
      ret

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo xBlinker
Falk Brunner schrieb
>Siehe AVR Fuses
Wenn Du die Fuses nicht Setzt, läuft der µC mit dem Internem Takt und 
nicht mit dem Quarz.

Autor: xBlinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke jetzt funktionierts! Aber woher kann man genau wissen was man für 
ein Quarz hat? Hab im Datenblatt was gelesen von "Crystal Oscillator, 
fast rising power" und "Crystal Oscillator, slowly rising power"...?

Autor: Thomas Klima (rlyeh_drifter) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"power" wie in "power supply"

ansonsten gibts noch "full swing" (Oszillator voll aussteuern) und einen 
Stromsparmodus (CKOPT unprogrammed)

Autor: xBlinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke! Hab jetz noch ne Frage:
Wenn Ich geh mal jetzt davon aus das ich ein 16 MHz Quarz hab! Wenn ich 
jetzt das CKOPT mit dem Wert 0 belege, würde das laut datenblatt heißen 
das nur ein 8 MHz Quarz verwendet werden kann! Was passiert wenn ich das 
auf 0 setze obwohl ich ein 16 MHz Quarz angeschlossen habe?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
xBlinker schrieb:
> Ok danke! Hab jetz noch ne Frage:
> Wenn Ich geh mal jetzt davon aus das ich ein 16 MHz Quarz hab! Wenn ich
> jetzt das CKOPT mit dem Wert 0 belege, würde das laut datenblatt heißen
> das nur ein 8 MHz Quarz verwendet werden kann! Was passiert wenn ich das
> auf 0 setze obwohl ich ein 16 MHz Quarz angeschlossen habe?

Im schlimmsten Fall schwingt der Quarz nicht an.

Autor: Thomas Klima (rlyeh_drifter) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wird wahrscheinlich nicht sicher anschwingen, vielleicht nur sporadisch 
... üble Sache, macht viel Kopfzerbrechen.



und gleich vorweg: bei den Fuses aufpassen "mit dem Wert 0 belegen" ist 
im Datenblatt "programmed" und ist im Programmier Tool damit oft mit 1 
anzugeben.
Sicherheitshalber den Link von Falk oben konsultieren.

Autor: Thomas Klima (rlyeh_drifter) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Im schlimmsten Fall schwingt der Quarz nicht an.

ich halte das sporadische Aussetzen für den schlimmsten Fall :-)

Autor: xBlinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke dann versuch ichs lieber nicht :-)

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.