Attiny 45 mit Arduino ISP, Timerinterrupt Problem

Gast #2988706
Lesenswert?
• ▲
▼
Hallo,

ich verwende einen Attiny 45 (mit 1 Mhz getaktet) an einem 7805 mit 
einem Piezo-Signalgeber am PIN 1 (Hardware-Pin 6).

Ich möchte nun einen halbwegs hörbaren Ton ausgeben, bin dabei aber auf 
Probleme gestoßen.

1. Versuch: PWM mittels analogWrite(..) auf Pin 1. Ich las, dass die 
PWM-Frequenz bei ca. 500Hz liegt, ich habe keinen solchen Ton gehört, 
stattdessen klingt es etwas klapprig und ich messe mit dem Multimeter 
60Hz (mag sein, dass das Multimeter ungenau ist, aber ca. Faktor 9 wird 
der Fehler nicht groß sein..).

2. Versuch: PWM mit den nötigen Registern einstellen. Ich habe 
angenommen, dass der PWM mit Timer 0 funktioniert, ich habe es aber 
nicht genau im Datenblatt gefunden.

Folgendes habe ich gesetzt:
1
TCCR0A |= (1 << COM0A1);  // Clear on compare match
2
TCCR0B |= (1 << CS02); // Prescaler 256
3
TCNT0 = 0;  //Startwert Counter
4
OCR0A = 0;  // Jeden Tick zählen

Damit komme ich auf einen PWM Takt von 3906 Hz, das erreiche ich aber 
wieder nicht einmal annäherend.

3. Versuch: Timer interrupt mit Timer 1:
1
cli();
2
  TCCR1 |= (1<<CS10) | (1<<CS11) | (1<<CS12) | (1<<CS13);
3
  TCNT1 = 0;    /* Startwert Counter */
4
  OCR1A = 0x0000;    /* Stopwert Counter */
5
  DDRB = 0xFF;    /* Alle Pins als Ausgang */
6
  TIMSK |= (1<<TOIE1);  /* Overflow Interrupt an */
7
sei();
8

9
// .......
10

11
ISR(TIMER1_OVF_vect)
12
{
13
  digitalWrite(summPin,0);
14
  digitalWrite(summPin,1); 
15
}

Damit ist der Prescaler bei ca. 16000, der zu erreichende Takt liegt bei 
62,5Hz (nur Testweise), ich höre aber nur alle ca. 4 Sekunden einen 
Tick!

Mache ich einen Denkfehler, oder läuft mein Attiny bei 4kHz..

Danke im Voraus, Adrian
Gast #2988747
Lesenswert?
• ▲
▼
Hi

PIN1 ist beim ATTiny 45 der Reset-Pin. Bist du sicher, das der als 
Port-Pin gefust ist?

>Damit ist der Prescaler bei ca. 16000, der zu erreichende Takt liegt bei
>62,5Hz (nur Testweise), ich höre aber nur alle ca. 4 Sekunden einen
>Tick!

Passt doch. Der Timer hat alle 4,194s einen Overflow. Für den PWM-Mode 
müssen noch andere Bits gesetzt werden. Siehe Kapitel

12.2.2 Timer/Counter1 in PWM Mode

im Datenblatt.

MfG Spess
Gast #2988822
Lesenswert?
• ▲
▼
Wie gesagt, es handelt sich um Hardware-Pin 6!

http://hlt.media.mit.edu/wp-content/uploads/2011/10/ATtiny45-85.png

Muss ich den Arduino Bootloader installieren? Wenn nicht (ich habe ihn 
installiert), kann man ihn wieder entfernen? ;)

___________________
Ich habe noch einen Timer Interrupt ausprobiert (Timer0) mit ca. 2kHz, 
letztlich hat er funktioniert, aber erst, nachdem ich zu Beginn die 
relevanten Register zu null initialisiert habe! Ich dachte, die wären 
immer so gesetzt...
___________________
Zum PWM:

Angenommen, ich möchte mit Register A (OCR1A) vergleichen. Entdeckt habe 
ich da "Compare Mode Select in PWM Mode" Registerbelegungen:

COM1x1 und COM1x0 würde ich dann zu 1,1 setzen (OC1x Set on compare 
match. Cleared when TCNT1= $00. OC1x not connected.). Was setze ich für 
x ein? Ich hätte jetzt A gewählt, weil das mein Compare-Register ist.

Ich muss also COM1A1 = 1 und COM1A0 = 1 im TCCR1 Register setzen?
Gibt es nur das TCCR1 (kein TCCR1B oder TCCR1A..)
Für den PWM-Mode zusätzlich: PWM1A = 1
Bei Compare Match soll der Zähler zurückgesetzt werden: CTC1 = 1
Für Prescaler 256: CS13=1 und CS10=1:
1
TCNT1 = 0;
2

3
TCCR1 = 0;
4
TCCR1 |= (1 << COM1A1) | (1 << COM1A0) | (1 << PWM1A) | (1 << CTC1) | (1 << CS13) | (1 << CS10);
5
OCR1A = 1;

Das sollte also eine Frequenz von (1.000.000 / (256*(1+1))) = 1953,... 
Hz ergeben.

Funktioniert übrigens nicht ;) Ich bekomme bei analogWrite(1, 100) eine 
Frequenz von 60Hz. Was ist da falsch?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.