Forum: Mikrocontroller und Digitale Elektronik ATtiny85 Timer/Counter1 will nicht funktionieren


von Jch (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei zwei Timer im ATtiny85 zu programmieren.
Der Timer0 funktioniert wie er soll.

Timer1 macht mir Probleme. Ich habe schon ein komplett neues Projekt 
angefangen und alles unnötige auskommentiert.

Hier mein aktueller Code:
1
#define F_CPU 8000000UL
2
3
#include <avr/io.h>
4
#include <inttypes.h>
5
#include <avr/interrupt.h>
6
 
7
ISR(TIMER1_COMPA_vect){
8
  //PORTB ^= (1<<PB1);
9
}
10
11
12
int main(void) {
13
    DDRB |= (1<<PB1);    // set LED pin as output
14
15
    TCCR1 |= ((1<<CS13) | (1<<CS11) |(1<<COM1A1)) ;    //prescaler 32 ==> ca 1ms pulsbreite max// PB1 als Pin zuweisen
16
     TCCR1 |= (1<<CTC1);                  //Clear output on compare
17
     OCR1A =125;        //spaeter variabel
18
     //OCR1C =225;
19
     TIMSK |= (1<<OCIE1A);
20
    
21
22
sei();  //enable interrupts
23
24
  while (1)
25
  {  
26
  }
27
};

Bin ich nun richtig in der Annahme, dass PB1 auf ca. 50% Helligkeit 
leuchten sollte?

In der while(1) steht nix drin. Das sollte aber trotzdem den PB1 zum 
toggeln bringen oder?

Was könnte mein Problem sein?

Danke

von S. Landolt (Gast)


Lesenswert?

Ad hoc würde ich sagen: COM1A0 setzen statt COM1A1.
Und wozu soll die ISR gut sein?

von Andreas B. (bitverdreher)


Lesenswert?

S. Landolt schrieb:
> Ad hoc würde ich sagen: COM1A0 setzen statt COM1A1.
Würde ich genauso sehen. COM1A1 toggelt. COM1A0 setzt nur immer wieder 
auf 0.

> Und wozu soll die ISR gut sein?
Vermutlich zum testen. Aktuell wohl für nichts. ;-)

von Jch (Gast)


Lesenswert?

Ich dachte COM1A1 setzt den Counterwert bei Compare auf 0 zurück und 
COM1A0 toggelt?

Ich habe mal COM1A1 gegen COM1A0 getauscht, aber es funktioniert genauso 
wenig.

Die ISR war zum testen, ob sich was ändert. Aber bin ich richtig in der 
Annahme, dass die leere ISR ausgeführt werden muss?

von Andreas B. (bitverdreher)


Lesenswert?

Der Prescaler ist übrigens 512 und nicht 32.
Die ISR könnte vom Compiler wegoptimiert werden. Aber da eh nichts drin 
steht wirst Du sie nicht vermissen.

von S. Landolt (Gast)


Lesenswert?

> Ich habe mal COM1A1 gegen COM1A0 getauscht, aber
> es funktioniert genauso wenig.

Merkwürdig. Bei mir läuft es.

von S. Landolt (Gast)


Lesenswert?

> COM1A1 toggelt. COM1A0 setzt nur immer wieder auf 0.

?
Genau umgekehrt, dachte ich.

von S. Landolt (Gast)


Lesenswert?

Um es abzukürzen, dies läuft bei mir:
1
#define F_CPU 8000000UL
2
#include <avr/io.h>
3
4
int main(void) {
5
    DDRB |= (1<<PB1);
6
    TCCR1 |= ((1<<CS13) | (1<<CS11) |(1<<COM1A0)) ;
7
    TCCR1 |= (1<<CTC1); 
8
    OCR1A =125;
9
  while (1)
10
  {  
11
  }
12
};

von Andreas B. (bitverdreher)


Angehängte Dateien:

Lesenswert?

S. Landolt schrieb:
>> COM1A1 toggelt. COM1A0 setzt nur immer wieder auf 0.
>
> ?
> Genau umgekehrt, dachte ich.

Hast richtig gedacht. Sorry!

von S. Landolt (Gast)


Lesenswert?

Jetzt zweifle ich doch an meinem Sehvermögen (oder gar an meinem 
Verstand?):

Jch schrieb:
> Ich dachte COM1A1 setzt den Counterwert
> bei Compare auf 0 zurück und COM1A0 toggelt?

Ja, richtig. Aber warum steht dann im originalen Programm COM1A1?

von S. Landolt (Gast)


Lesenswert?

> Die ISR könnte vom Compiler wegoptimiert werden.

Sicher nicht - es erfolgte ein Sprung ins Nichts.

von c-hater (Gast)


Lesenswert?

Andreas B. schrieb:

> Die ISR könnte vom Compiler wegoptimiert werden.

Dann wäre er schlicht kaputt. Er hat nämlich garnicht genug Information, 
um alle Seiteneffekte zu kennen, die dies u.U. zur Folge hätte.

Speziell beim AVR8: automatisches Rücksetzen der IRQ-Flags bei vielen 
Interrupts. Und natürlich das Zeug, was beim Wakeup aus den Sleep-Modi 
eine Rolle spielt.

von Jch (Gast)


Lesenswert?

Hallo Leute,

ja, das Programm funktioniert auch bei mir.

Das mit den Prescaler-Einstellungen lag daran, dass ich zuletzt in dem 
Kapitel "Timer/Counter 1 in Attiny 15 mode" gelesen hatte.

Ich sollte auch beim flashen auch die richtige HEX Datei verlinken.
Ich glaube das war gestern einfach nicht mein Tag.


Neuer Tag neues Glück:

Mein Ziel ist es eine Zeitschaltuhr zu bauen, welche ein PWM Signal 
ausgibt.
Nach einer Zeit X soll das PWM Signal ausgehen und der Ausgang LOW 
bleiben (bis ich es wieder aktiviere)


Leider funktioniert es nicht so ganz. Nach der Zeit X geht mein PWM 
schon aus, aber leider bleit der Ausgang HIGH. Auch wenn ich danach noch 
ein
1
  PORTB &= ~(1<<OUTPUT);  //ausschalten.
 hinschreibe.



Was kann der Grund dafür sein?

Meine PWM Ausschaltbedingung ist folgende:
1
TCCR1 &= ~((1<<CS12) | (1<<CS11));  //PWM AUS
CS12 und CS11 sind der einzig verwendete Prescaler
Aber warum kriege ich den Ausgangspin nicht auf LOW?

Danke schonmal

von S. Landolt (Gast)


Lesenswert?

> TCCR1 &= ~((1<<CS12) | (1<<CS11));  //PWM AUS

Damit bleibt aber COM1A0 stehen - vielleicht mal TCCR1=0 versuchen.

von S. Landolt (Gast)


Lesenswert?

PS:
Siehe die vom bitverdreher gezeigte Tabelle: 'disconnected' ist nur, 
wenn die COM1A_ auf 0 stehen.

von Jch (Gast)


Lesenswert?

Danke. Ich habe das nicht so gelesen, als müsse es wirklich auf 0 
gesetzt werden.

In der Prescalertabelle sah es offensichtlicher aus.

Es funktioniert.
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.