- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: lichtleiste progrmmieren

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    27.10.2008
    Beiträge
    50
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Zitat Zitat von s.o.
    Zu hoch für einen Controller? LOL!
    Ich wette mit dir dass du/man das mit einem Tiny13 schaffst. MIt Assembler kann man es selbst mit dem Tiny11 machen.
    zu hoch für mich sagte ich , weil ich in dem Thema halt blutigster anfänger bin, das man das machen kann, mag sicher stimmen, ob ich werden wir sehen

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo mollyman,

    jetzt, wo du die Tabelle mit den Schaltzuständen aller 9 Ausgänge hast, kannst du ja die Data-Zeilen schreiben:
    Schalttabelle:
    Data &B10110001, 1 'Daten 0,5s
    Data &B10110001, 1 'Daten 1 s
    usw.

    Dabei habe ich nur die Bits für Portc in die richtige Reihenfolge (c-7 ... c-0) gebracht und das b-0 Bit als "1" (oder "0", wenn b-0 aus ist) angehängt (de fakto wird das ein 2. Byte, man braucht also 720 Bytes gesamt).

    Man kann jetzt in einer Schleife alle 360 Positionen einlesen und die Ports schalten:
    Read Portc_position
    Portc = Portc_position
    Read Portb_position
    Portb = Portb_position

    Für Portb geht das so einfach nur, wenn die anderen Portpins (PB1..7) nicht für anderes verwendet werden.

    Gruß Dirk

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hi,
    deine Abfolge wiederholt sich so regelmäßig, dass ich das Problem in Code umsetzen würde:

    Code:
    $regfile "m8def.dat"
    $crystal = 1000000
    Config Portc = Output
    Dim Bit0 As Byte , Bit1 As Byte , Bit2 As Byte
    Dim Bit3 As Byte , Bit4 As Byte , Bit5 As Byte
    Dim Bit6 As Byte , Bit7 As Byte , Bit8 As Byte
    Dim Bit0_max As Byte , Bit1_max As Byte , Bit2_max As Byte
    Dim Bit3_max As Byte , Bit4_max As Byte , Bit5_max As Byte
    Dim Bit6_max As Byte , Bit7_max As Byte , Bit8_max As Byte
    Dim Bit0_array(8) As Byte , Bit1_array(8) As Byte , Bit2_array(18) As Byte
    Dim Bit3_array(12) As Byte , Bit4_array(18) As Byte , Bit5_array(30) As Byte
    Dim Bit6_array(10) As Byte , Bit7_array(30) As Byte , Bit8_array(30) As Byte
    Dim Port_c As Byte
    Dim Change_state As Byte
    Dim Timer0_ovfl As Byte
    Dim Cycle As Byte
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Timer0_isr
    Timer0_startwert Alias 8                                    '1.000.000/1024/(256-8=244)/2 ~ 1 x pro Sekunde, entspricht waitms 1000
    Timer0 = Timer0_startwert
    Enable Timer0
    Enable Interrupts
    Portc = &B01010101
    Change_state = Portc
    Change_state = Change_state And &HF0
    Bit0_array(1) = 1
    Bit0_array(2) = 1
    Bit1_array(5) = 1
    Bit1_array(6) = 1
    Bit1_array(7) = 1
    Bit1_array(8) = 1
    Bit2_array(3) = 1
    Bit2_array(4) = 1
    Bit2_array(9) = 1
    Bit2_array(10) = 1
    Bit3_array(3) = 1
    Bit3_array(4) = 1
    Bit3_array(5) = 1
    Bit3_array(6) = 1
    Bit3_array(7) = 1
    Bit3_array(8) = 1
    Bit3_array(9) = 1
    Bit3_array(10) = 1
    Bit3_array(11) = 1
    Bit3_array(12) = 1
    Bit4_array(1) = 1
    Bit4_array(2) = 1
    Bit4_array(7) = 1
    Bit4_array(8) = 1
    Bit5_array(1) = 1
    Bit5_array(2) = 1
    Bit5_array(15) = 1
    Bit5_array(16) = 1
    Bit6_array(3) = 1
    Bit6_array(4) = 1
    Bit6_array(5) = 1
    Bit6_array(6) = 1
    Bit6_array(7) = 1
    Bit6_array(8) = 1
    Bit6_array(9) = 1
    Bit6_array(10) = 1
    Bit7_array(1) = 1
    Bit7_array(2) = 1
    Bit7_array(7) = 1
    Bit7_array(8) = 1
    Bit7_array(17) = 1
    Bit7_array(18) = 1
    Bit8_array(1) = 1
    Bit8_array(2) = 1
    Bit8_array(3) = 1
    Bit8_array(4) = 1
    Bit8_array(11) = 1
    Bit8_array(12) = 1
    Bit8_array(13) = 1
    Bit8_array(14) = 1
    
    Bit0_max = 8
    Bit1_max = 8
    Bit2_max = 18
    Bit3_max = 12
    Bit4_max = 18
    Bit5_max = 30
    Bit6_max = 10
    Bit7_max = 30
    Bit8_max = 30
    
    Do
       If Change_state = 1 Then
          Incr Cycle
          Incr Bit0
          If Bit0 > Bit0_max Then Bit0 = 1
          Port_c.0 = Bit0_array(bit0)
          Incr Bit1
          If Bit1 > Bit1_max Then Bit1 = 1
          Port_c.1 = Bit1_array(bit1)
          Incr Bit2
          If Bit2 > Bit2_max Then Bit2 = 1
          Port_c.2 = Bit2_array(bit2)
          Incr Bit3
          If Bit3 > Bit3_max Then Bit3 = 1
          Port_c.3 = Bit3_array(bit3)
          Incr Bit4
          If Bit4 > Bit4_max Then Bit4 = 1
          Port_c.4 = Bit4_array(bit4)
          Incr Bit5
          If Bit5 > Bit5_max Then Bit5 = 1
          Port_c.5 = Bit5_array(bit5)
          Incr Bit6
          If Bit6 > Bit6_max Then Bit6 = 1
          Port_c.6 = Bit6_array(bit6)
          Incr Bit7
          If Bit7 > Bit7_max Then Bit7 = 1
          Port_c.7 = Bit7_array(bit7)
          Incr Bit8
          If Bit8 > Bit8_max Then Bit8 = 1
          'Print Cycle ; " " ; Bin(port_c) ; Bit8_array(bit8)
          Portb.0 = Bit8_array(bit8)
          Portc = Port_c
          Change_state = 0
       End If
    Loop
    
    End
    
    Timer0_isr:
       Timer0 = Timer0_startwert
       Incr Timer0_ovfl
       If Timer0_ovfl = 2 Then
          Timer0_ovfl = 0
          Change_state = 1
       End If
    Return
    Braucht nur 14% vom Mega8.

    Der Timer0 sorgt dafür, dass alle 0,5 sec ein Wechsel stattfindet. Du kannst aleso in der Do-Schleife noch andere Sachen machen, die den Takt nicht stören werden.
    In deinem Code hast du Waitms = 1000 geschrieben, aber sonst immer nach 0,5 sec einen Wechsel gefordert. Wenn du doch 1000 brauchst, musst du die 2 in der ISR auf 4 setzen.

    Ich bin mir auch nicht sicher, ob ich die richtige Reihe für PortB.0 genommen habe. Auch nicht, ob PortC richtig herum ist. Evtl. musst du die dann noch tauschen.

    Gruß

    Rolf

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    27.10.2008
    Beiträge
    50
    erstmal vielen Dank für Eure Mühe.

    Jetzt ist es so, dass ich das Programm direkt übernehmen könnte, aber ich möchte es auch verstehen um daraus zu lernen
    Im ersten Block hast du die Variablen Definiert, dass Sie werte zwischen 0 und 255 haben , ok das ist mir klar
    Danach hast du den Internen Timer 0 konfiguriert. ok ist auch klar.
    Dann hast du pro Bit definiert bei welchem Takt der Port auf 1 gesetzt ist und im nächsten Teil wie viele Takte es pro Ausgang gibt wobei mir beim Bitarry die Bedeutung der Klammer nicht klar ist

    Im nächsten Teil wird das es dann ganz schwierig für mich. Es beginnt die Schleife und dann kommt die If Abfrage für das Changestate, das weiter unten gebildet wird. Den Incr Bit0 sagt mir gar nichts
    wenn du mir den teil
    " Incr Bit0
    If Bit0 > Bit0_max Then Bit0 = 1
    Port_c.0 = Bit0_array(bit0) "
    noch erklären könntest wäre es klasse.

    Wobei die Bildung des Changssteate mit dem Timer_ISr mir etwas unklar ist genau wie die Bildung des Bit0

    Gruß Martin

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Die Sache ist halt so gedacht:

    Jede LED und damit jedes Bit an PortC hat seine eigene Regelmäßigkeit.
    Bit2 z.B. so
    2 x aus
    2 x an
    4 x aus
    2 x an
    8 x aus
    Danach geht es wieder von vorne los. Dies sind 18 Zustände. Bit2_max wird daher auf 18 gesetzt. Im Bit2_array ist diese Sequenz abgelegt. Bit2 ist der Zeiger auf die aktuelle Position in diesem Array.
    Zur Bestimmung des nächsten Zustands wird folgendes gemacht:
    Incr Bit2 setzt den Zeiger auf die nächste Position
    If Bit2 > Bit2_max Then Bit2 = 1 Falls der Zeiger über das letzte Element hinaus geht, fängt er wieder von vorne an, also bei 1.
    Port_c.2 = Bit2_array(Bit2) setzt die Hilfsvariable für den PortC Bit 2 auf den Status, also da, was im Array an der Zeigerposition steht, 0 oder 1. Damit die LEDs nicht nacheinander angehen, habe ich Hilfsvariable benutzt.

    Der Timer ermöglicht dir, die Waitms zu vermeiden. Wenn du noch irgendetwas anderes in deinem Programm machen möchtest, geht dies nun. Change_state wird also jede halbe Sekunde vom Timer auf 1 gesetzt. Im Mainloop wird auf 1 geprüft, dann auf 0 zurückgesetzt (damit er dies nicht direkt noch mal macht) und dann der neue Zustand der Bits berechnet.

    Was meinst du mit:

    wobei mir beim Bitarry die Bedeutung der Klammer nicht klar ist

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    27.10.2008
    Beiträge
    50
    gemeint ist folgendes oben steht
    Bit6_array(10)
    weiter unten
    Bit6_array(bit6)
    wobei der oberere Wert oben als Byte definiert ist. der untere ist nicht definiert.

    Wenn ich aber deine Erklärung richtig verstanden habe ist es die Hilfsvariabele die dann dann in der Variabelen Port_C zu der Variabelen wird, die dann den Ausgabewert für Portc erzeugt

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Du weißt scheinbar nicht, was ein Array ist.
    Ein Array ist eine Folge von gleichartigen (gleicher Typ) von Werten, die alle unter einem Namen, hier bit6_array angesprochen werden können. Mit
    Dim Bit6_array(10) as Byte
    sagst du dem Compiler, er soll 10 Variablen vom Typ Byte anlegen, die alle hintereinander im Speicher stehen. Diese kannst du nun einzeln mit Bit6_array(1), Bit6_array(2) usw. ansprechen.
    Hat die Variable Bit6 den Wert 5, so gibt dir Bit6_array(Bit6) den 5. Wert zurück. Das wäre also gleichbedeutend mit Bit6_array(5), was in unserem Fall den Wert 1 hat.

    Klar geworden?

    Gruß

    Rolf

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    27.10.2008
    Beiträge
    50
    ok jetzt habe ich es verstanden

    und du hast recht gehabt so ganz genau wusste ich nicht was ein array ist.

    Danke nochmal für deine Mühe sowohl für das Programm als auch für die Erläuterungen dazu

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    27.10.2008
    Beiträge
    50
    ich habe das programm mal eine Simulation laufen lassen.

    leider funktioniert es nicht. er hängt in der Do-Loop schleife fest und zählt den timer nicht hoch.

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von mollyman
    ich habe das programm mal eine Simulation laufen lassen.
    Meinst du damit, dass du es im Simulator laufen gelassen hast?
    Ohne Änderung am Timer dauert es im Simulator bestimmt eine Minute bis der Timer das erste mal zuschlägt.
    Setze mal den Prescale auf 1, dann kommen die Interrupts schneller.
    Auf echter Hardware kann ich das Programm nicht ausprobieren, weil ich den µC nicht habe.

    Ich hatte auch in der Spalte C-5 übersehen, dass es immer zwischen 12 und 14 aus Phasen wechselt. Das habe ich jetzt oben im Code korrigiert!!!

    Gruß

    Rolf

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen