ATtiny85 Timer/Counter1 will nicht funktionieren

Gast #6170968
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
Gast #6170995
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?
Gast #6171029
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
};
Gast #6171042
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?
Gast #6171093
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.
Gast #6172725
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

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