Hi, Daniel.
*ahem* Nachdem es dein erstes Programm ist, wollen wir es nicht weiter tragisch nehmen, das kann schon mal vorkommen. Immerhin gibt es auch herrlich strukturierte Programme, die auch nicht funktionieren.
Rat: teile und herrsche. Du mußt das Programm in Funktionsblöcke teilen, die du auch einzeln testen kannst. Un laß mal Specials weg (z.B. 3/4 Takt)
Zentral sind die zwei Bytes, die den aktuellen Rhythm-Pattern enthalten.
Auf der einen seite werden die Bits durch die Taster gesetzt oder gelöscht, auf der anderen Seite Clock-gesteuert abgefragt.
Da du ja jederzeit einen Pattern auch fix reinschreiben kannst, tät ich da mal die Sache teilen und die Abfrage und das Gaten zuerst mal durchziehen und DANN erst den ganzen Tasten- u. LED-Plunder.
MIDI-receive: dieser Teil scheint in Ordnung zu sein. Konzentrier' dich mal nur auf den MidiClock. Je 1/4 Note kommt der 24 mal (bei 96), also mußt du bei jeder 12. Clock tätig werden (das sind dann deine 1/16)
d.h. du hast einen Zähler (Byte), da steht erst mal Null drin
Programmteil:
LOOP:
RCIF ?
====Nein ----------> LOOP
====Ja MIDI CLOCK ?
=======nein -----> (RCIF=0) LOOP
=======ja --> Zähler = 0 ?
=========nein --> Zähler - 1 -------------> (RCIF=0) LOOP
=========ja call AKTION_16 (s.u)
============ Zähler <= 12 ------------> (RCIF=0) LOOP
AKTION_16 (einmal je 1/16)
;Wenn die hier eine LED ein und ausschaltest (oder deinen Gate-Switch), kannst du schon überprüfen, ob die sache bis hierher im Prinzip funzt.
Wenn nicht, gleich gar nicht weitermachen, das MUSS gehen
call schieben
call checken
return
Um deinen Pattern abzufragen, mach du am besten zwei andere Bytes, durch die du EIN 1-Bit bei jedem 1/16 weiterschiebst.
shift_A equ xxx
shift_B equ xxx
pattern_A equ xxx ; rhythm pattern 1
pattern_B equ xxx ; rhythm pattern 2
Anfang:
clrf shift_a ; da steht "00000000"
inc shift_a ; da steht "00000001" drin
clrf shift_b
movlw b'00010001'
movwf pattern_a ; test: einmal blubb bei jedem 1/4
movwf pattern_b
Schieben:
clrc ;clear carry
rlf shift_a
rlf shift_b
bnc schieben_fertig
clrf shift_a
inc shift_a ; wieder "1" drin
schieben_fertig
return
Schauen, ob das Entsprechende PatternBit gesetzt ist
checken:
movfw Pattern_a
andwf shift_a, w ; nu ?
bz checken_2 ; nix, schau ins zweite byte
b Gate_on ; ja, is gesetzt
checken_2
movfw Pattern_b ; nu ?
andwf shift_b, w
bz gate_off ; auch nix, Türe zu
gate_on
bsf porta, 0 ; gate on
return
gate_off
bcf porta, 0
return
Heb' dir dein Programm auf und versuch's mal so und rühr' dich , dann sehen wir weiter. mfg robert
Lesezeichen