- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Code für eine Fußraumbeleuchtung im LKW

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2018
    Beiträge
    9

    Code für eine Fußraumbeleuchtung im LKW

    Anzeige

    Praxistest und DIY Projekte
    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...


    Code:
      #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;
    
    }
    Geändert von Live85 (25.01.2018 um 08:37 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2018
    Beiträge
    9
    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...

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    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
    Code:
    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
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2018
    Beiträge
    9
    Danke, ich werde es nachher Testen...

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Code:
    #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);
      }
    
    }

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2018
    Beiträge
    9
    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...



    Code:
      
     #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;
    
     }
    Geändert von Live85 (27.01.2018 um 01:45 Uhr)

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo,

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

    Code:
    if (a >10) a--;
    Viele Grüße,
    Andreas

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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
    Geändert von Siro (27.01.2018 um 08:35 Uhr)

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Zitat Zitat von Siro Beitrag anzeigen
    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.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. PHP Code: Buch, Frameworks um in Zukunft saubereren Code zu schreiben
    Von Thor_ im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 1
    Letzter Beitrag: 21.11.2014, 17:25
  2. eine Ecke für Code Schnippsel
    Von CODrix im Forum Anregungen/Kritik/Fragen zum Forum und zum Wiki RN-Wissen
    Antworten: 3
    Letzter Beitrag: 16.07.2013, 12:32
  3. [ERLEDIGT] Eine Bitte bezüglich des Code-Tag Buttons
    Von TobiKa im Forum Anregungen/Kritik/Fragen zum Forum und zum Wiki RN-Wissen
    Antworten: 4
    Letzter Beitrag: 23.03.2011, 14:44
  4. Code-Schloss mit Tastatur, LCD und Logger. Code-Beispiel
    Von Stray_Cat im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 2
    Letzter Beitrag: 05.06.2009, 10:31
  5. Bascom Code in GCC Code umschreiben
    Von Martin. im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 13.07.2008, 19:14

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen