Je li zainteresovan ko da nastavi ovaj projekat? Nešto sam razmišljao i napisao neko programče koje bi možda i moglo da radi. Sve u svemu...
1. PIC16C84 ima interne pull-up otpornike, koje je moguće uključiti ili isključiti po volji, preko RBPU bita OPTION registra.
2. Na šemi nije označeno koje se diode koriste. Koliko ja vidim, rad sa silicijumskim diodama dosta je nategnut. Naime, u svakom trenutku mora biti zadovoljen uslov:
V0decmax + Vd < V0picmax
V0decmax je maksimalna vrednost logičke nule dekodera (0.2V ili 0.3V, ali se mora videti odgovarajući datasheet).
V0picmax je maksimalna vrednost logičke nule portova mikrokontrolera, i prema datasheetu kreće se od 0.8V do 0.2Vdd.
Vd je napon diode u radnoj tački, i za Si kreće se od 0.7V do preko 1V.
S druge strane, prag provođenja germanijumskih dioda mnogo je manji.
3. Varijanta koju sam opisao, samo sa jednim invertorom i jednim dekoderom, najmanje košta, program nije mnogo komplikovan za pisanje, a obezbeđuje kontrolu 128 tastera, što je više nego dovoljno za 88 dirki na klavijaturi, a ostaje čak 40 funkcijskih tastera za samoupravljanje po volji :) (tempo, jačina, stil...). Treba samo videti da li MIDI protokol to dopušta, tj. videti da li se karti mogu slati neki custom podaci.
4. Nisam proučio MIDI protokol, ali koliko znam nije u redu slati informacije samo o tome koje dirke su pritisnute i gađati zvučnu kartu sve dok su dirke pritisnute. Naime, treba samo poslati informaciju kada se dirka pritisne, a kada otpusti. To znači da je potrebno pamtiti prethodno stanje svakog tastera, i samo ako ima promene (otvoren -> zatvoren ili zatvoren -> otvoren) poslati podatak. Ovo može da odradi PIC, ali može i drajver na računaru.
5. Udobnije je napisati drajver – što ja ne umem lako da izvedem – čime bi se pored ostalog omogućila i puna kontrola funkcijskih tastera, nezavisno od MIDI protokola.
6. Najzad, slažem se sa onim što je ADRENALIN napisao: prvo proveriti radi li uošte ona varijanta sa šeme iz prvog posta u ovom threadu.
7. Programče koje sledi podrazumeva da prilikom uključenja sistema nijedna dirka nije pritisnuta. Ako se nađe poznavalac protokola, može da dopiše kod na predviđena mesta.
Code:
; http://www.elitesecurity.org
; forum: Elektronika
; tema: Samogradnja MIDI klavijature
; softverski projekat zapoceo: stameni
; verzija: 0.1
; 9. novembar 2004.
; dodatne izmene izvrsio:
list p=16C84
#include <p16C84.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
; Prema semi, koristi se XT oscilator
; ***** Promenljive:
;
tekuci_red EQU 0x0C
; Ima vrednosti 0x00-0x07, 0x10-0x17
; 0x00-0x07 je za "nultu tastaturnu banku" (aktivan
; prvi dekoder), a 0x10-0x17 za prvu banku (aktivan
; drugi dekoder)
maska EQU 0x0D
temp EQU 0x0E
; temp je stanje PORTB tekuceg reda.
stanje EQU 0x0F
; Lokacije 0x0F do 0x1E sadrze prethodna stanja dirki.
; ***** Kod:
;
ORG 0x000 ; reset vektor
goto MainEntryPoint
ORG 0x004 ; interapt vektor
; Za sada interapte ne koristimo, ali...
goto ISR
MainEntryPoint:
; Inicijalizacija kontrolera
bsf STATUS, RP0 ; mem. banka #1
bcf OPTION_REG,NOT_RBPU ; enable pull-ups
movlw b'01000'
movwf TRISA ; PORTA:0, 1, 2, 4 -- output
movlw b'11111111'
movwf TRISB ; PORTB -- input
bcf STATUS, RP0 ; mem. banka #0
; Inicijalizacija niza "stanje"
; (pretpostavlja se da nakon ukljucenja
; nije pritisnuta nijedna dirka)
;
; Nizu "stanje" pristupamo preko FSR.
; 1 oznacava da dirka nije pritisnuta,
; 0 oznacava suprotno. Pretpostavljamo da
; posle restarta nije pritisnuta nijedna dirka.
movlw stanje
movwf FSR
petlja2:
movlw 0xFF
movwf INDF
incf FSR, F
movlw (0x1E + 1)
subwf FSR, W
btfss STATUS, Z
goto petlja2
; Odavde pocinje prava stvar: inicijalizacija
; glavne programske petlje.
; Komentarisana naredba nije neophodna, jer je
; zbog prethodnog koda W = 0; ako to ne bude slucaj,
; obavezno otkomentarisati ;)
; clrw
movwf tekuci_red
movlw stanje
movwf FSR
petlja:
; Saljemo tekuci_red na PORTA cime aktiviramo
; jedan od dekodera i jedan od izlaza aktiviranog
; dekodera.
movf tekuci_red, W
movwf PORTA
movlw 1
movwf maska
; Za tekuci_red ocitavamo stanja svih osam dirki
; i stavljamo ih u temp
movf PORTB, W
movwf temp
; Unustrasnja petlja: hendlujemo tekuci_red
; koristeci promenljivu "maska" umesto brojaca.
petlja1:
movf temp, W
andwf maska, W
btfss STATUS, Z
goto jedan
nula:
; Detektovana nula.
movf INDF, W
andwf maska, W
btfss STATUS, Z
; Ako je pre bila jedinica, onda menjamo stanje,
; i podatke posaljemo MIDI interfejsu; inace
; nema potrebe za bilo cime, jer je dirka i dalje
; pritisnuta.
call pritisnut
goto cont
jedan:
;Detektovana jedinica.
movf INDF, W
andwf maska, W
btfsc STATUS, Z
; Ako je pre bila nula, onda menjamo stanje,
; i podatke saljemo MIDI interfejsu.
call otpusten
cont:
; Ako je "maska" dosla do svoje maksimalne vrednosti,
; kraj unutrasnje petlje.
bcf STATUS, C
rlf maska, F
btfss STATUS, C
goto petlja1
; Kraj unutrasnje petlje.
; Inkrementiramo pointer na niz "stanje" i
; tekuci_red. Ako u promenjlivi "tekuci_red"
; nije doslo do tranzicije sa xxxxx111 na
; xxxx1000, vracamo se u glavnu petlju.
incf FSR, F
incf tekuci_red, F
btfss tekuci_red, 3
goto petlja
; Invertujemo cetvrti bit, da bismo selektovali
; drugi dekoder.
movlw b'00011000'
xorwf tekuci_red, F
; Ako je FSR prekoracio kraj niza "stanje",
; resetujemo ga na pocetak.
movlw 0x1F
subwf FSR, W
btfss STATUS, Z
goto petlja
movlw stanje
movwf FSR
goto petlja
pritisnut:
; Ubelezimo da je taster na poziciji na
; koju pokazuje "tekuci_red", bit odreden
; "maskom" pritisnut, da ne bismo ponovo
; upadali ovde i bez potrebe opterecivali MIDI.
comf maska, W
andwf INDF, F
; ***** Vazno *****
; Ovde, zapravo, treba dodati kod za slanje
; podataka na RA3. Najpre treba RA3 progralsiti
; za output itd.
return
otpusten:
; Taster je otpusten, sto belezimo u niz
; "stanje". Zatim saljemo tu informaciju
; MIDI-ju.
movf maska, W
iorwf INDF, F
; ***** Vazno *****
; Ovde, zapravo, treba dodati kod za slanje
; podataka na RA3. Najpre treba RA3 progralsiti
; za output itd.
return
ISR
; Eventualni hendler.
retfie
END