Zusätzliche Pins an Seeduino PE7, PE6, .... -> LED glimmt nur anstatt zuleuchten

Hi,

ich habe ein kleines Problem mit dem Seeduino Mega. Dieser besitzt IOs die auf dem Arduino Mega nicht ausgeführt sind.
An jeweils 8 IOs habe ich einen (ULN2803 = 8 Kanal Transistor IC) und dahinter eine LED.

Nun ist es so, dass die an den IOs PE7, PE6, .... angeschlossenen LEDs nur halb hell glimmen, anstatt zu leuchten. Wenn ich den Transistor Eingang aber an einen Standart IO z.B. DigitalOut 20 hänge, leuchtet die LED normal hell.

Meine IOs definiere ich als Ausgang über diese Funktion:

DDRE |= ((1<<PE7) & (1<<PE6) & (1<<PE2));
DDRG |= ((1<<PG4) & (1<<PG3));
DDRD |= ((1<<PD6) & (1<<PD5) & (1<<PD4));
DDRJ |= ((1<<PJ7) & (1<<PJ6) & (1<<PJ5) & (1<<PJ4) & (1<<PJ3) & (1<<PJ2)); 
DDRH |= ((1<<PH7) & (1<<PH2));

Die IOs werden dann mit dieser Funktion auf High oder Low gesetzt.

void setPin(uint8_t pin, uint8_t value)
{
  switch(pin)
  {
    case 1: if(value == HIGH) { PORTE |= (1 << PE2); } else { PORTE &= ~(1 << PE2); } break;
    case 2: if(value == HIGH) { PORTE |= (1 << PE6); } else { PORTE &= ~(1 << PE6); } break;
    case 3: if(value == HIGH) { PORTE |= (1 << PE7); } else { PORTE &= ~(1 << PE7); } break;
    case 4: if(value == HIGH) { PORTG |= (1 << PG3); } else { PORTG &= ~(1 << PG3); } break;
    case 5: if(value == HIGH) { PORTG |= (1 << PG4); } else { PORTG &= ~(1 << PG4); } break;
    case 6: if(value == HIGH) { PORTD |= (1 << PD6); } else { PORTD &= ~(1 << PD6); } break;
    case 7: if(value == HIGH) { PORTD |= (1 << PD5); } else { PORTD &= ~(1 << PD5); } break;
    case 8: if(value == HIGH) { PORTD |= (1 << PD4); } else { PORTD &= ~(1 << PD4); } break;
    case 9: if(value == HIGH) { PORTJ |= (1 << PJ7); } else { PORTJ &= ~(1 << PJ7); } break;
    case 10: if(value == HIGH) { PORTJ |= (1 << PJ6); } else { PORTJ &= ~(1 << PJ6); } break;
    case 11: if(value == HIGH) { PORTJ |= (1 << PJ5); } else { PORTJ &= ~(1 << PJ5); } break;
    case 12: if(value == HIGH) { PORTJ |= (1 << PJ4); } else { PORTJ &= ~(1 << PJ4); } break;
    case 13: if(value == HIGH) { PORTJ |= (1 << PJ3); } else { PORTJ &= ~(1 << PJ3); } break;
    case 14: if(value == HIGH) { PORTJ |= (1 << PJ2); } else { PORTJ &= ~(1 << PJ2); } break;
    case 15: if(value == HIGH) { PORTH |= (1 << PH7); } else { PORTH &= ~(1 << PH7); } break;
    case 16: if(value == HIGH) { PORTH |= (1 << PH2); } else { PORTH &= ~(1 << PH2); } break;   
  }  
}

Das setzen im Programm erfolgt dann z.B. mit

setPin(16, HIGH);

Hat jemand eine Idee wieso die LEDs nur glimmen anstatt zu leuchten ?

An der Stromaufnahme kann es meiner Meinung nach nicht liegen, da ich ja die ULN2803 verwende. Jeder ULN2803 hat einen eigenen Festspannungsregler und das Steckernetzteil liefert 1,5A.
Der zulässige gesamt Strom am Kontroller wird auch nicht überschritten.

