Quarz an Attiny45

OP #4437159
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


  }
}
Gast #4437206
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.
OP #4437215
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.
#4437469
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren