PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Code für eine Fußraumbeleuchtung im LKW



Live85
25.01.2018, 08:14
Hallo, ich bin totaler Anfänger im Programmieren und Schreibe gerade einen kleinen C-Code für eine Fußraumbeleuchtung im LKW und komme einfach nicht weiter..

Meine Plan ist Led's mit einem Pwm Signal an zu steuern, sie sollen wenn das Abblendlicht eingeschaltet ist mit ca 30 % leuchten, sobalt eine Tür geöffnet wird (high signal) sollen die Led's Langsam auf 100% faden und umgekehrt...

Bis jetzt habe ich es geschafft sie auf ca 30% leuchten zu lassen und dass das Signal erkannt wird und die Led auf ca 100% faded, leider bleibt es dann nicht bei den 100% sondern es startet immer wieder neu quasi wie ein Blinklicht.. Huh Huh
Das Ganze soll nachher auf einem Attiny 13a Laufen..
Kann mir jemand weiter Helfen??

Danke...



#include <avr/io.h>
#define F_CPU 1200000UL // 1,2 MHz
#include <util/delay.h>



int main (void)
{
DDRB =(1<<PB0); // Ausgang PB0

TCCR0A=(1<<COM0A1) | (1<<WGM00) | (1<<WGM01); // PWM Phase Korrigieren, OCR0A an TOP setzen
TCCR0B=_BV(CS01) ; // Prescaler 8

int a=255; // Max Wert für Lichtstärke
int b=10; // Min Wert für Lichtstärke

while (1) {

OCR0A = b; // Startpunkt mit Min Lichtstärke
_delay_ms(500);
a--;
if (PINB & (1<<PB3)) // Prüfe auf High Signal an PB3
{
b++; // Wenn Wahr dann erhöhe in 500 ms auf den Wert "a"
_delay_ms(500);
OCR0A = a;


}

else if (!(PINB & (1<<PB3))) // Prüfe ob PB3 Low wenn Wahr zurück zu "b"
{
return b;
}




}
return 0;

}

Siro
25.01.2018, 08:23
Hallo Live85

Ein "return" aus einem Hauptprogramm "main" sollte nicht sein, weil damit wird das programm ja verlassen.
Vermutlich starte der Controller dann neu.

In deiner Schleife muss natürlich noch die Abfrage rein
if (a < MAXWERT) a++;
Also nur erhöhen wenn der Wert noch nicht erreicht ist.

Live85
25.01.2018, 08:30
Okay, das mit dem "return" werde ich beheben..

Mit der abfrage if (a <maxwert) a++ sage ich ihm quasi das er nur erhöhen darf solange der Wert kleiner als ist ??

Danke das man hier schnell eine kompetente antwort bekommt und nicht als voll Depp hingestellt wird, wie in einem anderen forum...

Ceos
25.01.2018, 08:34
beuntze bitte die [ CODE ] [ / CODE ] Tags (ohne leerzeichen) um deinen code ehrum, dann bleibt die formatierung erhalten udn man kann es besser lesen ;)

@Siro hat recht, das "return b;" ist dein Problem, eine main sollte immer eine Endlosschleife haben die NIE verlassen wird!

ich mach mal pseudo code fürs verständnis


initTimer();
integer brightness = MIN;
while(1)
{
if(input == low)
{
brightness = MIN;
}
else
{
if(brightness < MAX)
{
brightness++;
}
delay(einstellbare_delay_für_fade_geschwindigkeit) ;
}
PWM_register = brightness;
}


man könnte den ersten IF auch erweitern dass er brightness mit einer kürzeren delay runterfadet ( brightness--; ) wenn brightness nicht MIN ist damit er nicht einfach nur ausschaltet sondern ebenfalls spürbar dunkel fadet

Live85
25.01.2018, 08:40
Danke, ich werde es nachher Testen...

Siro
25.01.2018, 08:46
#define FADE_SPEED_IN 200 // schnell heller werden
#define FADE_SPEED_OUT 500 // langsamer ausgehen

#define FADE_MIN 10
#define FADE_MAX 255

value = FADE_MIN; // Start Bedingung 30 Prozent

while (1)
{
OCR0A = value; // PWM setzen

if (PINB & (1<<PB3)) // Prüfe auf High Signal an PB3
{
if (value < FADE_MAX) value++;
_delay_ms(FADE_SPEED_IN);
} else
{
if (value > MIN) value--;
_delay_ms(FADE_SPEED_OUT);
}

}

Live85
27.01.2018, 01:40
Hallo, danke für die Codes aber ich habe versucht meinen Code zu nutzen mit dem Tipp von Siro, sonst ist der lern effekt gleich null....

Habe das ganze jetzt ein wenig umgebaut, das blinken konnte ich so beheben :)
Jetzt habe ich aber das Problem das die LED nicht zurück Faded wenn ich das High Signal auf Low ziehe.....
externer Pull-down Wiederstand ist vorhanden...
Kann mir jemand noch einen Tipp geben, habe schon alles verucht mit "else if" oder "else" nur "if", ich habe den verdacht das der Code sich nach der ersten If abfrage hängen bleibt...





