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 sehenZitat:
Zitat von s.o.
Druckbare Version
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 sehenZitat:
Zitat von s.o.
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
Hi,
deine Abfolge wiederholt sich so regelmäßig, dass ich das Problem in Code umsetzen würde:
Braucht nur 14% vom Mega8.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
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
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
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:
Zitat:
wobei mir beim Bitarry die Bedeutung der Klammer nicht klar ist
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
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
:idea: 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
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.
Meinst du damit, dass du es im Simulator laufen gelassen hast?Zitat:
Zitat von mollyman
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