Forum: Mikrocontroller und Digitale Elektronik PWM mit ATtiny 2313


von Markus S. (gigaherz87)


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
}}

von Dieter F. (Gast)


Lesenswert?

Ein glatter Fall von Befehlsverweigerung - scheint mir.

Oder wurden falsche Befehle gegeben? Fehlt da gar ein ganzer Timer? 
Scheint so ... (im Zweifel hilft das Datenblatt ...)

von spess53 (Gast)


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

von Markus S. (gigaherz87)


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?

: Bearbeitet durch User
von spess53 (Gast)


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

von Markus S. (gigaherz87)


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!

von spess53 (Gast)


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

von Dieter F. (Gast)


Lesenswert?

spess53 schrieb:
> Bleib mit deinem Gequake im Busch.

Nö :-)

von Thomas E. (thomase)


Lesenswert?

spess53 schrieb:
> 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%

Mit Phase Correct von 0 - 100%.

mfg.

von spess53 (Gast)


Lesenswert?

Hi

>Mit Phase Correct von 0 - 100%.

Richtig. Der TO schrieb aber: "// Fast-PWM | ....".

MfG Spess

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.