#include <avr/io.h>
#define F_CPU 1200000UL // 1,2 MHz
#include <util/delay.h>



int main (void)
{
DDRB =(1<<PB0); // Ausgang PB0

TCCR0A=(1<<COM0A1) | (1<<WGM00) | (1<<WGM01); // PWM Phase Korrigieren, OCR0A an TOP setzen
TCCR0B=_BV(CS01) ; // Prescaler 8

int a=5; // Min Wert für Lichtstärke
int b=255; // Max Wert für Lichtstärke

while (1) {
{
OCR0A = a; // Startpunkt mit Min Lichtstärke

if (PINB & (1<<PB3)) // Prüfe auf High Signal an PB3
{
if (a <255) a++; // Wenn Wahr dann erhöhe in 5s auf den Wert "b"
_delay_ms(5);

}

else // (!(PINB & (1<<PB3))) // Prüfe ob PB3 Low wenn Wahr zurück zu "a"
{
if (b >10) b--; // Wenn solange der wert Max gößer als Min dann b--
_delay_ms(5);
// OCR0A =a;
}




}
}
return 0;

}

Bumbum
27.01.2018, 07:39
Hallo,

da du OCR0A nur den Wert a zuweist, darfst du auch nur diesen ändern:



if (a >10) a--;



Viele Grüße,
Andreas

Siro
27.01.2018, 07:41
Hallo Live85
nimm mal das "return 0;" raus.
Das gehört da nicht rein.....
Ein Return brauchst Du nur in Unterfunktionen die vom Hauptprogramm oder woher auch immer aufgerufen werden.
Du hast ja nur eine einzige Schleife, wo soll er dann landen mit dem Return.

sorry, das return steht ja hinter der while Schleife, da stört es keinen, da kommt der code ja nie an.....
Da sind aber ein paar geschweifte Klammern zu viel, das hat mich verwirrt.
Du hast 2 mal { bei dem while und am Ende dann auch zwei mal } das tut nicht weh, ist aber unnötig und verwirrt.
Dein return am Ende darf dort stehen und hat oftmals auch seine Berechtigung. Das ist eigentlich für Programme zum Beispiel auf nem PC
da gibt man dann beim Verlassen des Programms eine Wert 0 zurück um zu signalisieren dass das Programm ordnungsgemäß
verlassen wurde oder auch ein Übergabewert für andere Programme (Der sogenannte Exitcode)
Dein Programm läuft aber ständig und sollte dort niemals ankommen.

Andreas hat recht, das b benutzt Du ja garnicht. Da liegt das Problem

Ein schönes Wochenende
Siro

Bumbum
27.01.2018, 08:13
nimm mal das "return 0;"

Das stimmt so nicht! main ist eine Funktion (vom Typ int) und in eine Funktion MUSS ein Return rein, sonst warnt der Compiler!
Man sollte nur dafür sorgen, dass der Ablauf dort nie hin kommt, was in einem sinnvoll strukturiertem Programm auch nicht der Fall sein wird.

Siro
27.01.2018, 08:20
Habe ich korrigiert Andreas, das hatte ich falsch interpretiert, ich dachte er springt aus der While Schleife.:p

Live85
27.01.2018, 12:05
Hallo, habe die Fehler beseitigt und jetzt geht alles wie gewollt, ich bin davon ausgegangen das OCR0A dann automatisch zu "b" wird da der wert "10" ist, habe dem ganzen wohl zuviel Logisches denken zugemutet und den absatz im AVR Buch vollkommen falsch interpretiert ... :o
Auf dem Ozi kann ich auch schön sehen wie sich das PWM Signal ändert....

Danke für die Tipps



#include <avr/io.h>
#define F_CPU 1200000UL // 1,2 MHz
#include <util/delay.h>



int main (void)
{
DDRB =(1<<PB0); // Ausgang PB0

TCCR0A=(1<<COM0A1) | (1<<WGM00) | (1<<WGM01); // PWM Phase Korrigieren, OCR0A an TOP setzen
TCCR0B=_BV(CS01) ; // Prescaler 8

int a=5; // Min Wert für Lichtstärke
int b=255 // Max Wert für Lichtstärke

while (1)

{
OCR0A = a; // Startpunkt mit Min Lichtstärke

if (PINB & (1<<PB3)) // Prüfe auf High Signal an PB3

{
if (a <255) a++; // Wenn Wahr dann erhöhe in 5s auf den Wert "b"
_delay_ms(5);
}


else // (!(PINB & (1<<PB3))) // Prüfe ob PB3 Low wenn Wahr zurück zu "a"

{
if (a >10) a--; // Wenn solange der Wert Max gößer als Min dann a--
_delay_ms(5);
}
}
return 0;

}