Forum: Mikrocontroller und Digitale Elektronik PWM mit dem ATtiny13 funktioniert nicht *C-Code*


von Marc S. (elektromann1000)


Lesenswert?

Hallo,

ich habe im Internet einen Programmcode für eine PWM gefunden.
Leider funktioniert der Code bei mir nicht.
Vll. kann mir jemand sagen was falsch ist

Mein Code:
1
#include<avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
6
int main (void)
7
8
{
9
  int pwm_soll = 20;
10
  int pwm_phase = 0;
11
12
  DDRB |= (1<<PB0);
13
  TCCR0A  = ((1<<WGM01) | (1 << WGM00) | (1 << COM0A1)) ;  
14
  TCCR0B  = ((1<<WGM02) | (1<<CS01) | (1<<CS00));   TCNT0=92;  OCR0A=42;
15
16
while(1)
17
{
18
  if(pwm_soll == pwm_phase)
19
  
20
  {
21
    PORTB |= (1<<PB0);
22
  }
23
  pwm_phase++;
24
  if( pwm_phase == 100)
25
  {
26
    pwm_phase = 0;
27
    PORTB &= ~(1<<PB0);
28
  }
29
}
30
return;
31
}
Ende des Codes

DANKE!

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

was geht denn nicht?

Die werte werden sich so schnell ändern das du nur nicht siehst.

von Max D. (max_d)


Lesenswert?

Marc S. schrieb:
> TCCR0B  = ((1<<WGM02) | (1<<CS01) | (1<<CS00));   TCNT0=92;  OCR0A=42;

Warum ist das alles in einer Zeile ?

von Karl H. (kbuchegg)


Lesenswert?

Marc S. schrieb:
> Hallo,
>
> ich habe im Internet einen Programmcode für eine PWM gefunden.

Den Code hast du gefunden?


Der ist Müll.


Entweder du erzeugst die PWM selber 'per Hand', oder du lässt das den 
Timer machen. Aber beides zusammen in einem Programm ist Mist.

Du stellst den Modus 7 ein, Fast-PWM mit einem Top Wert in OCR0A.
Dann bestimmst du aber nicht mit OCR0A den Duty Cycle sondern mit OCR0B. 
Und dann kannst du die PWM auch nicht am Pin PB0 abgreifen, sondern am 
zuständigen Pin für OCR0B, nämlich PB1.


Kurz und gut.
Wenn du diesen Code gefunden hast, wärst du besser beraten gewesen, dir 
die Grundlagen der Timer Einstellung selbst beizubringen und dann selbst 
etwas zu programmieren. Das gezeigte Programm ist nicht Fisch, nicht 
Fleisch. Das ist einfach nur Mist.

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

so muss das (is bereits fürn tiny13):
1
#define ROT  0
2
#define GRUN 1
3
#define BLAU 2
4
#define PROT  PB0
5
#define PGRUN PB1
6
#define PBLAU PB2
7
uint16_t RGB_Werte[3];
8
volatile uint16_t timercount = 0;
9
10
  TCCR0A = (1<<WGM01); //CTC Mode
11
  TCCR0B = (1<<CS00);  //CLK/1
12
  OCR0A  = 99;         //9,6M/100 = 96kHz
13
  TIMSK0 = (1<<OCIE0A); //IRQ enable
14
15
ISR(TIM0_COMPA_vect){
16
17
  //erhöhen und wraparound (10bit PWM)
18
  timercount = (timercount + 1) & 0x3ff;
19
20
  uint8_t portint = 0;
21
  if (RGB_Werte[ROT] > timercount) {portint |= (1<<PROT);};
22
  if (RGB_Werte[GRUN] > timercount) {portint |= (1<<PGRUN);};
23
  if (RGB_Werte[BLAU] > timercount) {portint |= (1<<PBLAU);};
24
  PORTB = portint;
25
26
}

: Bearbeitet durch User
von elektromann (Gast)


Lesenswert?

Danke für eure Antworten.

fritzler wenn ich deinen Code in mein Programm (Atmel Studio 6.0) 
eingebe funktioniert es leider nicht.

es zeigt mir einige Fehler an
was könnte das Problem sein?

von elektromann1000 (Gast)


Lesenswert?

folgende Fehler werden angezeit:

Warning  1  implicit declaration of function 'ISR'
Error  2  '__vector_6' undeclared (first use in this function)
Warning  3  each undeclared identifier is reported only once for each 
function it appears in
Error  4  expected ';' before '{' token
Warning  5  unused variable 'timercount' [-Wunused-variable]
Warning  6  unused variable 'RGB_Werte' [-Wunused-variable]

von Karl H. (kbuchegg)


Lesenswert?

elektromann schrieb:
> Danke für eure Antworten.
>
> fritzler wenn ich deinen Code in mein Programm (Atmel Studio 6.0)
> eingebe funktioniert es leider nicht.
>
> es zeigt mir einige Fehler an
> was könnte das Problem sein?


Das dieser Code nur ein Codeausschnitt ist (wo ist zb die main() 
Funktion, wo sind die #include). Aussderm (wenn man sich den rest 
dazudenkt) passt er nicht besonders gut zu deiner Aufgabenstellung.

Du kannst es drehen und wenden wie du willst. Du wirst um lernen nicht 
herum kommen. Da gehört natürlich auch dazu, dass man anderer Leute Code 
studiert. Aber: studieren ist nicht dasselbe, wie Code einfach kopieren!
Und: wenigstens die einfachsten Grundlagen von C wirst du lernen müssen.

: Bearbeitet durch User
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.