Forum: Mikrocontroller und Digitale Elektronik Quarz an Attiny45


von Knipex W. (spektrometer)


Lesenswert?

Hallo Zusammen,

ich würde gerne mit dem Attiny45 einen Timer realisieren.

Dieser soll je nach gesetzten Eingang(PB0 und PB2) zu unterschiedlichen
Zeiten einen Ausgang(PB1) auf High setzen.(Habe hier eine LED 
angeschlossen)

Ich verwende AVR Studio 6.2 mit dem mkII ISP.

Mein Programm steht unten. Es ist noch nicht fertig und momentan nur zum

Testen. Es funktioniert auch alles soweit.

Das Problem besteht momemtan darin, einen Quarz anzuschließen und die
notwendigen Bits zu setzen. Der Quarz ist 32kHz und liegt wie im 
Datenblatt
beschrieben mit C1 und und C2 an XTAL1 und XTAL2.

Um den Quarz zu aktivieren muss CKSEL fuses to ‘0110’ gesetzt werden.
Ich habe im "Device Programmer" SUT_CKSEL auf EXTLOFXTAL_32KCK_14CK_64MS
gesetzt und geflasht.
Seitdem lässt sich der Attiny nicht mehr erreichen. Der uC kann nicht 
mehr erased werden und umprogrammieren
kann ich ihn auch nicht.

Mein Programm funktioniert auch nicht mehr (LED blinkt nicht)

An XTAL1 und XTAL2 lässt sich jedoch nun die Frequenz von 32kHz messen!!

Habe ich die Bits richtig gesetzt? und Wie lässt sich "CKSEL fuses to 
‘0110’" einstellen.
Warum kann ich nicht mehr auf den Controller zugreifen?




#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#ifndef F_CPU
#define F_CPU 10000000UL
#endif
int main(void)
{
  DDRB |= (1 << PB1);   //  PB1 als Ausgang definieren

  DDRB &= ~(1 << PB0);  //  PB0 als Eingang definieren

  DDRB &= ~(1 << PB2);  //  PB2 als Eingang definieren



  // Timer 0 konfigurieren@
  TCCR1 = (1<<CS13) | (1<<CS11) | (1<<CS10); // Prescaler auf 1024 
setzen S. 90 Datasheet

  // Overflow Interrupt erlauben
  TIMSK |= (1<<TOIE1);

  // Global Interrupts aktivieren
  sei();

  PORTB &= ~(1<< 1);     //Port 1 auf low schalten

  while(1)
  {

    }
}

#ifndef TIMER0_OVF_vect

#define TIMER0_OVF_vect TIMER0_OVF0_vect
#endif

 #include <stdint.h>

 int32_t g_counter = 0;  // Counter auf 0 setzen

ISR (TIMER1_OVF_vect)
{
  g_counter++;        // Counter hochzählen lassen
  if(g_counter >= 15)  {    // Wenn counter kleiner 20

    PORTB |= 1<< 1;      // PB1 auf high
    _delay_ms(1500);


   PORTB &= ~(1 << PB1);    // PB1 auf low
  g_counter = 0;        // counter auf 0 setzen

  }


    else if (bit_is_clear(PINB,PB2))    //Wenn auf low
    {
      PORTB |= 1<< 1;          //  PB1 auf High setzen
      _delay_ms(1000)  ;
       PORTB &= ~(1 << PB1);      //  PB1 auf LOw setzen
        g_counter = 0;
    }


  else if((g_counter >= 5) && (bit_is_clear(PINB,PB0)))
  {
    PORTB |= 1<< 1;    // PB1 auf high

    _delay_ms(500);
     PORTB &= ~(1 << PB1);    // PB1 auf low
    g_counter = 0;      // counter auf 0 setzen


  }
}

von Uwe (de0508)


Lesenswert?

Hallo,

dein SPI darf nun nur noch maximal 32kHz/4 betragen.
Das muss du dann auch so einstellen können.
Die Fusebits habe ich jetzt nicht überprüft.

von Mein grosses V. (vorbild)


Lesenswert?

Knipex W. schrieb:
> Mein Programm funktioniert auch nicht mehr (LED blinkt nicht)

