-         

Ergebnis 1 bis 3 von 3

Thema: Takt verändern beim ATmega32

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    01.12.2007
    Beiträge
    32

    Takt verändern beim ATmega32

    Anzeige

    Hallo! Ich hab ein RN Control 1.4 mit AT mega32 und wollte den von 1 Mhz (Default, intern) auf 16 Mhz Quarz (extern) als Taktquelle umstellen. Laut dieser Anleitung hier http://www.mikrocontroller.net/articles/AVR_Fuses muss ich dafür das Fusebit (die Fusebits?) A987 auf 1111 stellen. Ich habe also Bascom aufgerufen und es steht dort schon 1111. Ich habe die Fusebits allerdings nie verändert. Also müsste laut ATmega32-Datenblatt dort eigentlich 0001 stehen. Also meine Fragen:

    Wie kann die 1111 dort hingekommen sein?
    Wie kann ich testen, ob der Controller nun wirklich mit 16 Mhz arbeitet?

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Wie kann ich testen, ob der Controller nun wirklich mit 16 Mhz arbeitet?
    Konfiguriere dir einen Timer so, daß er bei 16MHz einen 1s Takt liefert, und lass eine LED blinken.

    Wenn sie dann jeweils 16s lang aus, und 16s lang an ist, dann läuft der Mega mit 1MHz statt mit 16.
    So viele Treppen und so wenig Zeit!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    01.12.2007
    Beiträge
    32
    Hab gerad mal bißchen mit dem Timer1 rumgespielt

    Code:
    #include <avr/io.h>         
    uint16_t i=0;
     
    int main (void) 
    {           
       TCCR1B = (1<<CS12) | (1<<CS10); )
       DDRC = 0xff;   
      PORTC = 0xFF;  
    
       while (1==1)
       {
         if (TCNT1 == 0x3FF) {i++;}
         if (i==95)  {PORTC=0x00;}
       }
      
      return 0;
    }


    Wenn ich anstatt
    if (i=95) {PORTC=0x00;}
    if (i=94) {PORTC=0x00;}
    schreibe, gehen die LEDs sofort an.

    Also:
    <95: LEDs leuchten sofort nach Programmübertragung
    >95: LEDs leuchten mit Verzögerung von ca. 5s
    Dadrüber gehe es anscheinend linear weiter, also 200 dauert doppelt so lange wie 100, 400 doppelt so lange wie 200 etc.



    Die 1 Hz-LED hab ich so versucht zu realisieren:

    Ich zähle eine Zählvariable pro Timerdurchlauf um 1 hoch. Dann sollen alle LED ab- bzw. ausgeschaltet werden --> Blinken

    Code:
    while (1==1)
       {
        if (TCNT1 == 0x3FF) {i++;}
    	if (i==1000) 
    	    {
    		  if (PORTC==0x00) {PORTC=0xFF;} 
    		  if (PORTC==0xFF) {PORTC=0x00;}
    		  i=0;
    	   }
       }
    Es leuchtet aber gar nichts. Bei dem if (i==1000) habe ich alle möglichen Werte probiert. Meine erste Rechnung ergab 15,3 Timerdruchläufe pro Sekunde. Also habe ich (if i==15) gemacht
    Wo ist mein Denkfehler?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •