www.mikrocontroller.net

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


Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
  //Mal als Anfangswert 42
  OCR0A = 42;
  //Fast-PWM-Mode mit SET bei 255 und CLEAR bei compare, OC0A als Ausgang
  TCCR0A = (COM0A1 << 1) | (1<<WGM01) | (1<<WGM00);
  //prescaler 8
  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

Autor: rogger (Gast)
Datum:

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

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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. Das war echt ein dummer Fehler. Allerdings tut sich da immer noch 
nicht viel. Hier ist mein kompletter Code
#include <avr/io.h>//the basic features of input and output
#include <avr/interrupt.h>
#include <util/delay.h>
char autofad;//The autofading value
char counting_dir;//The counting dircetion for autofad

void autocount(){
  if(counting_dir == 0){
    autofad ++;}
  else{
    autofad--;}
    
    if(autofad == 255){counting_dir = 1;}
    if(autofad == 0){counting_dir = 0;}
}

void init(){
  //PORT init-------------------------------------------
  //configure PORTB1 as Output
  DDRB = (1<<PB1);
  //ADC init--------------------------------------------
  // 8-Bit Mode, single shot mode, channel PB4
  ADMUX = (1<<REFS0) | (1<<ADLAR) | (1<<MUX1);
  //prescaler 64, enable ADC, freerunning
  ADCSRA = (1<<ADPS1) | (1<<ADPS2) | (1<<ADEN) |(1<<ADSC)| (1<<ADATE);
  //start Timer-----------------------------------------
  //Pre-define OCR04 as 42/255 duty-cycle
  OCR0A = 200;
  //Set OC0A at zero, Clear OC0A at compare match
  TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00);
  //prescaler 8, Fast-PWM-Mode
  TCCR0B = (1<<CS01);
}


int main(){
  init();
  while(1){
          //refresh PWM value
          OCR0A = ADCH;
          //Toggle TP2
    PORTB = PORTB ^ (1<<PB1);
    _delay_ms(10);
  }
  return 0;
}

Gibt es sonst im Code noch größere Probleme?
Mit freundlichen Grüßen,
Valentin Buck

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal zum mitschreiben.

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



int main(){
  init();
  while(1){
          //refresh PWM value
          OCR0A = ADCH;
          //Toggle TP2
    PORTB = PORTB ^ (1<<PB1);
    _delay_ms(10);
  }
  return 0;
}

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!

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Und wo schaltest du den Pin auf Ausgang?

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.