Forum: Mikrocontroller und Digitale Elektronik manchmal abruptes Ein + ausschalten der LED


von A. Z. (sunmoon)


Angehängte Dateien:

Lesenswert?

Die Leds eines Lichtobjektes sollen sehr langsam auf- und abfaden. Das 
tun sie auch fast immer, manchmal jedoch schalten sich die LEDs abropt 
an oder aus. Woran könnte das liegen?
Die Schaltung ist einfach- siehe Anhang. Es wird auffallen, daß kein 
Widerstand vor der LED ist, da das Objekt über Batterie läuft ist das 
nicht nötig.
Danke im Voraus für eure Ideen.
1
 Prozessor : ATmega8
2
// Takt : 4000000Hz    
3
// Sprache : C
4
----------------------------
5
//
6
#define   F_CPU   3686400
7
#include <avr\io.h>
8
#include <avr\interrupt.h>
9
#include <avr\sleep.h>
10
#include <util\delay.h>
11
12
volatile uint8_t wakesleep; //Umschaltung wach/schlafmodus 0=schlaf  1= wach
13
volatile uint8_t waitdark;  //warten auf sichere Dunkelheit
14
uint8_t msek; //zaehler für sek
15
volatile uint16_t sek;
16
17
volatile uint16_t eingabe;
18
volatile uint8_t aufab;
19
20
21
22
23
//--------------------------------------------------------------------
24
// TIMER2_COMP_vect - Timer2 Interrupt bei Vergleichswert
25
// aktuelle Einstellung: 125 Hz 8 ms
26
//--------------------------------------------------------------------
27
ISR(TIMER2_COMP_vect)   // Interrupt für pwm
28
{
29
   msek ++;
30
   if (msek>=125){sek++;msek=0;}
31
   if(aufab==0){eingabe++;}
32
   if(aufab==1){eingabe--;}
33
}
34
//------------------------------------------------------------------------
35
//Interruptroutine für den AC(analog Comparator)
36
//----------------------------------------------------------------
37
ISR(ANA_COMP_vect)
38
        {
39
        
40
     
41
        }
42
// Initialisierungen
43
//------------------------------------------------------------------------
44
void init()          //PORTC 0,1 und D2 Reserve Ein u Ausgänge
45
{
46
   // Ports initialisieren
47
   DDRB |= _BV(1);   // PORTB1 auf Ausgang  (ausgabe der pwm für faden der lichter
48
   DDRC |= 0xff; //PORTC auf Ausgänge f LEDs
49
   DDRD  |=(1<<DDD0); //Ausgang für Motor
50
   
51
   DDRD &= ~_BV(6);   // PORTD6 AIN0 auf Eingang ohne PullUp  für AC  (Referenzwert-poti)
52
   DDRD &= ~_BV(7);   // PORTD7 AIN1 auf Eingang ohne PullUp  für AC  (ist-wert lichtempf Widerstand)
53
   
54
   
55
 
56
       
57
     /*  ACSR =  1<<ACIE | 0<<ACIS1;  */  //comparator interrupt on falling edge (AIN1 > AIN0)  geht
58
     
59
     
60
     TCCR1A=(1<<WGM11)|(1<<COM1A1); // 9 Bit Zähler, nicht invertierende PWM
61
   TCCR1B=(1<<CS11)|(1<<CS10) ;  // Teiler 1/64
62
   
63
    
64
   //--- Timer 2 initialisieren ---  8ms - 125 Hz
65
   TCCR2=0x05;   // Teiler 1/128
66
   TCCR2|=0x08;   // Modus: Zählen bis Vergleichswert (WGM21=1)
67
   OCR2=250;   // Vergleichswert speichern
68
   TIMSK|=0x80;   // Interrupt bei Vergleichswert
69
   //--- Interrupts erlauben ---
70
   sei();
71
72
73
 
74
}
75
76
/////////////////////////////////////////////////////////////////////////////
77
// Main-Funktion
78
/////////////////////////////////////////////////////////////////////////////
79
main()
80
{
81
   init();   // Initialisierungen
82
   while (true)    // Mainloop-Begin
83
   {
84
 //___________________________________________________________________________ einschaltung bei Dunkelheit
85
   /*if (sek==1)  {                // abfragen alle 1 sek
86
    if(ACSR & (1<<ACO))   {waitdark++;sek=0; }     //{  PORTB|=(1<<PB1);}   //  (wenn ACO=1)   geht!!!
87
    else {sek=0; waitdark=0;} }//{PORTB&=~(1<<PB1);}  //(wenn ACO=0)
88
   if (waitdark==1) {PORTB|=(1<<PB1);} */   // nach 1 Abfragen einschalten
89
   
90
//____________________________________________________________________________  sleep modus   
91
   
92
/*  if(wakesleep==0){
93
  set_sleep_mode(SLEEP_MODE_IDLE);
94
  sleep_enable();
95
  sleep_cpu();    }
96
  if(wakesleep==1){sleep_disable(); PORTB |= (1<<PB1);}   */
97
  //___________________________________________________________________________  ein u aus faden
98
  //geht!!
99
  
100
  
101
  if(eingabe>=499){aufab=1;}   
102
   if(eingabe==0){aufab=3;_delay_ms (1000);aufab=0;eingabe++;}
103
   OCR1A=eingabe;
104
   
105
   if (PINB &(1<<PINB1)){                        //Ports C2-5 mit PORTB1 synchronisieren
106
     PORTC|=(1<<PC5); PORTC|=(1<<PC4); PORTC|=(1<<PC3); PORTC|=(1<<PC2);}
107
     else{ PORTC &=~(1<<PC5); PORTC &=~(1<<PC4); PORTC &=~(1<<PC3); PORTC &=~(1<<PC2);}
108
   
109
   
110
  
111
   } // Mainloop-Ende
112
}
113
//---------------------------------------------------------------------------

