-
        

+ Antworten
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 31

Thema: Effektgerät mit PIC 16F874

  1. #1
    Gast

    Effektgerät mit PIC 16F874

    Anzeige

    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:

    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...

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    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

  3. #3
    ingo_1
    Gast
    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

  4. #4
    Gast
    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

  5. #5
    Gast
    Hi Ingo,
    wie oben schon gesagt, das ist mein erstes Prog. Ich hab keine Ahnung wie ich die Verschachtelungen vermeiden kann.

    Daniel

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    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

  7. #7
    Gast
    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

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    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

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    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

  10. #10
    Gast
    Hi Robert vielen Dank für deine Mühen. Ich werds versuchen. Melde mich dann.

    MfG Daniel

+ Antworten
Seite 1 von 4 123 ... LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

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