mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATtiny13 PWM-Problem


Autor: Felix S. (Firma: CvO Universität) (verfelixt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe folgendes Problem: Es soll ein Analogwert an PB3 eingelesen 
werden (0-5V) und entsprechend ein PWM-Wert an PB0 ausgegeben werden 
(0-255). Ich bin die Register schon im Datenblatt durchgegangen, aber 
kann keinen Fehler finden, PB0 ist dauerhaft auf 5V (Betriebspannung). 
Ich würde mich echt freuen, wenn mir einer von euch sagen kann, wo mein 
Fehler liegt :)

LG
#include <avr/io.h>

int main(void)
{
  DDRB &= ~(1<<DDB3);
  DDRB = (1<<PB0);
  
  TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00);
  TCNT0 = 0;
  TCCR0B = (1<<CS01) | (1<<CS00);
  
  ADMUX = (1<<ADLAR) | (1<<MUX1) | (1<<MUX0);
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
  
  while (1)
  {
    ADCSRA |= (1<<ADSC);
    while (ADCSRA & (1<<ADSC));
    OCR0A = ADCH;
  }
}

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Felix S. schrieb:
> Ich würde mich echt freuen, wenn mir einer von euch sagen kann, wo mein
> Fehler liegt :)
Der Fehler ist, dass du nicht systematisch vorgehst. Läuft die PWM?
  while (1)
  {
    ADCSRA |= (1<<ADSC);
    while (ADCSRA & (1<<ADSC));
    OCR0A = ADCH;
    OCR0A = 128; // Debug, 50% Duty
}
Wenn das schon nicht geht, liegt es erstmal an der PWM

Autor: Felix S. (Firma: CvO Universität) (verfelixt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das funktioniert nicht.

Autor: Christian F. (neo2001)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Mit dem Problem hat es wahrscheinlich nichts zutun, aber anstatt
DDRB &= ~(1<<DDB3);
DDRB = (1<<PB0);

reicht auch
DDRB |= (1<<DDB0);


Die Register stehen per default auf 0 (bzw. siehe Datenblatt). Zudem 
überschreibst du in der zweiten Anweisung sowieso das gesamte Register. 
;-)

Autor: Felix S. (Firma: CvO Universität) (verfelixt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian F. schrieb:
> Mit dem Problem hat es wahrscheinlich nichts zutun, aber anstatt
>
>
DDRB &= ~(1<<DDB3);
> DDRB = (1<<PB0);
>
> reicht auch
>
>
DDRB |= (1<<DDB0);
>
>
> Die Register stehen per default auf 0 (bzw. siehe Datenblatt). Zudem
> überschreibst du in der zweiten Anweisung sowieso das gesamte Register.
> ;-)

Das hilft leider nicht, aber danke :)

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist Du sicher, dass Du für den ATtiny13 compilierst?

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix S. schrieb:
> Nein, das funktioniert nicht.
Dann sein kreativ, pack das
OCR0A = 128; // Debug, 50% Duty
 vor die while(1)-Schleife

Autor: Holger L. (max5v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist der Programmer beim Testen denn abgesteckt, evtl. fängt der sich 
darüber was ein.

Und läuft der ATtinny auf 8 MHz ?

Autor: Felix S. (Firma: CvO Universität) (verfelixt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich kompiliere für den ATtiny13...

Ingo L. schrieb:
> Felix S. schrieb:
>> Nein, das funktioniert nicht.
> Dann sein kreativ, pack dasOCR0A = 128; // Debug, 50% Duty vor die
> while(1)-Schleife

Funktioniert auch nicht.

Holger L. schrieb:
> Ist der Programmer beim Testen denn abgesteckt, evtl. fängt der
> sich
> darüber was ein.

Ist mit und ohne das selbe Ergebnis.

> Und läuft der ATtinny auf 8 MHz ?

Nein, auf 9.6 MHz.

: Bearbeitet durch User
Autor: Christian F. (neo2001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mal deinen Code - exakt so wie er im ersten Post ist - auf einen 
neuen ATtiny13A geflasht und dann ein Poti an PB3 und eine LED an PB0 
gesteckt - und er tut genau was er soll - die LED lässt sich mit dem 
Poti dimmen.

Einzige Änderung am µC: Die per Default gesetzte CKDIV8 Fuse entfernt, 
damit er mit vollen 9,6 MHz läuft.

Autor: Felix S. (Firma: CvO Universität) (verfelixt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian F. schrieb:
> Habe mal deinen Code - exakt so wie er im ersten Post ist - auf
> einen
> neuen ATtiny13A geflasht und dann ein Poti an PB3 und eine LED an PB0
> gesteckt - und er tut genau was er soll - die LED lässt sich mit dem
> Poti dimmen.
>
> Einzige Änderung am µC: Die per Default gesetzte CKDIV8 Fuse entfernt,
> damit er mit vollen 9,6 MHz läuft.

Auch mit entfernter Fuse läuft es leider nicht. Habe natürlich zu 
Sicherheit alle Verbindungen schon mehrmals überprüft, daran liegt es 
nicht.

Autor: jz23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommentier mal den Inhalt der while()-Schleife aus (Nicht die Schleife 
selber) und setze OCR0A auf einen festen Wert - 128 bsp. Das sollte 
eigentlich funktionieren, wenn nicht, dann ist wohl der µC hops?

Autor: Veit D. (devil-elec)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

eigentlich muss das funktionieren.
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  DDRB = (1<<PB0);
  TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00);
  TCNT0 = 0;
  OCR0A = 0;
  TCCR0B = (1<<CS01) | (1<<CS00);  
  
  while (1)
  {
    OCR0A = 4;
    _delay_ms(2000);
    OCR0A = 32;
    _delay_ms(2000);
    OCR0A = 128;
    _delay_ms(2000);
    OCR0A = 255;
    _delay_ms(2000);
  }
}

Flashen funktioniert ohne Fehler?
Irgendein Resetproblem?
Spannungsversorgung, Masse ... alles okay?
Wenn flashen klappt muss danach auch die LED was tun ...
Wie misst du am Pin?

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix S. schrieb:
> Ich würde mich echt freuen, wenn mir einer von euch sagen kann, wo mein
> Fehler liegt :)

Im Aufbau vermutlich ... das Programm schliesse ich auch aus.

Autor: Holger L. (max5v)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Der Grund für die Frage nach den 8, in diesem Fall natürlich 9,6MHz war 
die Art der Messung. Günstige Multimeter steigen bei zu hohen oder 
niedrigen Frequenzen gerne aus.

Daher:
wie wird die PWM gemessen,
wie wird die Spannung für die Messung erzeugt,
wie ist der Aufbau, Breadboard oder gelötet, saubere Versorgung etc. ?

Das Programm läuft bei mir übrigens auch (zumindest auf einem 
ATtiny13A), um Softwareprobleme auszuschließen ist der Code aus dem 
Eröffnungspost als .hex angehängt.

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.

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