Doch. Das funktioniert noch. Das dauert nur alles 300x länger.

Auch mit dem 125KHz ISP-Takt kommt der Controller nicht mehr klar.
<F_CPU/4. Also die 6,1KHz oder so ähnlich einstellen. Dann spricht er 
auch wieder mit dir.

von c-hater (Gast)


Lesenswert?

Knipex W. schrieb:

> An XTAL1 und XTAL2 lässt sich jedoch nun die Frequenz von 32kHz messen!!

Vorausgesetzt, dem ist wirklich so, dann gilt:

> Mein Programm funktioniert auch nicht mehr (LED blinkt nicht)

Doch. du musst nur geduldig genug warten. Etwa 2 Minuten. Dann geht sie 
an und nach rund 7 Minuten wieder aus. Aber nur ganz kurz (vermutlich 
nicht sichtbar), um sofort wieder für weitere 7 Minuten an zu sein. Usw. 
usf.

Oder anders ausgedrückt: dein Programm ist sowieso kompletter Bullshit. 
Du verpasst Timer-Interupts, weil du in der ISR blockierend wartest, was 
man niemals und unter keinen Umständen tun sollte. Das gilt übrigens 
völlig unabhängig vom tatsächlich verwendeten Takt!

Insgesamt ein wunderschönes Beispiel dafür, wie man es NICHT machen 
sollte...

> Seitdem lässt sich der Attiny nicht mehr erreichen. Der uC kann nicht
> mehr erased werden und umprogrammieren
> kann ich ihn auch nicht.

Das liegt daran, dass der ISP-Takt kleiner 1/4 des AVR-Taktes sein muss. 
Du kannst also maximal mit etwa 8kHz ISP-Takt programmieren. Nicht jeder 
Programmer beherrscht das. Und auch denen, die es beherrschen, muss man 
erstmal sagen, dass sie es tun sollen.

von Knipex W. (spektrometer)


Lesenswert?

Danke für Eure Antworten.


Also das mit dem ISP Clock habe ich auch schon runtergestellt.
Egal welchen Wert ich nehme, es erscheint immer der Fehler "unable to 
enter programming mode"

Gibt es noch weitere Einstellungen?

<F_CPU/4   kann ich ja nicht mehr ändern, da sich der uC nicht mehr 
flashen lässt.


Müsste die LED nicht trotzdem angehen, wenn ich PB2 schalte?


Dass das Programm nicht besonders toll ist, weiß ich selbst. Es ist das 
erste Mal dass ich einen uC programmiere und ich taste mich langsam 
vorran.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn da noch die CKDIV8 Fuse gesetzt war, sinds nur noch 4kHz Takt. Das 
heisst, das du die ISP Frequenz nochmal weiter runtersetzen musst (unter 
1kHz).
Bei AVR Studio 4 kann man in der ISP Frequenz selber Werte eintippen, 
obs bei Studio 6 noch klappt, weiss ich nicht.

: Bearbeitet durch User
von Peter R. (pnu)


Lesenswert?

Eventuell den 32 kHz-Quarz wegnehmen und externen Takt von ca. 1 oder 8 
MHz an X1 oder X2 einspeisen. Wo, siehe Datenblatt, damit man damit auf 
den internen Takt zurück fusen kann.

btw. manchmal ist es so, dass der Oszillator erst durch die Kapazität 
des Tastkopfs zu schwingen anfängt. Dann zeigt das Scope oder der Zähler 
ein Schwingen, ohne dieses Messinstrument schwingt aber nichts.
Dann natürlich für den Test ein Blinkprogramm schreiben, das sinnvollere 
Zeiten aufweist.
Erst wenn dieses läuft, auf 32 kHz umstellen.

: Bearbeitet durch User
von Knipex W. (spektrometer)


Lesenswert?

Okay. Der Takt war zu hoch eingestellt. Wusste nicht,dass man auch 
selber Zahlenwerte eingeben kann. CKDIV8 war auch gesetzt.
Jetzt muss ich an meinem Programm was arbeiten, Danke!

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
Noch kein Account? Hier anmelden.