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
@ 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
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
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
1 | #define F_CPU 16000000UL
|
2 | |
3 | #include <avr/io.h> |
4 | #include <utils/delay.h> |
5 | |
6 | #define LED_DDR DDR.... // du setzt ein, wo die LED hängt
|
7 | #define LED_PORT PORT... // du setzt ein, wo die LED hängt
|
8 | #define LED_PIN P... // du setzt ein, wo die LED hängt
|
9 | |
10 | int main() |
11 | {
|
12 | LED_DDR = ( 1 << LED_PIN ); |
13 | |
14 | while( 1 ) { |
15 | LED_PORT |= ( 1 << LED_PIN ); |
16 | _delay_ms( 1000 ); |
17 | |
18 | LED_PORT &= ~( 1 << LED_PIN ); |
19 | _delay_ms( 1000 ); |
20 | }
|
21 | }
|
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.
_delay_ms( 1000 ); bei #define F_CPU 16000000UL das geht nicht! Gruß Rene
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?
@ Rene Zimmermann (Gast) >das geht nicht! Kommt drauf an. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#avr-libc_Versionen_ab_1.6
Hat vll jemand so nen Code für Assembler? Vll hilft euch ja mein Programmcode weiter:
1 | .include "m8def.inc" |
2 | .def temp = r16 |
3 | .def led = r17 |
4 | |
5 | |
6 | .org 0x0000 |
7 | rjmp main ; Reset Handler |
8 | .org OVF0addr |
9 | rjmp timer0_overflow ; Timer Overflow Handler |
10 | |
11 | main: |
12 | ldi temp, LOW(RAMEND) ; Stackpointer initialisieren |
13 | out SPL, temp |
14 | ldi temp, HIGH(RAMEND) |
15 | out SPH, temp |
16 | |
17 | ldi led, 0b01100000 |
18 | out DDRD, led |
19 | ldi led, 0b00100000 |
20 | out PORTD, led |
21 | |
22 | ldi temp, (1<<CS00) | (1<<CS02) ; CS00 setzen: Teiler 64 |
23 | out TCCR0, temp |
24 | |
25 | ldi temp, (1<<TOIE0) ; TOIE0: Interrupt bei Timer Overflow |
26 | out TIMSK, temp |
27 | |
28 | sei |
29 | |
30 | loop: rjmp loop |
31 | |
32 | timer0_overflow: |
33 | cpi led, 0b00100000 |
34 | BREQ ausschalten |
35 | BRNE einschalten |
36 | reti |
37 | |
38 | ausschalten: |
39 | ldi led, 0b01000000 |
40 | out PORTD, led |
41 | sei |
42 | ret |
43 | |
44 | einschalten: |
45 | ldi led, 0b00100000 |
46 | out PORTD, led |
47 | sei |
48 | ret |
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.
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"...?
"power" wie in "power supply" ansonsten gibts noch "full swing" (Oszillator voll aussteuern) und einen Stromsparmodus (CKOPT unprogrammed)
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?
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.
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.
Karl heinz Buchegger schrieb:
> Im schlimmsten Fall schwingt der Quarz nicht an.
ich halte das sporadische Aussetzen für den schlimmsten Fall :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.