Problem mit Code. Neuling braucht Hilfe.

Gast #2612880
Lesenswert?

Hallo zusammen.
Vorab: Ich bin absoluter Neuling. Ich habe einen Atmega8 und möchte 
damit gerne RGB LEDs beschalten. Angefangen hab ich damit, ein Programm 
(Anhang) für einen Regenbogenlauf der LED zu schreiben. Leider habe ich 
damit ein kleines Problem. Zum testen habe ich noc heinzelne LEDs 
angeschlossen.
Und zwar funktionieren die Stufen 3 und 4 nicht sauber. Die grüne LED 
spinnt rum. Um dem Problem auf den Grund zu gehen, habe ich mir den 
Ausgang für grün mit nem Oszilloskop angeguckt.
Bei den anderen Stufen sieht es so aus:

______->___...___->

......->...___...->_______

Bei der grünen so:


......->__..___..___->__________

______->____________->__________

Leider werden die Leerzeichen automatisch entfernt. Da wo Punkte sind 
ist nichts. Ich hoffe das ist irgendwie verständlich.

Irgendwas stimmt da nicht. Habe schon die LED sowie den Port getauscht. 
es liegt am Programm. Findet jemand den Fehler und kann mir helfen?

Danke im voraus.

Gruß Sebastian
Angehängte Dateien:
#2612895
Lesenswert?

@  Sebastian (Gast)

>    * Code.txt (1,9 KB, 1 Downloads)

Das nächste mal einfach als .c Datei posten, siehe netiquette.

>Irgendwas stimmt da nicht. Habe schon die LED sowie den Port getauscht.
>es liegt am Programm. Findet jemand den Fehler und kann mir helfen?

Das Konzept deiner hangestrickten PWM durchschaue ich auf die Schnelle 
nicht. Mein Tipp. Dimme erstmal nur eine Farbe.

MFG
Falk
Gast #2612931
Lesenswert?

Danke für die schnellen Antworten.
@ Falk: eine Farbe dimmen funktioniert. alle anderen Stufen gehen auch. 
rot an, blau fährt hoch. alles kein problem. nur der grüne spinnt beim 
hochfahren und bei dauer an. beim rutnerfahren des grünen ist alles ok.

@Peter: Verstehe ich leider nicht. Wie gesagt ich hab da gerade erst mit 
angefangen und bin froh dass ich das was ich bisher habe hinbekommen 
hab.

Also noch mal zur Erklärung was ich da versucht habe. Ich hab für einen 
Regenbogendurchlauf die Schleife mit k benutzt. Dadurch wird wird die 
Farbzusammensetzung geändert. Bei Stufe 1 läuft der von 0 bis 255. Dabei 
ist rot dauerhaft an und blau wird hochgedimmt. dies übernimmt die 
schleife mit i. wenn k klein ist, sprich die gemischte farbe ziemlich 
nah bei rot ist, wird blau weniger häufig zugeschaltet als bei k bei 
255. Die i Schleife pulst die zu dimmende LED. Dadurch wird die LED hoch 
bzw rutner gedimmt.

Gruß Sebastian
Persönliche Seite #2612973
Lesenswert?

Habs mal lesbar gemacht. Jetzt kann man erahnen, was du vorhast:
1
/*
2
 * AVRGCC1.c
3
 *
4
 * Created: 22.03.2012 21:17:34
5
 *  Author: Besitzer
6
 */
7

8
#define F_CPU   1000000UL
9
#define RED         PC5
10
#define GREEN       PC4
11
#define BLUE        PC3
12
#define RGB_PORT  PORTC
13
#define RGB_DDR    DDRC
14

15
#include <stdint.h>
16
#include <avr/io.h>
17
#include <util/delay.h>
18

19

20
int main(void)
21
{
22
  uint16_t i=0;
23
  uint16_t k=0;
24

25
  RGB_DDR = 255;
26

27
  while(1) {
28
    RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE);       //alle aus
29
    _delay_ms(1000);                                        //pause
30
    RGB_PORT |=  _BV(RED) |  _BV(GREEN) |  _BV(BLUE);       //alle an
31
    _delay_ms(1000);                                        //pause
32
    RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE);       //alle aus
33
    _delay_ms(1000);                                        //alle an
34

