Attiny 13 Fast PWM in c kleines problem

OP Persönliche Seite #1770656
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
OP Persönliche Seite #1770690
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
#1770698
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!
#1770709
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.

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