- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: HILFE: Ledlauflicht Stacküberlauf verhindern

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2006
    Beiträge
    10
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    vielen dank für Eure antworten!!!
    Ich glaube ich habe das Programm nicht so gut erklärt, ich werde es jetzt nachholen.
    Taster 1 und Taster 2 stehen nicht miteinander in Beziehung. Taster 1 ist nur für LED Lauflicht 1. ,Taster 2 ist nur für LED Lauflicht 2.

    Taster 1 wird einmal getastet
    -die 13 Leds schalten sich mit einer Zeitverzögerung von 0.2s nacheinander an und bleiben auch an.

    Taster 1 wird zum zweiten mal getastet
    -alle LEDs schalten sich nacheinander mit einer Zeitverzögerung von 0.2s aus und bleiben auch aus.

    das selbe Prinzip macht der 2. Taster für das LED Lauflicht 2 auch.

    Das große Problem ist, wenn der Taster 1 betätigt wurde, startet das Lauflicht 1 (Beschreibung Taster 1), wenn der Taster 2 betätigt wird und das Lauflicht 1 noch nicht alle 13 LED an oder aus geschaltet hat, soll trotzdem das Lauflicht 2 loslaufen.

    MFG
    Matthias

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2006
    Ort
    Stuttgart
    Alter
    45
    Beiträge
    321
    Also hat deine Schaltung 26 LEDs?
    OOOOOOOOOOOOO Lauflicht 1
    OOOOOOOOOOOOO Lauflicht 2
    Ist jede LED einfach an einen Ausgang des µCs angeschlossen?
    Soll man den Hoch- / Runterzählvorgang auch durch ein zweites Tasten umkehren können, solange es noch nicht fertig ist?
    Soll in den 200 ms, die zwischen den Schritten liegt, auch das andere Lauflicht anfangen können?

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2006
    Beiträge
    10
    Hallo Bigfood,

    -jede LED ist einfach an einen Ausgang des µCs angeschlossen.
    -der Hoch-/ Runterzählvorgang soll erst umgekehrt werden wenn der Vorgang abgeschlossen ist (alle LEDs an oder aus), und nicht zwischendurch.
    -Soll in den 200 ms , die zwischen den Schritten liegt, auch das andere Lauflicht anfangen können. Antwort Ja

    MFG
    Matthias

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2006
    Ort
    Stuttgart
    Alter
    45
    Beiträge
    321
    Wenn ich jetzt nur Basic könnte...
    Hab mal was wildes hässliches zusammengehackt... :/
    LEIDER IN C
    und auch nicht unbedingt funktionstüchtig...
    Aber ich denke, solange du nur immer die Taster überprüfst und dir die Richtung merkst, in die es gerade zählen soll (hier hab ich das add1 und add2 genannt und später einfach zum Lauflichtwert dazugezählt), sollte es gleichzeitig funktionieren... einfach keine 200ms warten, sondern einen zähler runter- bzw hochzählen lassen und dann die nächste led hinzuschalten.
    Wahrscheinlich blamiere ich mich mit dem Stück Code total, weil wer rausfindet, dass ich nen Denkfehler drinhab... War auch nur schnell zusammengeschrieben... Hoffe, dass es die Idee vermittelt (und dass die Idee nicht falsch ist)
    Code:
    unsigned char wait1 = 0;
    unsigned char wait2 = 0;
    char add1 	= 0;
    char add2 	= 0;
    unsigned char ll1   = 0;
    unsigned char ll2   = 0;
    unsigned char in1   = 0;
    	//----------
    while (1)
    {
    	in1 = PINA; // eingänge einlesen
    	//----------	
    	if (in1 == 1) // taster 1 gedrückt
    	{
    		if (ll1 == 0) // lauflicht leer?
    			add1 = 1; // vorwärtslauf
    		else if (ll1 == 13) // lauflicht voll?
    			add1 = -1; //rückwärtslauf
    		// ansonsten passiert einfach nix
    	}
    	if (in1 == 2) // taster 2 gedrückt 
    	{
    		if (ll2 == 0) // lauflicht leer?
    			add2 = 1;
    		else if (ll2 == 13) // lauflicht voll?
    			add2 = -1;
    		// ansonsten passiert einfach nix
    	}
    	//----------
    	if (add1 != 0) // wenn das lauflicht grad mal läuft
    	{
    		if (wait1 == 0) // 200 ms sind rum oder is die erste LED... 
    		{
    			ll1 = ll1 + add1; // lauflicht 1 erhöhen/verringern
    			wait1 = 200;			// wieder von vorn zählen
    		}
    		wait1--; // zähler verringern, eine millisek. ist rum...
    	}
    	if (add2 != 0) // wenn das lauflicht grad mal läuft
    	{
    		if (wait2 == 0) 
    		{
    			ll2 = ll2 + add2; // lauflicht 2 erhöhen/verringern
    			wait2 = 200;			// wieder von vorn zählen
    		}
    		wait2--; 
    	}
    	//----------
    	wait (1 ms);
    	if ((ll1 == 0) || (ll1 == 13)) // wenn endstellung erreicht, dann nix mehr machen...
    	{ 
    		wait1 = 0;
    		add1  = 0;
    	}
    	if ((ll2 == 0) || (ll2 == 13)) // wenn endstellung erreicht, dann nix mehr machen...
    	{ 
    		wait2 = 0;
    		add2  = 0;
    	}
    	//----------
      // jetzt hier einfach mal die LEDs setzen. Status is in ll1 und ll2 drin. 
      // also einfach so viele Ausgänge auf 1 setzen, wie der Wert drin is...
    }

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2006
    Beiträge
    10
    Hallo Bigfoot,
    vielen dank für deine Mühe aber leider habe ich von C keine Ahnung.
    Ich habe das Problem selber gelöst, indem ich alle goto durch Return ersetzt habe.

    MFg
    Matthias

  6. #16
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    freut mich, dass es nun klappt!
    c code ist gar nicht so-viel-anders. ob nun "if x bla bla endif" oder if(x) {bla;bla;} is doch egal.
    keine angst vor c!

  7. #17
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2006
    Ort
    Stuttgart
    Alter
    45
    Beiträge
    321
    Gratulation. Wenn es funktioniert, dann kannst du es ja so lassen.
    Natürlich ist der Code nicht optimal aber wenn er seinen Zweck erfüllt, dann kannst du ihn wegspeichern und bei Bedarf optimieren und rumprobieren...
    Ja, C-Code ist nicht wirklich sehr viel anders.
    Es kann auf alle Fälle nicht schaden, wenn man ihn halbwegs lesen kann, dann kann man viele Beispiele mehr verwenden. Selber schreiben muss man ihn dazu nicht können.
    Vielleicht könnte man sogar einen Wiki-Beitrag machen, der die wichtigsten Sprachen (Basic, C und Asm) gegenüberstellt und die jeweiligen Equivalente von Schleifen, Kommentaren und Bedingungen in einer Tabelle gegenüberstellt, sodass Anfänger Codebeispiele in anderen Sprachen einfacher durchschauen und ggf. auch einfacher umsteigen können.

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    14.09.2005
    Alter
    69
    Beiträge
    77
    @Matthias

    Auch wenn dein Programm jetzt funktioniert, habe ich die trotzdem mal ein Programm geschrieben wo du sehen kannst wie man so was macht.

    Ich muß ehrlich sagen als ich dein Programm gesehen habe standen mir die Haare zu Berg.
    Code:
    $regfile = "8515def.dat"
    Dim I As Integer
    Dim Schalter1an As Bit
    Dim Schalter2an As Bit
    Dim Bytetemp As Byte
    
    Config Pina.0 = Input
    Config Portb = Output
    Config Portc = Output
    
    Portb = 0
    Portc = 0
    
    Do
    ' lampen 1
    If Pina.0 = 1 Then
      If Schalter1an = 1 Then
         If Portb = 255 Then
         Schalter1an = 0
        End If
    Else
       If Portb = 0 Then
           Schalter1an = 1
        End If
    End If
    While Pina.0 = 1                                            ' WARTEN BIS TASTE WIDER LOSGELASSEN
    Wend
    End If
    ' end lampen 1
    
    
    ' lampen 2
    If Pina.1 = 1 Then
      If Schalter2an = 1 Then
         If Portc = 255 Then
         Schalter2an = 0
         End If
    Else
       If Portc = 0 Then
           Schalter2an = 1
        End If
    End If
    While Pina.1 = 1                                            ' WARTEN BIS TASTE WIDER LOSGELASSEN
    Wend
    End If
    ' end lampen 2
    
    ' lampen 1
       If Schalter1an = 1 And Portb <> 255 Then
          Bytetemp = Portb
          Bytetemp = Bytetemp + 1
          Portb = Portb Or Bytetemp
       End If
       If Schalter1an = 0 And Portb <> 0 Then
        Shift Portb , Right
       ' Shift Portb , Left                                      ' anders rum
       End If
    ' end lampen 1
    
    
    ' lampen 2
       If Schalter2an = 1 And Portc <> 255 Then
          Bytetemp = Portc
          Bytetemp = Bytetemp + 1
          Portc = Portc Or Bytetemp
       End If
       If Schalter2an = 0 And Portc <> 0 Then
        Shift Portc , Right
       ' Shift Portc , Left                                      ' anders rum
       End If
    ' end lampen 2
    
      For I = 1 To 5
    'Die for Schleife ist nur beim Simulator notwendig, weil der wait befehl mit der LCD Anzeige im Simulator nicht funktioniert.
    'Also wenn fertig Schleife durch Wait ersetzen.
    ' Waitms 0.1
      Next I
    Loop
    mfg Guy

    Edit

    Hier noch ein Beispiel wie du zum Beispiel die Lampen auch ausschalten kannst.
    Code:
    If Schalter1an = 0 And Portb <> 0 Then
       ' Shift Portb , Right
       ' Shift Portb , Left                                      ' anders rum
        Portb = Portb / 2
    End If
    Mußt dich mal mit binär rechen abgeben. Als Beispiel, bei einer Binärzahl verschiebst du durch Division alles nach Rechts, und durch Multiplikation alles nach links.

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Solar Speicher und Akkus Tests