PIC18F2550 USB HID Controller 6xKey 1x16(2x16) LCD-Display IRDA Kizilötesi

Başlatan xricix, 06 Eylül 2010, 23:00:13

xricix

bana yardim edebilecek biri lazim PIC18F2550 icin yazilim lazim!

görevi ise
- USB HID Controller PC ile iletisimde bulunmasi
- 6 Dügme kulanimi Stop/Ejekt, FFW, FW, Play/Pause, RW, FRW
- LCD Display görevi (1x16 veya 2x16)
- Kizilötesi iletisimi (Uzakdan Komanda)

resimler
1. http://www.postimg.cc/image.php?v=Ts3uA_0
2. http://www.postimg.cc/image.php?v=aVgMNf0
3. http://www.postimg.cc/image.php?v=aVgKR10
4. http://www.postimg.cc/image.php?v=PqvH72J

evet biraz cok is ücretini ödemeye isede hazirim yeterki olsun

bu ne ise yariyacak diye sorarsaniz bu Media Center PC kasasina ayit ( Lintec Senior ) Kasasina ayit.

ben internetde baya aradim lakin bulamadim aradigimi umarim insallah icinnizden biri cikiar

saygilarimla


xricix


muhittin_kaplan

hocam bunun için iki ünite lazım
1. pc ye bağlı hid cihaz
2.kumanda
Usb iletişimi diğer iletişim yollarına göre karmaşıktır.
dediğiniz butonlarla (ff rewind gibi) hangi programı vs kontrol edeceksiniz ?

xricix

muhidin kaplan ustam basdan tesekürler

aslinda 2 üniteden de fazla hid conrtoll olarak sirf 6 dügme ve kizil ötesesi degil ayrica lcd göstergeli saatli tarihli evet biraz karisik gibi ama basedilmiyecek bir ise benzemiyor


t2 ustam sizede tesekür ederim

ama biraz pahali cikdiniz :) evet elimde 16c745 pic var ve zamaninda 24 euroya bu siteye http://www.rst-lighting.de/ yazdirmisdim. chip benden diye 24 euro idi chip siz 40 euro programi icinde sizinkisi biraz tuzlu cikdi ama siz beni galiba biraz yanlis anladiniz bana cihaz lazim degil cihaz elimde var pic18f2550 de var ve ayrica programlayici da var malesef is den dolayi pek zamanim yok ondan dolayi bana bu pic18f2550 icin hex veya asm bitmis dosyasi gerekli lazim olan

saygilarimla

xricix

muhidin kaplan usta

6 dügmeyi hid controller media dügmesi olarak tanimlamasi ve cd calari acip kapamasi ve bilgisayarda standart secilmis media player i kulanmasi o arada lcd displayde görevini göstermesi saat ile tarihi göstermesi ve ayrica olursa kizilötesi iletisimli olmasi.


netde bi asm dosyasi bulduydum ama hatali




   list p=18F2550
;**************************************************************
;*     Pinbelegung
;*   ----------------------------------   
;*   PORTA:
;*                       0 - SW1 STOP/EJEKT      
;*      1 - SW2 RÜCKWERTS SPULEN
;*      2 - SW3 RÜCKWERTS LAUF/-
;*      3 - SW4 PLAY/PAUSE
;*      4 - SW5 VORWERTS LAUF/+
;*      5 - SW6 VORWERTS SPULEN
;*
;*   PORTB:         veya PORTB: 4 bit li
;*                       0 LCD Display D1   7 LCD Display D8
;*      1 LCD Display D2   6 LCD Display D7
;*      2 LCD Display D3   5 LCD Display D6
;*      3 LCD Display D4   4 LCd Display D5
;*      4 LCD Display D5   3 LCD Display E
;*      5 LCD Display D6   2 LCD Display R/S
;*      6 LCD Display D7   1 LCD Display RW
;*      7 LCD Display D8   0 bos
;*
;*   PORTC:         veya PORTC:
;*                       0 bos         0 bos
;*      1 bos         1 bos
;*      2 bos         2 bos
;*      4 D- USB                    4 D- USB
;*      5 D+ USB      5 D+ USB
;*      6 LCD Display E      6 TX Kizilötesi
;*      7 LCD Display R/S                 7 RX Kizilötesi
;*   
;**************************************************************
;
; By RiCi
;
; Tastatur mit LCD-Display Datum Uhr
;
; Prozessor 18F2550
;
; Prozessor-Takt 48 MHz
;
; Oscillator 24 MHZ
;
; Keyboard am PortA
;
; LCD am PortB
;
; Infrarot am PortC
;
;**********************************************************
; Includedatei für den 18F2550 einbinden

   #include <P18F2550.INC>

   ERRORLEVEL      -302       ;SUPPRESS BANK SELECTION MESSAGES


; Configuration festlegen:
; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming

   config PLLDIV = 5, CPUDIV = OSC1_PLL6, USBDIV = 2, FOSC = HSPLL_HS
   config PWRT = ON
   config BOR = OFF
   config VREGEN = ON
   config WDT = OFF
   config MCLRE = OFF
   config PBADEN = OFF
   config LVP = OFF

;Start
      org   0x00
;Eingänge/Ausgänge definieren

      movlw      B'11111111'      ;PORTA auf Eingang   
      movwf      TRISA       
      movlw      B'00000000'      ;PORTB auf Ausgang
      movwf      TRISB
      movlw      B'11000000'      ;PORTC 7,6 auf Eingang übrigen auf Ausgang
      movwF      TRISC

      clrf         PORTA
      clrf        PORTB
      clrf         PORTC
      bsf        PORTC,7
      bcf        PORTC,6


; Variablen festlegen
loops      equ   0x20   ; Wartezeit für WAIT in Millisekunden
loops2      equ   0x21   ; interner timer für wait
LcdStatus   equ   0x22   ; Puffer für aus dem LCD ausgelesenes Statusbyte
LcdDaten   equ   0x23   ; Puffer für zum LCD zu schreibendes Byte
Taste      equ   0x24   ; Tastaturpuffer


; Konstanten festlegen
; das demonstriert die Nutzung des define-Kommandos im Assembler
; für LCD-Pins
#define   LcdE      PORTC,6   ; enable Lcd
#define   LcdRs      PORTC,7   ; Daten Lcd (nicht control)   
#define LcdPort    PORTB     ; Datenbus des LCD (obere 4 Bit)
; für Tastatur-Anschluß
#define   KRow1      PORTA,0   ;SW1
#define   KRow2      PORTA,1   ;SW2
#define   KRow3      PORTA,2   ;SW3
#define   KRow4      PORTA,3   ;SW4
#define   KRow5      PORTA,4   ;SW5
#define   KRow6      PORTA,5   ;SW6

; Konstanten für OPTIN_REG and INTCON
; diese Werte werden im Programm wärend der Initialisierung verwendet
; sie hier abzulegen vereinfacht spätere Änderungen
Ini_con Equ   B'00000000'   ; Interupt disable
Ini_opt   Equ   B'00000010'   ; pull-up


;********************************************************
; Das Programm beginnt mit der Initialisierung

Init
      bsf     STATUS, RC7   ; Bank 1
      movlw   Ini_opt        ; pull-up Wiederstände ein
      movlw   B'00000000'   ; PortB alle outputs
      movwf   TRISB
      bcf     STATUS, RC6   ; Bank 0
      clrf   PORTB      
      movlw   Ini_con        ; Interupt disable
      movwf   INTCON   

;Display initialisieren
   call   InitLcd

mainloop
   call   Tastfrei   ; darauf warten, das keine Taste gedrückt ist   
;   call   WAIT      ; entprellen nur bei schlechten Tasten nötig

drueck
   call   Taste      ; wird nun eine Taste gedrückt?
   btfsc   STATUS, Z   ; skip wenn Taste<>0
   goto   drueck      ; Tastencode=0 d.h. keine Taste gedrückt, weiter warten

   call   OutLcdDaten   ; Tastencode am LCD ausgeben
   goto   mainloop   ; auf ein neues



;*****************************************************
;+++LCD-Routinen**************************************
;*****************************************************
;LCD initialisieren in 9 Schritten, Begrüßung ausgeben

InitLcd
   movlw   D'255'      ; 250 ms Pause nach dem Einschalten
   movwf   loops   
   call   WAIT      

   movlw   B'00110000'   ; 1
   movwf   LcdPort
   bsf       LcdE
   nop   
   bcf       LcdE
   
   movlw   D'50'      ; 50 ms Pause
   movwf   loops
   call   WAIT
   
   movlw   B'00110000'   ; 2
   call   Control8Bit
   movlw   B'00110000'   ; 3
   call    Control8Bit
   movlw   B'00100000'   ; 4
   call    Control8Bit

   movlw   B'00000001'   ; löschen und cusor home
   call   OutLcdControl   
   movlw   B'00101000'   ; 5 function set, 4-bit  2-zeilig,  5x7
   call   OutLcdControl   
   movlw   B'00001000'   ; 6 display off
   call   OutLcdControl
   movlw   B'00000110'   ; 7 entry mode, increment, disable display-shift
   call   OutLcdControl
   movlw   B'00000011'   ; 8 cursor home, cursor home
   call   OutLcdControl
   movlw   B'00001111'   ; 9 display on
   call   OutLcdControl

   movlw   'B'      ; 'By RiCi' ausgeben
   call   OutLcdDaten
   movlw   'Y'
   call   OutLcdDaten
   movlw   ' '
   call   OutLcdDaten
        movlw   'R'
   call   OutLcdDaten
   movlw   'i'
   call   OutLcdDaten
   movlw   'C'
        call    OutLcdDaten
        movlw   'i'
   call   OutLcdDaten
   return

;*****************************************************
; ein Steuerbyte aus W 8-bittig übertragen
Control8Bit
   movwf   LcdPort
   bsf   LcdE
   nop
   bcf   LcdE
   movlw   D'10'
   movwf   loops
   call    WAIT
   return

;*****************************************************
; darauf warten, daß das Display bereit zur Datenannahme ist
; dazu wird das busy-Bit des LCD abgefragt
LcdBusy
        bsf     STATUS, RC7   ; make Port B0..7 input
   movlw   B'11111111'
   iorwf   TRISB, f
        bcf     STATUS, RC6
BusyLoop      
   bcf   LcdRs      ; Steuerregister
   bsf   LcdE
   nop
   movf   LcdPort, w   ; 4 obere Bits lesen (D7..D4)
   movwf   LcdStatus   ; und in LcdStatus speichern
   bcf   LcdE
   nop
   bsf   LcdE
   nop         ; 4 untere Bits lesen (D3..D0) und ignorieren
   bcf   LcdE
   btfsc   LcdStatus, 7   ; teste bit 7
   goto   BusyLoop
       bsf     STATUS, RC7   ; make Port B0..7 output
   movlw   B'00000000'
   andwf   TRISB, f   
       bcf     STATUS, RC6
   return   

;*****************************************************
; aus W ein Byte mit Steuerdaten zum Display übertragen
OutLcdControl
   movwf   LcdDaten   ; Byte in LcdDaten zwischenspeichern
   call   LcdBusy      ; warten bis Display bereit ist
   movf   LcdDaten, w   ; Byte zurück nach W holen
   andlw   H'F0'      ; low-Teil löschen
   movwf   LcdPort      ; Hi-teil Daten schreiben
   bsf   LcdE
   nop
   bcf   LcdE      ; Disable LcdBus
   swapf   LcdDaten, w   ; Byte verdreht nach W holen
   andlw   H'F0'      ; High Teil löschen
   movwf   LcdPort      ; Low-teil Daten schreiben
   bsf   LcdE
   nop
   bcf   LcdE      ; Disable LcdBus
   return

;*****************************************************
; aus W ein Datenbyte (zum Anzeigen) an's Display übertragen
OutLcdDaten
   movwf   LcdDaten   ; Byte in LcdDaten zwischenspeichern
   call   LcdBusy      ; warten bis Display bereit ist
   movf   LcdDaten, w   ; Byte zurück nach W holen
   andlw   H'F0'      ; low-Teil löschen
   movwf   LcdPort      ; Hi-teil Daten schreiben
   bsf   LcdRs      ; Daten
   bsf   LcdE      ; Enable LcdBus
   nop
   bcf   LcdE      ; Disable LcdBus   
   swapf   LcdDaten, w   ; Byte verdreht nach W holen
   andlw   H'F0'      ; High Teil löschen
   movwf   LcdPort      ; Low-teil Daten schreiben
   bsf   LcdRs      ; Daten
   bsf   LcdE
   nop
   bcf   LcdE      ; Disable LcdBus   
   bcf   LcdRs      ;
   return


;*****************************************************
;+++Tastatur-Routinen*********************************
;*****************************************************
; warten darauf, daß keine Taste mehr gedrückt ist

Tastfrei         ; Warten auf freie Tastatur
   call   Tastatur   ; Tastencode nach Taste & W
   btfss   STATUS, Z   ; wenn Z=1 dann skip
   goto   Tastfrei   ; weiter warten
   return         ; Tastatur ist frei

;*****************************************************
; ist eine Taste gedrückt? und welche?
; der Tastencode wird in W und Taste gespeichert (ASCII)
; wenn keine Taste gedrückt wurde, wird 0 zurückgegeben
;
; zur Erinnerung liste ich noch mal die weiter oben aufgeführten
; Definitionen auf
; mit denen ist festgelegt, an welche Pins des PortB die einzelnen
; Spalten und Zeilen der Tastatur abgeschlossen sind

;#define   KRow1   PORTA,0      ;SW1 Stop Ejekt
;#define   KRow2   PORTA,1      ;SW2 FFR
;#define   KRow3   PORTA,2      ;SW3 FR -
;#define   KRow4   PORTA,3      ;SW4 Play Pause
;#define   KRow5   PORTA,4      ;SW5 FW +
;#define   KRow6   PORTA,5      ;SW6 FFW

;#define   KLine1   PORTA,0      ;SW1 Stop Ejekt
;#define   KLine2   PORTA,1      ;SW2 FFR
;#define   KLine3   PORTA,2      ;SW3 FR -
;#define   KLine4   PORTA,3      ;SW4 Play Pause
;#define   KLine5   PORTA,4      ;SW5 FW +
;#define   KLine6   PORTA,5      ;SW6 FFW

Tastatur
   ; zuerst müssen die Tastaturzeilen-Pins auf Eingang gestellt werden
   bsf     STATUS, RC7   ; Bank 1
   movlw   Ini_opt        ; pull-up Widerstände ein
   movwf     OPTION_REG
   movlw   A'00011111'   ; RA0 .. RA5 input
   movwf   TRISA
   bcf     STATUS, RC6   ; Bank 0

   ; das Enable-Pin des Displays muß auf Low stehen, damit das Display
   ; abgeschaltet ist solange wir die Tastatur abfragen
   clrf   PORTC      ; Display inaktiv am Bus

   ; w wird auf 0 gesetzt, dieser Wert wird durch ein ASSCI-Zeichen
   ; überschrieben, falls eine Taste gedrückt ist
   ; falls keine Taste gedrückt ist, bleibt 0 erhalten
   movlw   0      ; W=0

   bcf   KRow1      ; 1. spalte aktivieren
   bsf   KRow6
   bsf   KRow5
   bsf   KRow4
   bsf   KRow3
   bsf   KRow2

   call   SW1      ; 1. Spalte abfragen

   bcf   KRow2      ; 2.Spalte aktivieren
   bsf   KRow1      ; 1.Spalte ausschalten

   call   SW2      ; 2. Spalte

   bcf   KRow3      ; 3. Spalte aktivieren
   bsf   KRow2      ; 2. spalte ausschalten

   call   SW3      ; 3. Spalte abfragen

   bcf   KRow4      ; 4.Spalte aktivieren
   bsf   KRow3      ; 3.Spalte ausschalten

   call   SW4      ; 4. Spalte

   bcf   KRow5      ; 5. Spalte aktivieren
   bsf   KRow4      ; 4. spalte ausschalten

   call   SW5      ; 5. Spalte abfragen

   bcf   KRow6      ; 6.Spalte aktivieren
   bsf   KRow5      ; 5.Spalte ausschalten

   call   SW6      ; 6. Spalte
   
   bsf   KRow6      ; 6. Spalte ausschalten
   movwf   Taste

   ; PortB wieder komplett zu Output machen
   bsf     STATUS, RC7   ; Bank 1
   movlw   B'00000000'   ; RB1 .. RB7 output
   movwf   TRISB
   bcf     STATUS, RC6   ; Bank 0
   return

SW1
   btfss   KLine1
   retlw   'Stop'
   btfss   KLine2
   retlw   'Ejekt'
   return
SW2
   btfss   KLine1
   retlw   'FFR'
   return
SW3
   btfss   KLine1
   retlw   'FR'
   btfss   KLine2
   retlw   '-'
   return
SW4
   btfss   KLine1
   retlw   'Play'
   btfss   KLine2
   retlw   'Pause'
   return
SW5
   btfss   KLine1
   retlw   'FW'
    btfss   KLine2
   retlw   '+'
   return
SW6
   btfss   KLine1
   retlw   'FFW'
   return

;*****************************************************************   
;Zeitverzögerung um loops * 1 ms *********************************
;*****************************************************************
; universelle Warteschleife, sowas braucht man öfter
; z.B. für die LCD-Initialisierung
; in loops wird die Wartezeit in Millisekunden übergeben
;
; 48 MHz externer Takt bedeutet 5 MHz interner Takt
; also dauert 1 ms genau 5000 Befehle
; 5000 Schleifen a 10 Befehle sind 50000 Befehle = 1 ms

WAIT
top     movlw   .250         ; timing adjustment variable (1ms)
        movwf   loops2
top2    nop                    ; warten und nichts tun
        nop
        nop
        nop
   nop
        nop
        nop
        decfsz  loops2, F      ; innere Schleife fertig?
        goto    top2           ; nein, noch mal rum
                               ;
        decfsz  loops, F       ; äußere Schleife fertig?
        goto    top            ; nein, noch mal rum
        retlw   0              ; FERTIG und return


   end      



t2

Alıntı Yap- USB HID Controller PC ile iletisimde bulunmasi
- 6 Dügme kulanimi Stop/Ejekt, FFW, FW, Play/Pause, RW, FRW
- LCD Display görevi (1x16 veya 2x16)
- Kizilötesi iletisimi (Uzakdan Komanda)

En iyisi tek cihaz olarak tasarlamak fakat bunları 2 cihaz olarak düşünürseniz belki işiniz kolaylaşır. Kendiniz daha kısa sürede yapablirsiniz:

1- Üzerinde media player tuşları olan basit bir klavye piyasadan alınır, gerekirse içini parçalayıp bir kutuya koyar ayrı düğme takabilirsiniz.  Bu klavyelerde bazı modellerde ayrıca USB hub özelliği de oluyor
2- LCD ve Kızılötesi için ayrı bir usb cihaz yapılır. bu da yukarıdaki klavyenin usb girişlerine takılır hepsi aynı kutuda olur.