von Udo S. (urschmitt)


Lesenswert?

A. Z. schrieb:
> Es wird auffallen, daß kein
> Widerstand vor der LED ist, da das Objekt über Batterie läuft ist das
> nicht nötig.

Das musst du uns mal genauer erklären. Seit wann ist eine Batterie eine 
Konstantstromquelle?

von Wusel D. (stefanfrings_de)


Lesenswert?

Du solltest einen Vorwiderstand für die LED verwenden. Ansonsten hast Du 
keinen begrenzten Strom, die LED wird bald kaputt gehen und die Spannung 
der Batterie wird instabil, was durchaus Ursache der Fehlfunktion sein 
kann.

von Daniel V. (danvet)


Lesenswert?

PullDown am Transistor fehlt.
Im C-Code steht etwas von "Motor". Das lässt vermuten, dass die 
Schaltung etwas mächtiger ist, als die, die du viermal gepostet hast...

von A. Z. (sunmoon)


Lesenswert?

hallo Daniel, was heißt Pulldown am Transistor?
vielleicht löst das ja das Problem.
Die Schaltung - und der Code - sind in der Tat etwas mächtiger, war bei 
den Tests aber alles ausgeschaltet, so daß es nicht die Ursache sein 
kann.

Das objekt läuft über Batterie, da es in dem Fall nicht anders möglich 
ist. Von einer Konstantstromquelle habe ich nicht geredet.
Es fließt in der LED nur ein Strom von weniger als 200 mA, die LEDs sind 
aber auf 1000 mA ausgelegt, das sollte also kein Problem sein. Ein 
Vorwiderstand würde die LEDs auch zu dunkel werden lassen. Die Batterien 
haben ja einen inneren Widerstand, ich hoffe daß der ausreicht, um die 
LEDs zu schützen.

Die Schaltung habe ich nicht mit Absicht 4x hochgeladen. Das Modul zum 
Hochladen hat mir immer wieder signalisiert, daß keine Datei ausgewählt 
sei, dadurch kam es dazu. Tiut mir leid.

Ich würde mich über weitere Ideen freuen.
Grüße
A. Z.

von Daniel V. (danvet)


Lesenswert?

A. Z. schrieb:
> hallo Daniel, was heißt Pulldown am Transistor?
> vielleicht löst das ja das Problem.
>
> Das objekt läuft über Batterie, da es in dem Fall nicht anders möglich
> ist. Von einer Konstantstromquelle habe ich nicht geredet.
> Es fließt in der LED nur ein Strom von weniger als 200 mA, die LEDs sind
> aber auf 1000 mA ausgelegt, das sollte also kein Problem sein. Ein
> Vorwiderstand würde die LEDs auch zu dunkel werden lassen. Die Batterien
> haben ja einen inneren Widerstand, ich hoffe daß der ausreicht, um die
> LEDs zu schützen.