Übersehe ich irgendetwas ?

Ich verstehe Deine Schaltung noch nicht ganz. Kannst Du ein Schaltbild posten?

D20 ist PD1, dieser Pin kommt in Deinem Code aber gar nicht vor. Da sind also gewisse Ungereimtheiten vorhanden. Könntest Du die beseitigen?

Ja klar,
ich habe leider keinen digitalen Schaltplan, und gerade keinen Scanner.

Mit dem Pin 20 meinte ich den Ausgang der noch mit digitalWrite angesprochen werden kann.

Die Ausgänge vom Mikrocontroller sind mit den Eingängen vom ULN2803 verbunden.
Die Ausgänge vom ULN schalten die LEDs auf Masse. Jede LED hat einen Vorwiderstand und liegt somit direkt an VCC (5V)

Am ULN sind PE6, PE7, PE2, PWM2, PWM3, PWM4, sowie die PINs 20, 21 angeschlossen.

Die RGB LED leuchtet so wie sie soll. Genauso ist es bei den LEDs an den PINs 20 und 21. Nur die LEDs an PE7, PE6 und PE2 glimmen nur, als würde zu wenig Spannung ankommen.
Es könnte auch sein das der Strom durch irgendetwas minimiert wird, aber ich finde den Fehler nicht.

Wenn ich die LEDs direkt am Vorwiederstand auf VCC lege und die Masse direkt hinter der LED leuchtet diese normal hell.
Wenn ich die gleichen LEDs die nur glimmen auf einen Ausgang lege den ich mit digitalWrite anspreche, leuchten diese normal hell.

Die Funktionsweise vom ULN 2803 habe ich so verstanden, das dieser die Masse schaltet sobald ein Signal am Eingang anliegt. Bei der RGB LED sowie bei den beiden Dioden die an PIN 20 und 21 sind funktioniert das auch.

Daher such ich im Moment den Fehler bei den Anschlüssen PE7, PE6, PE2. Irgendwas ist hier anders im Gegensatz zu den anderen Anschlüssen.

Ach mensch, wie dä.... :wink:

Zitat aus einem anderen Forum wo ich einen ähnlichen Eintrag gefunden habe:

R = (U0 - ULed - UCE)/Iled

wobei U0 die Betriebsspannung (i. A. 5V), ULed der Spannungsabfall an
der LED (ca. 2-3 V je nach Farbe) und UCE der Spannungsabfall am
Transistor des ULN2803 (ca. 0.8V) ist.

Quelle: ULN 2803 als LEd treiber? - Mikrocontroller.net

Ich habe die 0,8V bei der Berechnung unterschlagen.

Im Anhang ist die eine Datei für die IDE bei der ich die Seeeduino Pin zusätzlich drin habe damit man sie genauso handeln kann wie die "orginalen".
Damit lassen sich die Pins dann eifach als 70-85 benutzen wie die andern auch
Gruß
Der Dani

pins_arduino.c (12.9 KB)

Danke

Ich habe einen neuen Tread angefangen weil dieser nichts mit dem neuen Tema zu tun hat.
http://arduino.cc/forum/index.php/topic,132794.0.html
Grüße Uwe

Hi,
der Tipp der hier stand, das glimmende LEDs oft nicht als Ausgang deklariert sind, hat mich weitergebracht.

Mein Fehler lag dran, das ich die Bitoperationen mit einem & (bitweise-und) Verknüpft habe, anstatt mit einem | (bitweise-oder).

Mein Quellcode den ich oben angegeben habe funktioniert gut, wenn ich diese Änderung berücksichtige.

  //Player Dioden als Ausgänge Deklareren
  DDRE |= ((1<<PE7) | (1<<PE6) | (1<<PE2));
  DDRG |= ((1<<PG4) | (1<<PG3));
  DDRD |= ((1<<PD6) | (1<<PD5) | (1<<PD4));
  DDRJ |= ((1<<PJ7) | (1<<PJ6) | (1<<PJ5) | (1<<PJ4) | (1<<PJ3) | (1<<PJ2)); 
  DDRH |= ((1<<PH7) | (1<<PH2));