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 } }
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.
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.
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.
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.