Die Basis des Transistors ist im Falle eines Resets des uC floatend --> 
LED ganz an, LED ganz aus, oder irgendwas dazwischen.
Da der uC auch an der Batterie hängt und du unbedingt den 
Innenwiderstand der Batterie für deine 1A-LED verwenden möchtest, tippe 
ich mal auf sporadischen Reset des uC, wenn die Spannung einbricht. Da 
auch die 100nF am uC fehlen ist sowieso Schicht im Schacht. Wenn ab und 
zu noch ein Motor losläuft, und die letzte Power aus der Batterie saugt, 
tanzt der uC im Dreieck.
 hat mir alles meine Glaskugel gesagt  :-) (soll heissen, ist alles 
Spekulation)

von MaWin (Gast)


Lesenswert?

> Die Schaltung ist einfach...

...falsch.

Den fehlende LED-Vorwiderstand hast du selbst erkannt, der 
Basis-Vorwiderstand ist zu hoch, er sollte nicht über 1k haben.

Der uC wird halt öfters mal abstürzen, weil er sich selbst die 
Versorgungspannung durch einschalten der LED so stört. Ein 
Abblockkondensator fehlt ja auch.

von Laie (Gast)


Lesenswert?

Ach, alles Quatsch. Die Anderen sind alle doof.
Hier ein paar Grundregeln für Betonköpfe:

* LEDs kann man mit Konstantspannungsquelle betreiben
* Abblockkondesatoren brauche ich bei dieser einfachen Schaltung nicht
* AGND brauche ich nicht anzuschließen, ich nutze ja keinen ADC
* Gleichrichterdioden brauchen keinen Parallelkondensator
* Koax- oder sonstige Leitungen mit definierter Impedanz sind Quatsch, 
einfach über das Stromnetz übertragen
* Sicherungen sind da, um das Gerät vor Defekt zu schützen

Liste beliebig erweiterbar

von A.Z. (Gast)


Lesenswert?

Daniel V. schrieb:
> PullDown am Transistor fehlt.

Also Daniel,
was genau bedeutet ein pulldown am Transistor?

Daniel V. schrieb:
> tippe
> ich mal auf sporadischen Reset des uC, wenn die Spannung einbricht.

An einem Reset des µC kann es nicht liegen, das Programm würde dann ganz 
am Anfang einsetzen, und die LED würde ersteinmal garnicht leuchten. 
(Dieser Programmteil ist oben nicht wiedergegeben), es muss etwas 
anderes sein, da das auf- und abfaden dann sofort weitergeht.

von Karl H. (kbuchegg)


Lesenswert?

A.Z. schrieb:
> Daniel V. schrieb:
>> PullDown am Transistor fehlt.
>
> Also Daniel,
> was genau bedeutet ein pulldown am Transistor?

Was ist denn ein Pulldown?

Ein Widerstand, meist so in der Größenordnung von 10k aufwärts, der 
einen Steuer-Eingang (Hint: Was könnte wohl bei einem Transistor ein 
'Eingang' sein?) gezielt zb mit Masse verbindet, so dass dieser 
Steuereingang auch dann einen regulären Pegel bekommt, wenn die normale 
Ansteuerung (noch) nicht verfügbar ist.

Was könnte das jetzt wohl sein?
(10k von der Basis nach Masse. ABer achte drauf, dass du dir mit dem 
Basiswiderstand dann keinen ungewollt relevanten Spannungsteiler 
einhandelst. Es ist also nicht egal, wo du den Pulldown genau 
platzierst!)

>
> Daniel V. schrieb:
>> tippe
>> ich mal auf sporadischen Reset des uC, wenn die Spannung einbricht.
>
> An einem Reset des µC kann es nicht liegen, das Programm würde dann ganz
> am Anfang einsetzen, und die LED würde ersteinmal garnicht leuchten.
> (Dieser Programmteil ist oben nicht wiedergegeben),

Ja, das lieben wir.
In einem Schmufti-Schaltplan mit einem Programm welches so gar nicht auf 
dem µC läuft, Fehler suchen, die der TO selber nicht sieht.

Sorry. Aber meine Glaskugel ist in Reparatur.
Komm wieder, wenn du ordentliche Unterlagen hast, mit denen man auch 
arbeiten kann. Wir sind doch keine Hellseher.

von Daniel V. (danvet)


Lesenswert?

...ohh... Karl-Heinz war schneller...

- komplettes Programm posten
- kompletter Schaltplan posten

Dann kann dir sicherlich geholfen werden. Alles andere ist Spekulation.

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.