PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Effektgerät mit PIC 16F874



18.01.2005, 16:37
Hi
Hatte vor einiger Zeit schon mal hier gepostet. Aber jetzt komme ich wieder nicht weiter, dh. Verstehe nicht warum das Prog nicht läuft.
Hier erstmal eine Erläuterung damit überhaut eine Chance besteht das Prog nachzuvollziehen. Wie gesagt handelt es sich um ein kleines Effektgerät. Dieses verfügt über 16 Taster. Jeder dieser Taster stellt einen 16tel Note dar und kann entweder gesetzt sein (LED leuchtet) oder eben nicht (LED aus).
Später möchte ich das ganze noch um16 LEDs ergänzen, sodass das ganze eine typische Drumcomputeransteuerung wird.
Das Gerät verfügt darüber hinaus noch über einen Audioein- und Ausgang. In den Eingang wird zB ein Palttenspieler eingesteckt und der Ausgang kommt dann zB ins Mischpult.
Ist nun ein Taster gesetzt so lässt die Schaltung für dieses 16tel eines Takts das Audiosignal unverändert durch. Ist ein Taster nicht gesetzt so wird das Audiosignal mute/stumm geschaltet. Das ganze Gerät zerhackt also die Audiosignale. In der Fachsprache ein Gater oder Apreggiator.
Alles ist soweit fertig außer dass das Prog läuft. Für Tips, Anregungen, Verbesserungsvorschläge, Verbesserungen… und vor allem Fehlerfunde wäre ich sehr dankbar.

MfG Daniel



Hier der Code:


;************************************************* ***********************************
;
; BRAINS
; MIDI-Scratch Apreggiator
;
;************************************************* ***********************************
list p=16F874
#include <P16F874.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC
;************************************************* ***********************************
;
;Beschreibung
;Am Eingang [] ist ein MIDIClock Signal anzulegen. Dieser Takt steuert die 16
;
;Bei jeder der 16 16tel Noten kann mittels der Taster gewählt werden, ob das anliegende
;Audio-Signal für diese Zeit MUTE geschaltet werden soll oder nicht. Der erhaltene Effekt
;ist ein Apreggiatoreffekt.
;
;
;
;************************************************* ***********************************

; Variablen festlegen

MIDI_CL EQU 0x20 ;MIDI_CL-Byte
MIDI_ST EQU 0x21
;MIDI_SP EQU 0x22
COUNTER_6 EQU 0x23
HLS1 EQU 0x24
HLS2 EQU 0x25
OBYTE1 EQU 0x26
OBYTE2 EQU 0x27
TAKTART EQU 0x28 ;Bit0: set=3/4 Takt; n.set=4/4 Takt
;Bit1: set=goto MIDI_IN_ST; n.set=goto MIDI_IN_CL

HILFE1 EQU 0x2C
HILFE2 EQU 0x2D

;************************************************* ***********************************
; IO-PIN-BELEGUNG
;
; Ao OUT (FX)
;
; Bo T0
; B1 T1
; B2 T2
; B3 T3
; B4 T4
; B5 T5
; B6 T6
; B7 T7
;
; D0 T8
; D1 T9
; D2 T10
; D3 T11
; D4 T12
; D5 T13
; D6 T14
; D7 T15
;
; xx MIDI IN
;
;************************************************* ***********************************



bcf STATUS, RP0 ;auf Bank 0 umschalten

bcf ADCON0,0 ;ADC ausschalten


; INIT UART

bsf STATUS, RP0 ;auf Bank 1 umschalten
movlw 0x09 ;Baudrate auf 31250 Baud
movwf SPBRG
bcf TXSTA, BRGH ;low speed Baudrate
bcf TXSTA, SYNC ;enable the serial port
bcf STATUS, RP0 ;auf Bank 0 umschalten
bsf RCSTA, SPEN ;enable the serial port
bsf RCSTA, CREN ;enable reception

bcf RCSTA, FERR
bcf RCSTA, OERR
bcf RCSTA, RX9D

bsf STATUS, RP0 ;auf Bank 1 umschalten

; ADC auf I/O umschalten
movlw 0x06
movwf ADCON1


bcf TRISA,0 ;PortA,0 auf Ausgang setzten

; PortB auf EINGANG setzten
movlw B'11111111'
movwf TRISB


bsf TRISC,7 ;PortC,7 auf Eingang

; PortD auf EINGANG setzten
movlw B'11111111'
movwf TRISD


bcf STATUS, RP0 ;auf Bank 0 umschalten

; COUNTER_6 laden
movlw D'249'
movwf COUNTER_6

; OBYTE1 und OBYTE2 löschen
clrf OBYTE1
clrf OBYTE2

; HILFE1 und HILFE2 löschen
clrf HILFE1
clrf HILFE2

; HLS1 und HLS2 als Grundeinstellung laden
movlw B'00110011'
movwf HLS1
movlw B'00110011'
movwf HLS2

bcf TAKTART,0 ;als Grundeinstellung 4/4 Takt

; MIDI_CL, ST, SP Initialisierung
movlw 0xF8
movwf MIDI_CL
movlw 0xFA
movwf MIDI_ST
; movlw 0xFC
; movwf MIDI_SP

bcf STATUS, RP0 ;auf Bank 0 umschalten

;****** Programmstart **************************************************


MIDI_IN_ST
btfss PIR1,RCIF ;überspringe nachfolgenden Befehl, wenn Bit5 gesetzt ist, dh MIDI_IN_BYTE liegt vor
goto TASTENABFRAGE_ST
bcf PIR1,RCIF ;lösche das Bit, welches einen MidiEmpfang anzeigt
movf RCREG,W ;kopiere RCREG nach W
xorwf MIDI_ST,W ;es wird geprüft, ob das angekommene Byte ein StartBefehl war und das Ergebnis wird in W gespeichert
btfsc STATUS,Z ;prüfe das ZeroFlag: 0: XOR Verknüpfung war wahr
goto MIDI_IN_ST

MIDI_IN_CL ;JA, es war ein StartBit, also weiter
btfss PIR1,RCIF ;überspringe nachfolgenden Befehl, wenn Bit5 gesetzt ist, dh MIDI_IN_BYTE liegt vor
goto TASTENABFRAGE_CL
movf RCREG,W ;kopiere RCREG nach W
xorwf MIDI_CL,W ;es wird geprüft, ob das angekommene Byte ein ClockBefehl war
btfsc STATUS,Z ;prüfe das ZeroFlag: 0: XOR Verknüpfung war wahr
goto MIDI_IN_ST

;****** Counter ************************************************** ************************************************** *****

incfsz COUNTER_6,1 ;COUNTER_6 +1 und Ergebnis wieder in COUNTER_6 speichern - falls das Ergebnis=o => ingnoriere nachfolg. Befehl
goto MIDI_IN_CL
movlw D'249'
movwf COUNTER_6

;****** Positionstest ************************************************** ****************************************

btfss OBYTE1,0 ;prüfe, ob hier die aktuelle Position ist? - Nein, dann gehe zum nächsten Befehl
goto OBYTE1_0NOTSET ;springe zu OBYTE1_0NOTSET
btfss OBYTE1,1
goto OBYTE1_1NOTSET
btfss OBYTE1,2
goto OBYTE1_2NOTSET
btfss OBYTE1,3
goto OBYTE1_3NOTSET
btfss OBYTE1,4
goto OBYTE1_4NOTSET
btfss OBYTE1,5
goto OBYTE1_5NOTSET
btfss OBYTE1,6
goto OBYTE1_6NOTSET
btfss OBYTE1,7
goto OBYTE1_7NOTSET

btfss OBYTE2,0
goto OBYTE2_0NOTSET
btfss OBYTE2,1
goto OBYTE2_1NOTSET
btfss OBYTE2,2
goto OBYTE2_2NOTSET
btfss OBYTE2,3
goto OBYTE2_3NOTSET
btfss OBYTE2,4
goto OBYTE2_4NOTSET
btfss OBYTE2,5
goto OBYTE2_5NOTSET
btfss OBYTE2,6
goto OBYTE2_6NOTSET
btfss OBYTE2,7
goto OBYTE2_7NOTSET

;**** OBYTES 1 + 2 ************************************************** **********************************************

OBYTE1_0NOTSET
bsf OBYTE1,0 ;setze OBYTE,0
btfss HLS1,0
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_1NOTSET
bsf OBYTE1,1 ;setze OBYTE,1
btfss HLS1,1
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_2NOTSET
bsf OBYTE1,2 ;setze OBYTE,2
btfss HLS1,2
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_3NOTSET
bsf OBYTE1,3 ;setze OBYTE,3
btfss HLS1,3
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_4NOTSET
bsf OBYTE1,4 ;setze OBYTE,4
btfss HLS1,4
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_5NOTSET
bsf OBYTE1,5 ;setze OBYTE,5
btfss HLS1,5
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_6NOTSET
bsf OBYTE1,6 ;setze OBYTE,6
btfss HLS1,6
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_7NOTSET
bsf OBYTE1,7 ;setze OBYTE,7
btfss HLS1,7
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL

OBYTE2_0NOTSET ;hier beginnt HLS2********************************************** **************
bsf OBYTE2,0 ;setze OBYTE,0
btfss HLS2,0
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_1NOTSET
bsf OBYTE2,1 ;setze OBYTE,1
btfss HLS2,1
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_2NOTSET
bsf OBYTE2,2 ;setze OBYTE,2
btfss HLS2,2
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_3NOTSET
bsf OBYTE2,3 ;setze OBYTE,3
btfsc TAKTART,0 ; 3/4 oder 4/4 Takt? überspringe nachfolgenden Befehl bei 4/4Takt
goto TAKT_3_4
btfss HLS2,3
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_4NOTSET
bsf OBYTE2,4 ;setze OBYTE,4
btfss HLS2,4
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_5NOTSET
bsf OBYTE2,5 ;setze OBYTE,5
btfss HLS2,5
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_6NOTSET
bsf OBYTE2,6 ;setze OBYTE,6
btfss HLS2,6
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_7NOTSET
bsf OBYTE2,7 ;setze OBYTE,7
btfss HLS2,7
goto LOWTAKTENDE
bsf PORTA,0 ;FX high
goto TAKTENDE

;***** Sprungmarken ************************************************** ********************

LOWOUT
bcf PORTA,0
goto MIDI_IN_CL

LOWTAKTENDE
bcf PORTA,0
goto TAKTENDE

TAKTENDE
clrf OBYTE1
clrf OBYTE2
goto MIDI_IN_CL

TAKT_3_4
btfss HLS2,3
goto LOWTAKTENDE
bsf PORTA,0
goto TAKTENDE

;**** Tastenabfrage ************************************************** *******************

TASTENABFRAGE_ST
bsf TAKTART, 1

TASTENABFRAGE_CL

TASTER_0 ;Tastenabfrage
btfss PORTB,0 ;überspringe nachfolgenden Befehl, wenn PORTB,0 gesetzt ist
goto CLEAR_HILFE_0 ;gehe zu CLEAR_HILFE_0
btfss HILFE1,0 ;überspringe nachfolgenden Befehl, wenn HILFE1,0 gesetzt ist
goto INVERT_0 ;gehe zu INVERT_0
goto TASTER_1 ;gehe zur nächsten Tasterabfrage

CLEAR_HILFE_0 ;hier wird das CLEAR_HILFE_0-Bit gelöscht
bcf HILFE1,0
goto TASTER_1

INVERT_0 ;hier wird die aktuelle Position invertiert
bsf HILFE1,0
btfsc HLS1,0
btfss HLS1,0
goto SETZEN_0
bcf HLS1,0
goto TASTER_1

SETZEN_0
bsf HLS1,0
goto TASTER_1



TASTER_1
btfss PORTB,1
goto CLEAR_HILFE_1
btfss HILFE1,1
goto INVERT_1
goto TASTER_2

CLEAR_HILFE_1
bcf HILFE1,1
goto TASTER_2

INVERT_1
bsf HILFE1,1
btfsc HLS1,1
btfss HLS1,1
goto SETZEN_1
bcf HLS1,1
goto TASTER_2

SETZEN_1
bsf HLS1,1
goto TASTER_2




TASTER_2
btfss PORTB,2
goto CLEAR_HILFE_2
btfss HILFE1,2
goto INVERT_2
goto TASTER_3

CLEAR_HILFE_2
bcf HILFE1,2
goto TASTER_3

INVERT_2
bsf HILFE1,2
btfsc HLS1,2
btfss HLS1,2
goto SETZEN_2
bcf HLS1,2
goto TASTER_3

SETZEN_2
bsf HLS1,2
goto TASTER_3




TASTER_3
btfss PORTB,3
goto CLEAR_HILFE_3
btfss HILFE1,3
goto INVERT_3
goto TASTER_4

CLEAR_HILFE_3
bcf HILFE1,3
goto TASTER_4

INVERT_3
bsf HILFE1,3
btfsc HLS1,3
btfss HLS1,3
goto SETZEN_3
bcf HLS1,3
goto TASTER_4

SETZEN_3
bsf HLS1,3
goto TASTER_4




TASTER_4
btfss PORTB,4
goto CLEAR_HILFE_4
btfss HILFE1,4
goto INVERT_4
goto TASTER_5

CLEAR_HILFE_4
bcf HILFE1,4
goto TASTER_5

INVERT_4
bsf HILFE1,4
btfsc HLS1,4
btfss HLS1,4
goto SETZEN_4
bcf HLS1,4
goto TASTER_5

SETZEN_4
bsf HLS1,4
goto TASTER_5




TASTER_5
btfss PORTB,5
goto CLEAR_HILFE_5
btfss HILFE1,5
goto INVERT_5
goto TASTER_6

CLEAR_HILFE_5
bcf HILFE1,5
goto TASTER_6

INVERT_5
bsf HILFE1,5
btfsc HLS1,5
btfss HLS1,5
goto SETZEN_5
bcf HLS1,5
goto TASTER_6

SETZEN_5
bsf HLS1,5
goto TASTER_6




TASTER_6
btfss PORTB,6
goto CLEAR_HILFE_6
btfss HILFE1,6
goto INVERT_6
goto TASTER_7

CLEAR_HILFE_6
bcf HILFE1,6
goto TASTER_7

INVERT_6
bsf HILFE1,6
btfsc HLS1,6
btfss HLS1,6
goto SETZEN_6
bcf HLS1,6
goto TASTER_7

SETZEN_6
bsf HLS1,6
goto TASTER_7




TASTER_7
btfss PORTB,7
goto CLEAR_HILFE_7
btfss HILFE1,7
goto INVERT_7
goto TASTER_8

CLEAR_HILFE_7
bcf HILFE1,7
goto TASTER_8

INVERT_7
bsf HILFE1,7
btfsc HLS1,7
btfss HLS1,7
goto SETZEN_7
bcf HLS1,7
goto TASTER_8

SETZEN_7
bsf HLS1,7
goto TASTER_8




TASTER_8
btfss PORTD,0
goto CLEAR_HILFE_8
btfss HILFE2,0
goto INVERT_8
goto TASTER_9

CLEAR_HILFE_8
bcf HILFE2,0
goto TASTER_9

INVERT_8
bsf HILFE2,0
btfsc HLS2,0
btfss HLS2,0
goto SETZEN_8
bcf HLS2,0
goto TASTER_9

SETZEN_8
bsf HLS2,0
goto TASTER_9





TASTER_9
btfss PORTD,1
goto CLEAR_HILFE_9
btfss HILFE2,1
goto INVERT_9
goto TASTER_10

CLEAR_HILFE_9
bcf HILFE2,1
goto TASTER_10

INVERT_9
bsf HILFE2,1
btfsc HLS2,1
btfss HLS2,1
goto SETZEN_9
bcf HLS2,1
goto TASTER_10

SETZEN_9
bsf HLS2,1
goto TASTER_1




TASTER_10
btfss PORTD,2
goto CLEAR_HILFE_10
btfss HILFE2,2
goto INVERT_2
goto TASTER_11

CLEAR_HILFE_10
bcf HILFE2,2
goto TASTER_11

INVERT_10
bsf HILFE2,2
btfsc HLS2,2
btfss HLS2,2
goto SETZEN_10
bcf HLS2,2
goto TASTER_11

SETZEN_10
bsf HLS2,2
goto TASTER_10




TASTER_11
btfss PORTD,3
goto CLEAR_HILFE_11
btfss HILFE2,3
goto INVERT_3
goto TASTER_12

CLEAR_HILFE_11
bcf HILFE2,3
goto TASTER_12

INVERT_11
bsf HILFE2,3
btfsc HLS2,3
btfss HLS2,3
goto SETZEN_11
bcf HLS2,3
goto TASTER_12

SETZEN_11
bsf HLS2,3
goto TASTER_12




TASTER_12
btfss PORTD,4
goto CLEAR_HILFE_12
btfss HILFE2,4
goto INVERT_12
goto TASTER_13

CLEAR_HILFE_12
bcf HILFE2,4
goto TASTER_13

INVERT_12
bsf HILFE2,4
btfsc HLS2,4
btfss HLS2,4
goto SETZEN_12
bcf HLS2,4
goto TASTER_13

SETZEN_12
bsf HLS2,4
goto TASTER_13




TASTER_13
btfss PORTD,5
goto CLEAR_HILFE_13
btfss HILFE2,5
goto INVERT_13
goto TASTER_14

CLEAR_HILFE_13
bcf HILFE2,5
goto TASTER_14

INVERT_13
bsf HILFE2,5
btfsc HLS2,5
btfss HLS2,5
goto SETZEN_13
bcf HLS2,5
goto TASTER_14

SETZEN_13
bsf HLS2,5
goto TASTER_14




TASTER_14
btfss PORTD,6
goto CLEAR_HILFE_14
btfss HILFE2,6
goto INVERT_14
goto TASTER_15

CLEAR_HILFE_14
bcf HILFE2,6
goto TASTER_15

INVERT_14
bsf HILFE2,6
btfsc HLS2,6
btfss HLS2,6
goto SETZEN_14
bcf HLS2,6
goto TASTER_15

SETZEN_14
bsf HLS2,6
goto TASTER_15




TASTER_15
btfss PORTD,7
goto CLEAR_HILFE_15
btfss HILFE2,7
goto INVERT_15
goto MIDI_IN_CL

CLEAR_HILFE_15
bcf HILFE2,7
goto MIDI_IN_CL

INVERT_15
bsf HILFE2,7
btfsc HLS2,7
btfss HLS2,7
goto SETZEN_15
bcf HLS2,7
goto MIDI_IN_CL

SETZEN_15
bsf HLS2,7
btfss TAKTART, 1 ;teste ob das Hilfsbit, welches die Rückkehrsprungmarke bestimmt gesetzt ist
goto MIDI_IN_CL
bcf TAKTART, 1 ;lösche die Sprungmarke
goto MIDI_IN_ST



;**** Endmarken ************************************************** ***********

MIDI_IN_SP

;COUNTER_6 laden
movlw D'249'
movwf COUNTER_6

;OBYTE1 und OBYTE2 löschen
clrf OBYTE1
clrf OBYTE2

goto MIDI_IN_ST

end


edit by stegr: Bitte in Zukunft den Code-Tag verwenden... Danke...

PicNick
18.01.2005, 16:51
Beim Zeus, ein Konzept aus dem SourceCode rauszulesen, is etwas mühsam.
Du kriegst über MIDI also keine Events zum ein- und ausschalten, sondern nur das Timing ? (CLOCK od. SMPTE ?)
Und dzt. hast du einen Analog-Channel, den du gatest ? (Analog-Switch ?)
Mit den 16-Tastern definierst du den Pattern dazu ?
Für einen Takt ?
(Ich selbst bin am basteln eines MIDI-CV Converters) mfg robert

ingo_1
18.01.2005, 17:56
Hi,
In Deinem Code ist mir folgendes aufgefallen:
Du springst mit einem goto von MIDI_IN_ST oder von MIDI_IN_CL in die Tastaturabfrage, diese sehr stark verschachtelt. Ich frage mich, ob der PIC da geordnet wieder heraus findet?

Bei der Initialisierung der Ports brauchst Du die Ports nicht als Eingang definieren, sie stehen als DEFAULT auf Eingang.

GRUSS
INGO

18.01.2005, 18:59
Hi Robert,
ja ich glaube du hast das Konzept herausgefunden. Über den Uart empfange ich MIDI CL. So kann ich meinen Sequenzer laufen lassen und quasi 99,9% syncron dazu scratchen. Ja mehr oder weniger Analog Channel ich habe den Pin A0, aber der schaltet nur an oder aus und das steuert dann eine Mute-Schaltung.
Wegen dem Konzept tut mir leid, dass ist mein erstes Programm und das ist mehr oder weniger mit und mit entstanden.
Jip und mit den Tastern erstelle ich das Pattern für einen Takt und das wird dann geloopt

18.01.2005, 19:02
Hi Ingo,
wie oben schon gesagt, das ist mein erstes Prog. Ich hab keine Ahnung wie ich die Verschachtelungen vermeiden kann.

Daniel

PicNick
18.01.2005, 19:41
Hi, Daniel !
Jetzt i mir soweit alles klar.
Ich schau mir das nun genau an, und liefere dir bis morgen dann ein paar konkrete Vorschläge. mfg robert

18.01.2005, 20:12
Hi das ist nett
Wenn du magst kannst du das Prog ja mal in nen PIC brennen und in ne Testschaltung setzen. Brauchst eigentlich nichts an Peripherie außer vielleich ein paar Taster.
Zu deinem Midi CV Converter: Ist das ein normaler Wandler oder mit irgendwelchen extras??? - Weil ich meine sowas schon des öfteren gesehen zu haben (Internet, Elektor)

MfG Daniel

PicNick
18.01.2005, 20:26
Hi, Ja, das Zeugs gibt's im Prinzip schon, aber die bedienung dafür auf der Bühne mit dem Wuzidisplay und zig Menü-tiefen ist für Live nicht zu brauchen. Ich möcht so eine richtige Patch-Bay mit richtigen Knöpfen dazu machen, die auch real-time umgesteckt werden kann. (Controller-zuordnung etc.)
Ist für einen alten Moog-analog-synth, mit LFO und VCA und Pi pa po, da muß man schon auch life hingreifen können.
ausserdem mach ich den ADC (für den VCO) auf 14-Bit, damit der Slide-Effekt nicht so eckt.
Außerdem, kaufen kann das jeder. mfg robert

PicNick
19.01.2005, 15:02
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

19.01.2005, 15:21
Hi Robert vielen Dank für deine Mühen. Ich werds versuchen. Melde mich dann.

MfG Daniel

24.01.2005, 22:10
Hi Robert,
hab das Programm mal geändert und aufs wesentliche reduziert - und es läuft!
Zumindest folgender Teil:

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)


Was ich allerdings nicht verstehe ist wie es weiter gehen soll.
D.h. ich verstehe nicht ganz warum du ein Bit schieben willst und vor allem wie es funktionieren soll, wenn ich im Patern mehrere 1en und Nullen gespeichert habe.

Auf jeden fall schonmal vielen Dank

Daniel


FRAGE AN STEGR: WO FINDE ICH DEN CODE TAG?

24.01.2005, 23:03
...kann ich jetzt nicht wieder den Teil vom original verwenden:

OBYTE1_0NOTSET
bsf OBYTE1,0 ;setze OBYTE,0
btfss HLS1,0
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_1NOTSET
bsf OBYTE1,1 ;setze OBYTE,1
btfss HLS1,1
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL

???

stegr
25.01.2005, 08:31
FRAGE AN STEGR: WO FINDE ICH DEN CODE TAG?

beim Posten ("Antwort schreiben") siehst du über dem Textfeld eine ganze Reihe an Buttons. Dort gibt es auch einen, auf dem Code steht.
Im Textfeld erscheit daraufhin ein [.code] (ohne den Punkt) und ein [./code]. Da zwischen drinnen einfach den Quelltext rein schreiben und dann sieht das schön übersichtlicher aus. Ausserdem wird dabei eine Fixed-Schrift verwendet, bei der alle Zeichen gleich breit sind, so wie du's ausm Editor kennst und somit geht deine Formatierung nicht verloren.

MfG
Stefan

PicNick
25.01.2005, 10:34
Hi, Daniel !
Zweierlei:
Freut mich, daß wir einen Anfang gefunden haben
Du solltest Dich registrieren lassen, könnt' ja sein, daß Du noch öfters kommst.
So:
Du brauchst (dzt) für jedes 1/16 einen Schalter, also 16 Stücker für jeden Takt (4/4)
Da bieten sich natürlich die Bits von zwei Bytes an. Diese zwei Bytes sind also ein Pattern


PATTERN
Pattern_a Bits 0 - 7 ---> 1/16 1 - 8
Pattern_b Bits 0 - 7 ---> 1/16 9 - 16

Bei jedem neuen 1/16 (ACTION_16) müssen wir also das aktuelle Bit abfragen (ob BUMM oder NICHT BUMM) und auf's nächste 1/16 stellen.
Wir nehmen also zwei andere Bytes "shift", durch die wir EINEN 1'er durchschieben.
Beispiel-Pattern: einmal kurz BUMM bei jedem 1/4 ( a la kick-drum)
Folgende Situation beim ersten 1/16


Pattern_b Pattern_a
76543210 76543210
00010001 00010001
Shift_b Shift_a
00000000 00000001

Jedesmal müssen wir sehen, ob dort, wo im "shift" gerade der 1-er ist, im "Pattern" gerade 1 oder 0 ist. bei "1" machern wir BUMM, bei 0 nicht.


Pattern b/a
00010001 00010001
shift b/a
00000000 00000001 1 --> BUMM
00000000 00000010 2 --> nix
00000000 00000100 3 --> nix
00000000 00001000 4 --> nix
00000000 00010000 5 --> BUMM
...............
01000000 00000000 15 --> nix
10000000 00000000 16 --> nix

Das ist der Grund, warum der 1-er durch die zwei Bytes geshifted wird.
Natürlich kann man das auch anders machen, aber du schreibst dir die Finger krumm, wenn die Sache dann komplizierter wird, mit mehreren Pattern und anderen Taktarten. fürs erste mfg robert

25.01.2005, 14:44
HI Robert,
werde mir alles mal genau anschauen, programmieren und mich dann melden.
Abermals Vielen Dank

...warum registrieren?

Daniel

PicNick
25.01.2005, 16:04
Hi, lies dir das auf der HP mal durch, einige Vorteile, was Download etc. betrifft.
Registrierte User kämpfen halt gewissermaßen mit offenem Visier.
aber wie du meinst. mfg robert

25.01.2005, 18:15
OK DAnn steht bei mir ua statt Gast, Brain... klappt momentan noch nicht weil mein Account noch inaktiv ist - was auch immer - ich meine ich hätte mich aber schonmal angemeldet?
Gruß Daniel

25.01.2005, 18:45
Also, ich hab mich mal mit deinen Ausführungen vertraut gemacht.Bis zu Schieben hab ich auch alles verstanden, aber dann....


Schieben:
clrc ;clear carry
rlf shift_a
rlf shift_b
bnc schieben_fertig ;;wird das carry, wenn es gesetzt ist vom Überlauf aus Shift_a , Shift_b gesetzt?
clrf shift_a ;;warum wird shift_a hier gelöscht
inc shift_a ; wieder "1" drin ;; und hier wieder eine 1 reingesetzt
schieben_fertig
return ;;return ist doch der befehl um aus einem Unterprog zurück zu kommen, also soll der nach action, also wenn er ein MIDI_CL erkannt hat zu schieben springen? - Oder kann der auch einfach linear laufen, dh automatisch zu schieben gelangen?
Noch 2 Sache: Mir ist nicht klar wie die 1 in das zweite Byte gelangt (shift_b) und wenn eine 1 bereits vor dem ersten Durchgang drinstehtist der doch beim ersten Durchgang an der zweiten stelle?!

Vielleicht dumme Fragen?!

Daniel

Brain
26.01.2005, 18:47
jetzt hats geklappt

PicNick
26.01.2005, 19:58
Hi, Brain, willkommen im Club !
der Befehl "rlf" shiftet das ganze Byte eins rauf. Das Carry-Bit von vorher kommt an die stelle Bit 0 und das ursprüngliche Bit 7 wandert dann ins Carry. (dewegen putz' ich ja das Carry vorher, sost habe ich zwei 1-er in shift a/b) Mach ich also gleich nochmal "rfl" wandert DIESES Carry (also eigentlich Bit 7 von vorher) in das zweite Feld unten rein, der gewünschte Effekt. das Bit, das aus shift_b rausgeschoben wird, is uns wurst, brauchen wir nicht.
Der erste "1"-er stammt vom "Anfang:"
Reihenfolge Shift <> Abfragen:
Nach MIDI-Start SIND wir ja schon IM ersten 1/16, also müssen wir gleich checken, UND DANN für's nächste Mal herrichten.
Diese Shifterei kannst du übrigens sehr gut im Simulator Step-by-step nachvollziehen.

Also: wir befinden uns beim ersten 1/16, machen aber noch nix
Midi-Clock:
Jetzt checken wir und machen das Gate auf oder zu
shiften rauf fürs nächste mal
return (=Warten auf Midi-Clock/12)
usw.
Wie gesagt, außer der Midi clock kannst du das perfekt im Simulator Bitweise ausprobieren und brauchst keinen Blindflug
mfg robert

Brain
26.01.2005, 21:45
Simulator, hab ich da was verpasst? Seit wnn gibt es einen Simulator für MPLAB/PIC. Ich dachte das könnte man nur mit so nem emulator oder wie die Dinger heißen. Ist dieser Simulator von Microchip???
Das würde das ganze Picen ja um einiges erleichtern (kein Pic aus der Schaltung "brechen", ins Programmiergerät, programmieren, und wieder in die Schaltung dücken, mehr?) - Da werd ich aber einiges vermissen!!!!

Bis dann Brain

PicNick
27.01.2005, 08:00
Hi, Bei Menu "DEBUGGER-->Tool" stelltst du MPLAB SIM ein, geht super, für sowas mfg robert

Brain
28.01.2005, 12:17
Hi Robert,
der Sim ist ein sehr gute Sach. Vielleicht versteh ich daran die "Shifterei"
Mal ne ganz andere Frage; Wenn ich dich richtig verstanden habe machst du live Musik auf der Bühne? - Was benutzt du da so? Auch MIDI-Controller?
MfG Daniel

PicNick
28.01.2005, 12:30
Hi, Daniel !
Nein, ich selbst bin auf der Bühne eher back-to-the-roots, no tricks, no midi. ( http://www.oldformation.at wenn du lust hast auf altertümliches)
Das erwähnte Kistel ist für einen Freund, http://www.albertkreuzer.com/start_d.htm
der hat's mehr mit dem Elektrischen.
Anders sieht's natürlich im Studio aus, da gibt's heutzutage nix ohne MIDI, MTC, SMPTE, VITC, blah, blah,...
Das einzige Analoge ist da wahrscheinlich der Strom aus der Steckdose.
mfg robert

Brain
28.01.2005, 12:48
Ich hab mit n paar Freunden vor einiger Zeit mal nen ziemlich außergewöhnlichen MIDI Contoller gebaut (programmierung hab ich da nicht gemacht) wenn du willst schick ich dir mal ne kurze Beschreibung.

MfG Daniel

PicNick
28.01.2005, 13:02
Außergewöhnlich klingt gut. Nur her damit ! mfg

Brain
28.01.2005, 13:05
klar... schon unterwegs, bräuchte nur dein email...

Brain
28.01.2005, 13:06
ähhh, wie groß darf die Datei sein??? DSL, ISDN, 56k?

PicNick
28.01.2005, 13:08
Na, zippen wär schon fein und dann < 10Mb, sonst mault mein Postmaster, das Ferkel, das. mfg

Brain
28.01.2005, 13:09
ok, kein problem, an ???@???.??

PicNick
28.01.2005, 13:16
Hopperla, am besten
robert.toegel@wienerborse.at
mfg