AVR schaltet 2 statt einen Ausgang

Gast #2223629
Lesenswert?

Ich grübel jetzt schon ne ganze weile an diesem problem.

Setup ist ein Mega 8
- An PB 3 - 1 hängen 3 Kabel die zu ner KSQ für Leds führen bei high 
leuchten die Leds

-PB3 ist Rot PB2 Grün u. PB1 ist Blau

Nun funktioniert Blau immer wunderbar aber falls ich grün oder rot 
einzeln schalten will habe ich immer gelb(grün+rot) und an den Augängen 
PB3 Und 2 ein logisches high von 5V.
Mehrere Ausgänge geben dann auch nur noch gelb oder weiß, da die anderen 
Kombinationen an dem gelb scheitern.

Schalten tu ich rot in C per:
1
DDRB |= (1<<PB3);
2
PORTB |= (1<<PB3);

Alternativ hatte ich es hexadecimal mit 0x08;
In der main wird auch wirklich nur das aufgerufen.
Da dies ganz am Anfang von main steht und alles andere auskommentiert 
ist
können ja eigentlich keine Ports vorher gesetzt sein.
Zudem habe ich schon versucht alle auf 0 zu setzen bevor ich R 
geschaltet habe.


Hier die ganze Funktion dazu.
1
void set_primary_color (unsigned char color)
2
{
3
  switch(color)
4
  {
5
    case 1:
6
      DDRB |= (1<<PB3);
7
      PORTB |= (1<<PB3);
8
      //PORTB = 0x08; //red
9
      break;
10
    case 2:
11
      DDRB = 0x04;
12
      PORTB = 0x04; //green
13
      break;
14
    case 3:
15
      DDRB = 0x02;
16
      PORTB = 0x02; //blue
17
      break;
18
    case 4:
19
      DDRB = 0x0E;
20
      PORTB = 0x0E; //all (white)
21
    break;
22
    case 5:
23
      DDRB = 0x0C;
24
      PORTB = 0x0C; //red+green (yellow)
25
    break;
26
    case 6:
27
      DDRB = 0x0A;
28
      PORTB = 0x0A; //red+blue (purple)
29
    break;
30
    case 7:
31
      DDRB = 0x06;
32
      PORTB = 0x06; //green+blue (turquoise)
33
    break;
34
  }
35
}

Bitte schreibt mir auch wenn es nur etwas triviales ist, ich habe mit C 
und den Portregistern erst angefangen, und komme von Java und PHP habe 
also von den Registern keinen Plan.

MFG Babbs
Gast #2223646
Lesenswert?

Hi

>aber falls ich grün oder rot
>einzeln schalten will habe ich immer gelb(grün+rot) und an den Augängen
>PB3 Und 2 ein logisches high von 5V.

Kurzschluss?

Es ist übrigens unnötig DDRB jedes mal zu setzen. Einmal die drei Pins 
auf Ausgang schalten und fertig.

MfG Spess
Gast #2223656
Lesenswert?

Babbsdrebbler schrieb:
> Setup ist ein Mega 8
> - An PB 3 - 1 hängen 3 Kabel die zu ner KSQ für Leds führen bei high
> leuchten die Leds

Und Low schaltet sie ab?

Babbsdrebbler schrieb:
>       DDRB = 0x04;
>       PORTB = 0x04; //green
>       break;

DDRxn=1 und PORTxn=1 bedeutet High.
DDRxn=0 und PORTxn=0 bedeutet High-Z, d.h. keine Verbindung. Das ist 
NICHT Low!

Probier doch mal, DDRB für alle drei Pins IMMER auf Output zu stellen, 
indem zu z.B. bei der Initialisierung "DDRB=0xE" setzt. In 
"set_primary_color" wird dann nur noch "PORTBx" verändert.

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