Forum: Mikrocontroller und Digitale Elektronik Attiny 13 Fast PWM in c kleines problem


von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Hallo,
ich möchte eine LED mit einem ATtiny13 dimmen.
Dazu würde ich gerne die Fast PWM am OC0A nutzen.
Leider habe ich da ein Problem, da die LED einfach nicht gedimmt wird.
Der betreffende Codeausschnitt:
1
  //Mal als Anfangswert 42
2
  OCR0A = 42;
3
  //Fast-PWM-Mode mit SET bei 255 und CLEAR bei compare, OC0A als Ausgang
4
  TCCR0A = (COM0A1 << 1) | (1<<WGM01) | (1<<WGM00);
5
  //prescaler 8
6
  TCCR0B = (1<<CS01);
Leider dimmt die LED nicht. Genauer gesagt glimmt sie schwach auf (was 
sie ja auch sollte?) wenn ich den betreffenden Pin mit einem 10 zu 1 
Tastkopf von meinem Oszilloskop berühre.
An diesem Pin hängt über 1 kOhm dann ein BC817-npn-Transistor und daran 
die LED in grounded-Emitter-Schaltung.
Die Außenbeschaltung kann aber - glaube ich zumindest - nicht das 
Problem sein, da eine Software-PWM funktioniert. Diese wiederum frisst 
zu viel Rechenkapazität als dass ich sie verwenden könnte.
Könntet ihr mir sagen, wo das Problem liegt?
Mit freundlichen Grüßen,
Valentin Buck

von rogger (Gast)


Lesenswert?

spontan tippe ich auf diese Zeile...
Valentin Buck schrieb:
> TCCR0A = (COM0A1 << 1) | (1<<WGM01) | (1<<WGM00);

soll wohl heißen:
1
TCCR0A = ( 1 << COM0A1) | (1<<WGM01) | (1<<WGM00);

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Danke. Das war echt ein dummer Fehler. Allerdings tut sich da immer noch 
nicht viel. Hier ist mein kompletter Code
1
#include <avr/io.h>//the basic features of input and output
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
char autofad;//The autofading value
5
char counting_dir;//The counting dircetion for autofad
6
7
void autocount(){
8
  if(counting_dir == 0){
9
    autofad ++;}
10
  else{
11
    autofad--;}
12
    
13
    if(autofad == 255){counting_dir = 1;}
14
    if(autofad == 0){counting_dir = 0;}
15
}
16
17
void init(){
18
  //PORT init-------------------------------------------
19
  //configure PORTB1 as Output
20
  DDRB = (1<<PB1);
21
  //ADC init--------------------------------------------
22
  // 8-Bit Mode, single shot mode, channel PB4
23
  ADMUX = (1<<REFS0) | (1<<ADLAR) | (1<<MUX1);
24
  //prescaler 64, enable ADC, freerunning
25
  ADCSRA = (1<<ADPS1) | (1<<ADPS2) | (1<<ADEN) |(1<<ADSC)| (1<<ADATE);
26
  //start Timer-----------------------------------------
27
  //Pre-define OCR04 as 42/255 duty-cycle
28
  OCR0A = 200;
29
  //Set OC0A at zero, Clear OC0A at compare match
30
  TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00);
31
  //prescaler 8, Fast-PWM-Mode
32
  TCCR0B = (1<<CS01);
33
}
34
35
36
int main(){
37
  init();
38
  while(1){
39
          //refresh PWM value
40
          OCR0A = ADCH;
41
          //Toggle TP2
42
    PORTB = PORTB ^ (1<<PB1);
43
    _delay_ms(10);
44
  }
45
  return 0;
46
}
Gibt es sonst im Code noch größere Probleme?
Mit freundlichen Grüßen,
Valentin Buck

von Karl H. (kbuchegg)


Lesenswert?

Nochmal zum mitschreiben.

Wo genau, an welchem Pin hast du jetzt deine LED?



1
int main(){
2
  init();
3
  while(1){
4
          //refresh PWM value
5
          OCR0A = ADCH;
6
          //Toggle TP2
7
    PORTB = PORTB ^ (1<<PB1);
8
    _delay_ms(10);
9
  }
10
  return 0;
11
}

Lass doch erst mal den ADC aus dem Spiel, wenn du doch schon mit der PWM 
nicht klar kommst.

Die Dinge werden nicht einfacher, je mehr neue und nicht beherrschte 
Komponenten man einsetzt!

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Die LED hängt über den Treiber an Port PB0 (OC0A).
Mit freundlichen Grüßen,
Valentin Buck

von Karl H. (kbuchegg)


Lesenswert?

Valentin Buck schrieb:
> Die LED hängt über den Treiber an Port PB0 (OC0A).

Und wo schaltest du den Pin auf Ausgang?

von Hc Z. (mizch)


Lesenswert?

Das langsame An- und Abschwellen, des „autofad“ wohl andeuten soll, 
wirst Du so nicht erreichen.  Du zählst viel zu schnell hoch und wieder 
runter.  Da gehört eine_delay_ms() dazwischen.  Allerdings irgend eine 
mittlere Helligkeit, möglicherweise mit Schwebungen, sollte sich 
einstellen.

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Karl heinz Buchegger schrieb:
> Und wo schaltest du den Pin auf Ausgang?

Wie? Muss ich das auch noch machen? Ich dachte der µC macht das per 
Hardware, wenn Fast-PWM mit dem COM0A1-Register gesetzt ist...

@Hc Zimmerer: Stimmt. Das muss ich noch machen.

Danke für eure Tipps!

Mit freundlichen Grüßen,
Valentin Buck

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Compiliert, geflasht, eingesetzt, funktioniert! Mann muss ja wirklich 
den PORT auf Ausgang schalten!
DANKE!
mit freundlichen Grüßen,
Valentin Buck

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.