Moin ich hab jetzt ein bisschen mit pwm experimentiert und eigentlich
läuft soweit alles (rgb Farbwechsel) aber ein Problem hab ich noch: es
wird nicht die max. Spannung also die Versorgungsspannung ausgegeben.
Ist das normal oder hab ich nen Fehler im code ?
#define F_CPU 4000000UL /* Quarz mit 4 Mhz */
#include <avr/io.h>
#include <stdint.h>
#include <inttypes.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile uint8_t led1 = 125; // Rot
volatile uint8_t led2 = 135; // Grün
volatile uint8_t led3 = 255; // Blau
volatile uint8_t pwmcnt0 = 1;
volatile uint8_t farben[25] =
{0,135,0,125,0,0,0,0,255,125,135,0,125,0,75,0,135,75,125,75,25,125,135,2
55};
ISR(TIMER0_OVF_vect)
{
++pwmcnt0
if(pwmcnt0 <= led1)
{
PORTA |= (1<<PA0); //LED an
}else
{
PORTA &= ~(1<<PA0); //LED aus
}
if(pwmcnt0 <= led2)
{
PORTA |= (1<<PA1); //LED an
}else
{
PORTA &= ~(1<<PA1); //LED aus
}
if(pwmcnt0 <= led3)
{
PORTA |= (1<<PA2); //LED an
}else
{
PORTA &= ~(1<<PA2); //LED aus
}
}
int main()
{
DDRA = 0xFF; //A auf Ausgang
DDRB = 0x00; //A auf Eingang
PORTB = 0xFF; //PullUp's an
TCCR0 = (1<<CS00); //prescaler 1
TIMSK = (1<<TOIE0); //Overflow
sei(); //interrupts an
while(1)
{
}
return 0;
}
wenn nun wie im code angegeben die LED für Blau den Wert 255 bekommt
sollte die Versorgungsspannung ja kontinuierlich aktiv sein und es
sollten bei Vcc 5V auch 5V am Pin anliegen, aber gemessen hab ich nur
bisschen mehr als 4V.
Hab ich irgendwas falsch gemacht oder ist das so ?
Den Code habe ich mir nicht genau angeschaut, interessant wäre noch die
Schaltung dazu. Auf den ersten Blick sieht es aber gut aus.
Es kann sein, dass unter Last du Ausgangsspannung etwas einbricht,
deswegen wäre die Schaltung interessant.
Hast du die Möglichkeit, mit einem Oszi mal auf den Pin zu schauen?
Jedes dieser "volatile"s ist unnötig, und verlangsamt nur deinen Code.
Volatile verbietet dem Compiler, Zugriffe auf eine Variable zu
optimieren, weil diese in einem Interrupt verändert werden könnte.
Deine Zugriffe finden aber alle INNERHALB einer ISR statt, die
ihrerseits NICHT unterbrochen werden kann, d.H. der Compiler kann da
nicht viel falschmachen.
Gerade "pwmcnt0" würde der Compiler wohl liebend gern in einem Register
halten...
Danke euch beiden, den Tipp mit "volatile" werde ich mir merken,
allerdings ist in der aktuellen Version (woraus ich den wichtigsten Teil
gepostet habe) die Möglichkeit gegeben die LED Werte per Hand zu ändern.
Hier brauch ich volatile dann wieder.
Zum Schaltplan, im Prinzip mit ganz schnell erklärt: Mikrocontroller -
LED dazwischen kein Widerstand oder sonstiges. Sitzt alles auf einem
Steckbrett + 4Mhz Quarz. Kann der Einbruch der Spannung vielleicht damit
zusammen hängen, dass ich im mom keine Kondensatoren verwende ?
unecht wrote:
> Mikrocontroller - LED dazwischen kein Widerstand oder sonstiges.> Steckbrett + 4Mhz Quarz. Kann der Einbruch der Spannung vielleicht damit> zusammen hängen, dass ich im mom keine Kondensatoren verwende ?
Möglich. Aber spendier der LED erst mal einen Vorwiderstand.
Tust du das nicht, wird der Strom durch die LED nur dadurch
begrenzt, dass der µC irgendwann nicht mehr genug Strom liefern
kann. Dem µC bleibt dann nichts anderes übrig als in der
Spannung einzubrechen.
Hmm geht auch nicht. Habe Vorwiderstände in bezug auf die VCC gewählt,
also 5V - Versorgungsspannung der LED / 20mA aber nun kommt noch weniger
an.
Im Moment ist auf dem Steckbrett zu Testzwecken noch ein Transistor
(inklusive Vorwiderstand) welcher über VCC versorgt wird allerdings
liefert dieser bei einem LED Wert von 255 (Spannungsversorgung sollte ja
theoretisch dauerhaft aktiv sein) auch nur max. knapp über 4 V
Setze den Portpin einfach mal dauerhaft auf HIGH und miss die Spannung
ohne Last. Eventuell hast du dir mit der Aktion schon den AVR
beschädigt.
Wie hoch ist die (gemessene) Versorgungspannung? Miss die Spannung
einmal direkt an den Pins des AVR und einmal am
Versorgungs-Drähtchen/Batterieclip etc.
Und spendiere dem Aufbau mal ein paar 100nF KerKos, eventuell stören die
Spannungsspitzen dein Multimeter.
Wenn du dir ein billiges Reichelt-Steckbrett geholt hast, dann schau mal
nach ob die Kontakte gut sitzen. Ich habe schon einige Bretter gesehen,
die von sich aus nicht gut kontaktierten.
Was für LED sollen denn das sein, die 5V Flussspannung haben?!
Und alle die gleiche?!
Der arme MC.. für LED nimmt man grundsätzlich (bei konstanter
Spannungsquelle) je einen Widerstand in Reihe zur Strombegrenzung, weil
die LED aufgrund ihrer steilen Kennlinie im Bereich der Flussspannung
nahezu jeden Strom durchlässt, was sie letzten Endes thermisch
zerstört. Ohne Vorwiderstand übernimmt deine MCU bis zu ihren "Absolute
Maximum Ratings" diesen Part (siehe Datenblatt deines Chips), als
Strombegrenzer.. zumindest, so lange wie sie das thermisch durchhält.
Hast du mal ein Datenblatt von deiner RGB LED?
Damit solltest du dann erstmal die Flussspannungen und Ströme für die
LED's raussuchen und berechnen (in Abhängigkeit der Helligkeit in
Candela der einzelnen LED's bei jeweils maximalem Strom).
Damit kann man sich dann Vorwiderstände suchen (in Abhängigkeit von VCC)
und dann erst gehts an den Chip.
Flussspannung LED = Uled
Strom LED = Iled
Vorwiderstand R = (VCC-Uled)/Iled
Alles andere ist außerhalb der Spezifikationen und auf Dauer nicht
empfehlenswert, da früher oder später was kaputt geht..
Die Helligkeit, bzw Farbzusammensetzung steuert man erst danach
mittels PWM von 0..100% für jede einzeln ;-)
Grüsse
PS: ich persönlich bevorzuge es die LED an VCC zu hängen und mit dem
Chip gegen Masse zu ziehen (und damit den Strom einzuschalten), da die
Masse bei den Chips im Allgemeinen thermisch besser angekoppelt ist und
so meistens mehr aushält...
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.