proton basic ile pic18f4550 usb usart uygulaması sorunu

Başlatan dnacikaya, 25 Ocak 2012, 21:20:10

dnacikaya

Merhaba arkadaşlar,  geliştirmeye çalıştığım başlıktaki uygulamada karşılaştığım sorunu bir türlü çözemedim. Proton basic konusunda bilgili arkadaşların yardımına ihtiyacım var.

Yapmak istediğim kısaca şöyle, pic16f877a tarafından max485 ile gönderilen seri bilgiyi max485 ve pic18f4550 usart üzerinden usb porta aktarmak. İletişimi Max485 ile gerçekleştireceğim.

Buna benzer usart kullandığım  iletişimi 2 adet pic pic16f877a ile gayet güzel bir şekilde gerçekleştirdim. Usb tarafında da sorunum yok. Pic18f4550 ile bilgisayar programına bağlanıp istediğim işlemleri yapabiliyorum.

Ancak iş pic18f4550 ile seri bilgiyi buffer üzerinden usb porta aktarmaya gelince takıldım. HSERIN komutunu program içinde kullandığımda donanım ile program bağlantısı kopuyor. Ben bu hserin ile aldığım veriyi nasıl buffer'a aktarabilirim. usbout usbin usbpoll komutlarını nasıl kullanmalıyım, sanırım bunlarla ilgili bir durum birde pic18f4550 config hatasıda olabilir. Webde de araştırdım ancak bir şey bulamadım.

Üzerinde çalıştığım kodu ekliyorum. Çalışmaya devam ediyorum bir sonuç alırsam buradan paylaşmaya devam edeceğim. Şimdiden yardımcı olacaklara teşekkürler.

Device = 18F4550
XTAL = 48	

@CONFIG_REQ
@__config CONFIG1L, PLLDIV_1_1 & CPUDIV_1_1 & USBDIV_1_1
@__config CONFIG1H, FOSC_HS_1 & FCMEM_OFF_1 & IESO_OFF_1
@__config CONFIG2L, PWRT_ON_2 & BOR_OFF_2 & VREGEN_ON_2
@__config CONFIG2H, WDT_OFF_2 & WDTPS_128_2
@__config CONFIG3H, MCLRE_ON_3 & LPT1OSC_OFF_3 & PBADEN_OFF_3 & CCP2MX_OFF_3
@__config CONFIG4L, STVREN_OFF_4 & LVP_OFF_4 & ICPRT_OFF_4 & XINST_OFF_4 & DEBUG_OFF_4
@__config CONFIG5L, CP0_OFF_5 & CP1_OFF_5 & CP2_OFF_5
@__config CONFIG5H, CPB_OFF_5 & CPB_OFF_5
@__config CONFIG6L, WRT0_OFF_6 & WRT1_OFF_6 & WRT2_OFF_6
@__config CONFIG6H, WRTC_OFF_6 & WRTB_OFF_6 & WRTD_OFF_6
@__config CONFIG7L, EBTR0_OFF_7 & EBTR1_OFF_7 & EBTR2_OFF_7
@__config CONFIG7H, EBTRB_OFF_7

Declare PORTB_PULLUPS 1
Declare ADIN_RES 8
Declare ADIN_STIME 50

ALL_DIGITAL = TRUE                    
ADCON1=7 
' descriptor file, located in \inc\usb_18 - a copy
' is located in the same folder as this file	

USB_DESCRIPTOR = "usbproject5desc.inc"

Symbol USBBufferSizeMax = 32
Symbol USBBufferSizeTX  = 8
Symbol USBBufferSizeRX  = 32

HSERIAL_RCSTA = 90H ; Enable continuous receive
HSERIAL_TXSTA = 20H  ; Enable transmit, BRGH = 1
HSERIAL_SPBRG = 25 ; Baud Rate Generator Value
HSERIAL_CLEAR = On  ; Clear overflow automatically
RCSTA = 144 ; Enable continuous receive
TXSTA = 36  ; Enable transmit, BRGH = 1
SPBRG = 129 ; Baud Rate Generator Value