35
    for (k=0; k<=1530; k++) {                               //Zählschleife, eine Regebogendurchlauf
36
      for (i=0; i<=255; i++) {                              //Zählschleife, hoch, runter dimmen
37
        if (0<k && k<=255)  {                               //Stufe 1: rot an, blau hochdimmen
38
          RGB_PORT |= _BV(RED);
39
          if (i<=k)             RGB_PORT |= _BV(BLUE);
40
          else                  RGB_PORT &= ~_BV(BLUE);
41
        }
42
        else if (255<k && k<=510) {                  //Stufe 2: blau an, rot runter
43
          RGB_PORT |=  _BV(BLUE);
44
          if (!(i<=(k-255)))    RGB_PORT |=  _BV(RED); //!
45
          else                  RGB_PORT &= ~_BV(RED);
46
        }
47
        else if (510<k && k<=765) {                  //Stufe 3: blau an, grün hoch
48
          RGB_PORT |= _BV(BLUE);
49
          if (i<=(k-510))       RGB_PORT |=  _BV(GREEN);
50
          else                  RGB_PORT &= ~_BV(GREEN);
51
        }
52
        else if (765<k && k<=1020) {                  //Stufe 4: grün an, blau runter
53
          RGB_PORT |= _BV(GREEN);
54
          if (!(i<=(k-765)))    RGB_PORT |=  _BV(BLUE); //!
55
          else                  RGB_PORT &= ~_BV(BLUE);
56
        }
57
        else if (1020<k && k<=1275) {                //Stufe 5: grün an, rot hoch
58
          RGB_PORT |= _BV(GREEN);
59
          if (i<=(k-1020))      RGB_PORT |=  _BV(RED);
60
          else                  RGB_PORT &= ~_BV(RED);
61
        }
62
        else if (1275<k && k<=1530) {                  //Stufe 6: rot an, grün runter
63
          RGB_PORT |= _BV(RED);
64
          if (!(i<=(k-1275)))   RGB_PORT |=  _BV(GREEN); //!
65
          else                  RGB_PORT &= ~_BV(GREEN);
66
        }
67
      }
68
    }
69
  }
70
}
Gast #2612974
Lesenswert?

1
/*
2
* AVRGCC1.c
3
*
4
* Created: 22.03.2012 21:17:34
5
*  Author: Besitzer
6
*/ 
7
#define F_CPU 1000000UL
8
#define RED     PC5
9
#define GREEN    PC4
10
#define BLUE     PC3
11
#define RGB_PORT  PORTC
12
#define RGB_DDR    DDRC
13
#include <stdint.h>
14
#include <avr/io.h>
15
#include <util/delay.h>
16
int main(void)
17
{
18
  uint16_t i=0;
19
  uint16_t k=0;
20

21
  RGB_DDR=255;
22

23
  while(1)
24
  {
25
    RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE);      //alle aus
26
    _delay_ms(1000);                      //pause
27
    RGB_PORT |= _BV(RED) | _BV(GREEN) | _BV(BLUE);        //alle an
28
    _delay_ms(1000);                      //pause
29
    RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE);      //alle aus
30
    _delay_ms(1000);                      //alle an
31
    
32
    for (k=0;k<=1530;++k)              //Zählschleife, eine Regebogendurchlauf
33
    {
34
      for (i=0;i<=255;++i)              //Zählschleife, hoch, runter dimmen
35
      {
36
        if (0<k && k<=255)              //Stufe 1: rot an, blau hochdimmen
37
        {
38
          RGB_PORT |= _BV(RED);
39
          if (i<=k)
40
          RGB_PORT |= _BV(BLUE);
41
          else
42
          RGB_PORT &= ~_BV(BLUE);
43
        }
44
        else if (255<k && k<=510)            //Stufe 2: blau an, rot runter
45
        {
46
          RGB_PORT |= _BV(BLUE);
47
          if (!(i<=(k-255)))
48
          RGB_PORT |= _BV(RED); //!
49
          else
50
          RGB_PORT &= ~_BV(RED);
51
        }
52
        else if (510<k && k<=765)            //Stufe 3: blau an, grün hoch
53
        {
54
          RGB_PORT |= _BV(BLUE);
55
          if (i<=(k-510))
56
          RGB_PORT |=_BV(GREEN);
57
          else
58
          RGB_PORT &=~_BV(GREEN);
59
        }
60
        else if (765<k && k<=1020)            //Stufe 4: grün an, blau runter
61
        {
62
          RGB_PORT |= _BV(GREEN);
63
          if (!(i<=(k-765)))
64
          RGB_PORT |= _BV(BLUE); //!
65
          else
66
          RGB_PORT &= ~_BV(BLUE);
67
        }
68
        else if (1020<k && k<=1275)            //Stufe 5: grün an, rot hoch
69
        {
70
          RGB_PORT |= _BV(GREEN);
71
          if (i<=(k-1020))
72
          RGB_PORT |= _BV(RED);
73
          else
74
          RGB_PORT &= ~_BV(RED);
75
        }
76
        else if (1275<k && k<=1530)            //Stufe 6: rot an, grün runter
77
        {
78
          RGB_PORT |= _BV(RED);
79
          if (!(i<=(k-1275)))
80
          RGB_PORT |= _BV(GREEN); //!
81
          else
82
          RGB_PORT &= ~_BV(GREEN);
83
        }
84
      }
85
    }
86
  }
87
}

so wäre noch besser, dann hättest du auch selbst deinen { } Klammern 
Fehler gefunden.

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