Sonuç olarak USB ye tek bir kablo takılır üzerinde klavye ve LC + kızılötesi bulunan cihaz bağlanmış gibi algılanır. AYrıca hub kısmında boş yer kaldıysa oraya USB bellek de takılabilir.

muhittin_kaplan

zor bir iş değil ama benim bu iş için pek vaktim yok. yanlış bilmiyorsam default olarak seçilmiş media playerin kısa yol tuşlarını kontrol edebilmek zor değildir. bunun için kullanacağınız oem ürünler bile bulabilirsiniz.
ayrıca asm ile bu iş zor olur, ben olsam swordfish ile yazardım.

xricix



bakalim alman rst-lighting firmasina yazdim onlar zamaninda 16c745 icin yaziyorlardi acaba 18f2550 icinde yazarlarmi diye

swordfish i indirdim biraz programi tanimam gerekecek bi de isis professional diye bi programa rastladim onu da indirdim bakim sonunda becerebilecekmiyim pek sanmasamda

t2 ustam ben bu cihazi degistiremiyorum bu cihaz zaten kasaya göre ayarlanmis ve güzel biseyde yanlizca eproma yazilim gerekli


muhittin_kaplan

hocam naçizane bunun için yapılmış oem ürünler var 10-20usd ye.

xricix

muhittin_kaplan usta bulabilecegim siteyi verirsen memnun olurum

muhittin_kaplan


computerboy

Fiyakalı bişey olsun diyorsan home media için özel tasarlanmış bilgisayar anakartları var Asus P5W DH Deluxe diye arattır bulursun kumandası mevcut. hatta asus marka kasa tercih edeceksen dijital ekran kontrollü 500 watlık kasalarda mevcut. anakart ve kasa ikisi bir uyum içinde ahenkle danseder :)

xricix

http://postimg.cc/image/mdnq4vl0/
http://postimg.cc/image/mduca9k4/
http://postimg.cc/image/mdzawb1g/
http://postimg.cc/image/mee6qfhg/
Lintec Senior HTPC Media Center PC

ilgileriniz icin tesekürler

computerboy bence elimdeki zaten fiyakali duruyor anakart da güzel bisey malesef tamamlanmamis fiyakali media center durumunda su an.

dedigim gibi bana ne bi cihaz ne de bi baska malzeme gerekli bana gerekli olan resimlerde gördügünüz lcd displayini 6 dügmeyi controll edebilmesidir
ve ayriyetden becerebilen birisi olursa ondan IRDA kizilötesini de PIC18F2550 nin icine eklemek IRDA eger kafayi cok yoracak gibi ise mecbur olmasi gerekli degil ben onu yedek olarak düsünmüsdüm.

aslinda o kadar zor bi yazilimda olmamasi gerekli ama bi türlü bulamadim !

alman sitesinden de cevap gelmedi acaba onlarda mi birakdi bu isleri bilemiyecegim eskiden PIC16C745 icin yazilim yapiyorlardi.

muhidin_kaplan ustam elimde o sitedekine benzer uzakdan kumanda var ama benim istedigim o tür cözüm degil.
nedeni ise cihazlarin kasanin icinde bulunmasi dis tarafinda bos sade durmasi.
acaba isedigim yazilim yoksa gercekden o kadar zor biseymi ne lazim bi dosya bulabildim ne de yazabilen birisini bulabildim

muhittin_kaplan

Açıkcası, ben 100Usd ye o cihazı yapmaya başlamazdım. Çünki Yaptıktan sonra 1 de 100 de aynı zaman. usb iletişimi bir dert, ayrıca işin içerisinde ırda vs de var. yani profesyonel bir cihaz 100 usd civarlarında yaptırmannız zor.
siz ilk etapta usb iletişimi ile o 6 tuşu göndereceksiniz. Bunn için USB keyboard codu arayacaksınız (ki Türkiyede Seri İletişimden hala vazgeçilmedi) sonra bu usb klavyeye IRDA yapıp o tuşlara bu ırdadan basılmasını sağlayacaksınız.