Forum: Mikrocontroller und Digitale Elektronik AVR schaltet 2 statt einen Ausgang


von Babbsdrebbler (Gast)


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

von spess53 (Gast)


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

von A.H. (Gast)


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.

von Babbsdrebbler (Gast)


Lesenswert?

Bitte unter zu dumm zum Löten einordnen, danke.

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.