Forum: Compiler & IDEs Moodlight mit tiny2313


von Flo A. (sodaholic)


Lesenswert?

Hey, hab vor mir nen Moodlight mit nen paar Extrafeatures(Farbsteuerung 
via Poti, etc.) zusammenzubasteln, habe aber schon bei nem einfachen 
Farbübergang nen paar Probleme.
Bisher hab ich zum testen nur eine RGB-LED drann.
Rot an PINB2, Blau an PINB3 und Grün an PINB4

Der Sourcecode ist folgender:
1
//Moodlight für den Atmel AVR Attiny2313 von Florian
2
3
#include <stdio.h>
4
#include <avr/io.h>
5
#include <util/delay.h>
6
7
int main(void)
8
{
9
TCCR0A = 0b10100011; TCCR0B=0b00000010; TCNT0 = 0x00; TIMSK = 0x00;
10
DDRB = 0b00011100;
11
OCR0A = 100; OCR1A = 0; OCR1B = 100;
12
int r = 100; int b = 0; int g = 100;
13
int min = 10; int max = 255;
14
while(1)
15
    {
16
    while(r < max)//rot an
17
      {
18
      OCR0A = r;
19
      _delay_ms(5);
20
      r++;
21
      }
22
    while(g > min)//grün aus
23
      {
24
      OCR1B = g;
25
      g--;
26
      _delay_ms(5);
27
      }
28
    while(b < max)//blau an
29
      {
30
      OCR1A = b;
31
      _delay_ms(5);
32
      b++;
33
      }
34
    while(r > min)//rot aus
35
      {
36
      OCR0A = r;
37
      r--;
38
      _delay_ms(5);
39
      }
40
    while(g < max)//grün an
41
      {
42
      OCR1B = g;
43
      _delay_ms(5);
44
      g++;
45
      }
46
    while(b > min)//blau aus
47
      {
48
      OCR1A = b;
49
      b--;
50
      _delay_ms(5);
51
      }
52
    }
53
return 0;
54
}

Irgendwo muss ich mal wieder einen Denkfehler haben oder das Datenblatt 
falsch verstanden haben, tut sich nämlich nur bei dem roten Kanal was. 
Ich hab im Moment die Vermutung das ich das TCCR0A oder die OCRxx 
Register noch nicht ganz verstanden habe.Über hilfe würde ich mich 
riesig freuen :)

lg soda

von Karl H. (kbuchegg)


Lesenswert?

Flo A. schrieb:

> Irgendwo muss ich mal wieder einen Denkfehler haben

Logo.
Du hast hast auch den Timer 1 nicht auf PWM konfiguriert.

Timer 0 und Timer 1 sind 2 voneinander verschiedene Timer, die nichts 
miteinander zu tun haben.

von Flo A. (sodaholic)


Lesenswert?

Ah, ok, dann heißt wohl die 1 bei OCR1B oder OCR1A das es ein Ausgang 
explizit für den Timer 1 ist, war mir nicht bewusst. Danke für den Tip, 
werd mich nochmal mit dem Timer 1 auseinanderseten und dann sollte es 
wohl funktionieren.

von Flo A. (sodaholic)


Lesenswert?

Grob funktioniert das ganze jetzt schonmal, allerdings kommt es beim 
Timer1 leider zum flackern, wenn die LED entweder ein- oder 
ausgeschaltet wird.

Sourcecode ist für den prozess folgender:
1
while(g > min)//grün aus
2
      {
3
      OCR1B = g * 255;
4
      g--;
5
      _delay_ms(5);
6
      }

Ist die Rechnung g * 255 für den 8-Bit controller zu anspruchsvoll, oder 
hat er vielleicht Probleme damit einen Timer 2 Mal zu benutzen? Mit dem 
8-Bit Timer hab ich keine Probleme. Als ich noch nicht implementier 
habe, das Timer 1 eine 16-Bit Quantisierung hat, lief alles ohne 
Flackern, allerdings waren die LED's natürlicherweise nicht so Hell wie 
die an Timer 0.

Falls es an der Doppelbelegung des Timer liegt, kann man den 
Timercontrol an einem Pin auch ausschalten, oder schaltet man PORTB den 
Output wieder auf high? Falls das nicht geht könnte man ja noch über 2 
zusätzliche Transistoren, pro Farbe, das ganze steuern.

Viele Grüße, soda

von Karl H. (kbuchegg)


Lesenswert?

Flo A. schrieb:

>       OCR1B = g * 255;

nur weil du einen 16 Bit Timer hast, heisst das nicht, dass du eine 16 
Bit PWM hast.
Welchen PWM Modus hast du denn genommen? Daraus leitet sich dann ab, 
wieviele Bits die PWM umfasst und welchen Faktor du benutzen musst.

Wenn du die 8-Bit PWM nimmst, brauchst du überhaupt nicht multiplizeren 
:-)

von Flo A. (sodaholic)


Lesenswert?

Danke, daran hats gelegen. Das ganze war auf 10-Bit eigestellt und dann 
darf man natürlich nicht von einer 16-Bit Auflösung ausgehen, habs jetzt 
auf 8 Bit laufen und nach Stundenlanger Fehlersuche, hab ich dann noch 
entdeckt das ich beim DDRB-Register eine 0 vergessen habe. Jetzt 
funktioniert es so, wie es soll.

Vielen Dank!!! :)

von Karl H. (kbuchegg)


Lesenswert?

Flo A. schrieb:

> entdeckt das ich beim DDRB-Register eine 0 vergessen habe. Jetzt
> funktioniert es so, wie es soll.

Damit hast du dann dein Lehrgeld gezahlt und praktisch rausgefunden, 
warum diese Schreibweise
1
TCCR0A = 0b10100011; TCCR0B=0b00000010; TCNT0 = 0x00; TIMSK = 0x00;
2
DDRB = 0b00011100;
Müll ist

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.