Forum: Mikrocontroller und Digitale Elektronik Attiny 45 mit Arduino ISP, Timerinterrupt Problem


von Adrian (Gast)


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

von Spess53 (Gast)


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

von Adrian (Gast)


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?

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.