Forum: Mikrocontroller und Digitale Elektronik PWM Bitte dringend Hilfe


von Nycromatic (Gast)


Lesenswert?

Hey Leute ...

ich hab einen Code für eine PWM geschrieben, der eigentlich auch gut 
lief, aber dann hab ich zwischendurch ein wenig rumgespielt damit und 
auf einmal läuft es nichtmehr. Sieht einer von euch woran es liegen 
könnte? Es soll eigentlich nur eine LED heller und dunkler werden.

#include <avr/io.h>
#include <util/delay.h>

void main (void)
{

DDRD=0xff;
DDRB = 0x02;
TCCR1A =  0xC1; //8-Bit PWM
TCCR1B =  0x01; //Teiler mit CPU Frequenz

int i=50;
int k=2;

while (k!=1)
{
while (i!=250)
{
i=i+1;
_delay_ms(5);

OCR1A=i; 
}

i=250;
while (i!=1)
{
i=i-1;
_delay_ms(5);

OCR1A=i;
}

}
}

von Michael H. (michael_h45)


Lesenswert?

> PWM Bitte dringend Hilfe
Und warum jetzt so dringend? Helfen wird dir das Wort hier sicher 
nicht...
Verstehst du denn den Code, den du geschrieben hast?

Und gewöhn dir Einrückung an, das hilft nicht nur zuletzt dir.

von Nycromatic (Gast)


Lesenswert?

Dringend, weil ich an einem Hochzeitsgeschenk bastel, wofür ich das 
brauche und das sollte bis Donnerstag laufen. Ich hab mir das aus 
verschiedenen Foren zusammengesucht. Also so wirklich was da gemacht 
wird weiß ich nicht.

Wäre aber super wenn mir jemand helfen könnte.
Danke

von Karl H. (kbuchegg)


Lesenswert?

Dein Code ist zwar scheuslich formatiert und auch sonst eher ungelenk, 
aber im großen und ganzen sehe ich nichts was da die Funktion verhindern 
würde.

Welcher Prozessor ist das überhaupt?
Bist du sicher, dass du die LED an den richtigen Pins hast?

von Helmut S. (helmuts)


Lesenswert?

OCR1A=i

Was wird da eigentlich zugewiesen, das high-Byte oder das low-Byte?

i ist "int" was ja wohl 16bit bedeutet.
Vielleicht besser "unsigned short int i" definieren.

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger schrieb:
> Dein Code ist zwar scheuslich formatiert und auch sonst eher ungelenk,

So sollte das aussehen
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#define LED_1  PB0
5
#define LED_2  PB1
6
7
int main (void)
8
{
9
  DDRD = 0xff;
10
  DDRB = (1<<LED_1) | (1<<LED_2);
11
12
  TCCR1A =    (1<<COM1A1) | (1<<COM1A0)   // set on up, clear on down
13
            | (1<<WGM01);                 // phase correct PWM, 8 Bit
14
  TCCR1B =  (1<<CS10);                    // Prescaler: 1
15
16
  while( 1 )
17
  {
18
    for( i = 0; i < 250; ++i )
19
    {
20
      OCR1A = i;
21
      _delay_ms(5);
22
    }
23
24
    for( i = 249; i > 0; --i )
25
    {
26
      OCR1A = i;
27
      _delay_ms(5);
28
    }
29
  }
30
}

von Nycromatic (Gast)


Lesenswert?

Ein ganz großes SORRY,

hab den Fehler gefunden. Ich hab aus versehen beim rumbasteln auf der 
Platine eine Lötstelle mit weggesaugt und schon kam von PB1 nichts mehr 
...

von Karl H. (kbuchegg)


Lesenswert?

Helmut S. schrieb:
> OCR1A=i
>
> Was wird da eigentlich zugewiesen, das high-Byte oder das low-Byte?

Low

> i ist "int" was ja wohl 16bit bedeutet.
> Vielleicht besser "unsigned short int i" definieren.

aus Effizienzgründen: ja.
Da sein Code aber sowieso _delay_ms benutzt, spielt es keine große Rolle

von Michael H. (michael_h45)


Lesenswert?

Nycromatic schrieb:
> Ich hab mir das aus
> verschiedenen Foren zusammengesucht. Also so wirklich was da gemacht
> wird weiß ich nicht.
Das ist durchaus bemerkenswert - und da ist ohne jegliche Ironie 
gemeint.

Viele andere sind dazu nicht in der Lage und darüberhinaus auch bei 
weitem nicht, das dann bei Erstkontakt mit der Materie eigenständig und 
funktionierend auf eine Platine zu bringen.

Ich hoffe, du fühlst dich ermutigt, auf dem Gebiet weiterzumachen. Aber 
Vorsicht, der eigenen Hochzeit muss sowas nicht unbedingt zuträglich 
sein =)

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.