PWM mit ATtiny 2313

OP #4154995
Lesenswert?

Hey zusammen,

bin mir mein Programm am umbauen, von ATmega32 auf ATtiny2313. Ist das 
erste mal das ich einen anderen Controller verwende außer dem mega32.

Zu meiner Frage, auf PB2 (OC0A) soll die PWM einen Motor steuern. Aber 
wenn ich das Programm aufspiele, läuft er sofort los obwohl er keine 
Anweisung dafür hat. Auf dem anderen Controller lief es, bzw er lief 
nicht sofort an :)  musste ja theoretisch nur die Register ändern.

1
/* define CPU 8Mhz */
2
#ifndef F_CPU
3
#define F_CPU 8000000
4
#endif
5

6
// Bibliotheken
7
/...
8

9
int main(void)
10
{
11
  
12
  DDRD  |= (1<<PD0);                 // PD0 = Ausgang
13
  DDRD  |= (1<<PD1);                 // PD1 = Ausgang
14
  DDRD  &= ~(1<<PD2);               // PD2 = Eingang
15
  DDRD  &= ~(1<<PD3);               // PD3 = Eingang
16
  
17
  DDRB  |= (1<<PB0);                 // PD4 = Ausgang
18
  DDRB  |= (1<<PB1);                 // PD5 = Ausgang
19
  DDRB  |= (1<<PB2);                 // PD6 = Ausgang
20
  
21
  PORTD |= (1<<PD2);                // Pull-Up an PD2 aktivieren
22
  PORTD |= (1<<PD3);                // Pull-Up an PD3 aktivieren
23
  
24
  // Interrupt für INT1 initialisieren
25
  MCUCR |= (1<<ISC11);              // Fallende Flanke löst aus
26
  GIMSK |= (1<<INT1);                // INT0 & INT1 enable
27
  
28
  // Timer0/PWM initialisieren
29
  TCCR0A |= (1<<WGM01) | (1<<COM0A0);        // CTC-Mode | Toggle OC0A @ Compare Match
30
  TCCR0B |= (1<<CS01);              // Prescaler 8
31
  
32
  // Timer1 initialisieren
33
  TCCR1B |= (1<<WGM12) | (1<<CS10) | (1<<CS12);  // CTC-Modus | Prescaler 1024
34
  TIMSK |= (1<<OCIE1A);              // Interrupt A bei Timer-Overflow
35
  OCR1A = 7812;                  // (Zeit * (uC-Takt/Prescaler)) - 1)   -->   (1sek * (8000000MHz/1024)) - 1) = 7811.5 Ticks/Sekunde
36
  
37
  sei();
38

39
  while (1)
40
  {  
41
    OCR0A = 0;
42
}}
Gast #4155010
Lesenswert?

Hi

>Auf dem anderen Controller lief es, bzw er lief
>nicht sofort an :)

Glaub ich nicht. Mit deinen Einstellungen (// CTC-Mode/OCR0A = 0;) gibt 
der Ausgang ein Rechtecksignal mit der halben Timerfrequenz aus. Nimm 
einen PWM-Modoe, der kein CTC ist.

MfG Spßess
OP #4155024
Lesenswert?

Wir reden hier von Timer0, was soll denn fehlen? Timer1 können wir 
ignorieren, der funktioniert.

Timer 0 hat doch den Endwert 255, wenn ich
1
OCR0A = 0;
 setzte, habe ich doch "0%" am Ausgang und der Motor steht.

Es hat wirklich funktioniert. Und mit dem Mega32 steht der Motor von 
Anfang an, solang ich keinen Wert ins OCR0 Register schreibe.
.
Oder habe ich einen Denkfehler?
Gast #4155032
Lesenswert?

Hi

>OCR0A = 0;
> setzte, habe ich doch "0%" am Ausgang und der Motor steht.

Bei CTC?

Die Formel für die Ausgangsfrequenz bei CTC ist:
    fOCnx= fclk_I/O/(2 ⋅ N ⋅ (1 + OCRnx))

Setz mal OCRnx auf Null. Wie groß ist fOCnx?

MfG Spess
OP #4155088
Lesenswert?

Ok, das heißt ich habe bei OCR0=0 immer noch 500kHz. Habs gecheckt!

Auf jeden Fall mal Danke für den Denkanstoß. Habe das Programm 
abgeändert:
1
  // Timer0/PWM initialisieren
2
  TCCR0A |= (1<<WGM00) | (1<<WGM01) | (1<<COM0A1);// Fast-PWM | Clear OC0A on Compare Match, set OC0A at TOP
3
  TCCR0B |= (1<<CS01);              // Prescaler 8

Es funktioniert jetzt. Trotzdem verstehe ich nicht warum es auf dem 
Mega32 mit CTC läuft, und auf dem Tiny nicht. Muss ich nochmal testen 
wenn ich Zeit habe.

Vielen Dank!
Gast #4155118
Lesenswert?

Hi

>Trotzdem verstehe ich nicht warum es auf dem
>Mega32 mit CTC läuft, und auf dem Tiny nicht.

Der ATMega32 reagiert in dieser Beziehung genau wie der ATTiny2313. 
Check das noch mal.

Übrigens

>OCR0A = 0;
> setzte, habe ich doch "0%" am Ausgang und der Motor steht.

ist keine 0% sondern 1/256%. Wenn du wirklich 0% haben willst musst du 
entweder die PWM abschalten oder invertierte PWM benutzen. Dann kommst 
du allerdings nur auf 255/256% statt 100%

>Dieter Frohnapfel (jim_quakenbush)

Bleib mit deinem Gequake im Busch.

MfG Spess

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