Symbol RCIE = PIE1.5 ' USART Receive Interrupt yetki
Symbol RCIF = PIR1.5 ' USART Receive Interrupt bayrağı

Dim    USBBuffer[USBBufferSizeMax] As Byte
Dim veri As Word
veri=0

' some useful flags...
Dim PP0 As Byte SYSTEM        ' USBPOLL status return
Symbol CARRY_FLAG = STATUS.0  ' high if microcontroller does not have control over the buffer
Symbol ATTACHED_STATE = 6     ' is USB attached
     
' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBPoll, USBIn or USBOut *
' * every couple of milliseconds or so                       *
' ************************************************************

' ************************************************************
TRISA = %00000000
TRISB = %00000000
TRISC = %11110000


' ************************************************************

GoSub AttachToUSB

veri= USBBuffer[0]

ProgramLoop:

HSerIn [Wait("test"),veri]  'donanım ile program haberleşmesinin kopmasına neden olan satır. Sanırım bu burda olmamalı :)
  
USBBuffer[0]=0
USBBuffer[1]=0
USBBuffer[2]=0
USBBuffer[3]=0
USBBuffer[4]=0
USBBuffer[5]=0
USBBuffer[6]=0
USBBuffer[7]=0

   USBOut 1, USBBuffer, USBBufferSizeTX
   USBIn 1, USBBuffer, USBBufferSizeRX, ProgramLoop
   GoTo ProgramLoop
  
' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
   USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBIn
   Return
   
' ************************************************************
' * transmit data                                            *
' ************************************************************
DoUSBOut:   
   USBOut 1, USBBuffer, USBBufferSizeTX, DoUSBOut
   Return

' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
AttachToUSB:
   Repeat								
      USBPoll		
   Until PP0 = ATTACHED_STATE

   Return
   
Return

dnacikaya

Konuyu http://www.protonbasic.co.uk forumunda da sordum oradan bile bir cevap gelmedi. Acaba olmayacak bir projeyemi giriştim :)

muhittin_kaplan


dnacikaya

ilginiz için teşekkür ederim. donanımda 20mhz kristal mevcut.

muhittin_kaplan

ilk aklıma gelen seri bilgiyi beklerken USB için gerekli olan min zamanda sorgulamanın (cihaz takılımı değilmi) nin ulaştırılmamasıdır.
bilgiyi beklerken bir döngü kurup USBPOOL komutunu kullanmanız.
wait de nekadar bekliyor

dnacikaya

evet hocam haklısınız, kod bu haliyle zaten bağlantı kurulmasını engelliyor. dediğiniz gibi usbpoll komutu ile tekrar denerim. wait olarak kodda belirtmedim ancak 1000ms olabilir. sanırım bu sürede önemli bu durumda.

muhittin_kaplan

yani 1sn bekliyor orada çok uzun bir süre. yanlış hatırlamıyorsam 10ms de bir usbpoll olması gerek.
sen dogrudan cdc örneklerini incelersen daha iyi olur sanırım.

dnacikaya

verdiğiniz fikirler için sağolun, bu akşam bu sorunu çözebilirim umarım.

OG

Alıntı yapılan: dnacikaya - 26 Ocak 2012, 20:42:51
Konuyu http://www.protonbasic.co.uk forumunda da sordum oradan bile bir cevap gelmedi. Acaba olmayacak bir projeyemi giriştim :)
Licensed User değilseniz oradan zor cevap alırsınız.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

dnacikaya

Evet durumun farkındayım lisanslı kullanıcıların ayrıcalıkları var ama protonbasic.co.uk da bu konu ile ilgili hiç bir örnekde göremedim. Araştırmaya devam ediyorum bir şekilde bu sorunu çözeceğim.

muhittin_kaplan

İsteginiz usb to usart sa cdc usb urnegini arastiriniz

Lütfi AYYILDIZ

Ben usart kesmesi kullanmayı denerdim ilk gelen datayı (2.,3. de olabilir) sorgulardım.
Örneğin; (Protonu çok kurcalamadım onun için Pbp kodları)
Disable
INT:
    GIE=0
    hserin [veri,veri1]  
if veri != test then 
veri1=0
endif     
    
GIE=1

resume