c18 hid bootloader ve kesme çözemedim

Başlatan fryrmnd, 05 Haziran 2012, 12:03:50

fryrmnd

arkadaşlar microchip hid bootloader yüklü 18F4550 ye 18F2550 ile uart üzerinden data yollamam lazım. alıcı tarafında uart kesmesi ile almak istiyorum.

verici
#include <p18cxxx.h>
#include <delays.h>

#pragma config FOSC=XT_XT,LVP=OFF,WDT=OFF

void main(void){

    TRISB=0x00;
    TRISC=0x80;
    //TRISD=0x00;
    //LATD=0x00;
    LATB=0x00;
    LATC=0x00;
    
    SPBRG=0x06;
    TXSTAbits.BRGH=0;
    BAUDCONbits.BRG16=0;
    TXSTAbits.SYNC=0;
    RCSTAbits.SPEN=1;
    TXSTAbits.TXEN=1;

    while(1){
    Delay10KTCYx(56);
  
    //LATD=0xFF;
    TXREG=0x26;
    Delay10KTCYx(56);
   
    //LATD=0x00;
    }         
}


alıcı
#include <p18cxxx.h>
#include <delays.h>
#include "lcd07.h"

#pragma config FOSC=XT_XT,LVP=OFF,WDT=OFF

unsigned char Uart_Karakter;
unsigned char Uart_Bayrak;

void kesmeH();
void kesmeL();

/**********************************
extern void _startup(void);

#pragma code RESET_VECTOR=0x1000
	void _reset (void)
	{
	    _asm goto _startup _endasm
	}
**********************************/
#pragma code ISR_H=0x1008
	void isr_H (void)
	{
	     _asm goto kesmeH _endasm
	}
#pragma code ISR_L=0x1018
	void isr_L(void)
	{
	     _asm goto kesmeL _endasm
	}
#pragma code


#pragma interrupt kesmeH
void kesmeH(){
    if(PIR1bits.RCIF){
        INTCONbits.GIEH=0;
        INTCONbits.GIEL=0;
        PIE1bits.RCIE=0;
        PIR1bits.RCIF=0;

        Uart_Karakter=RCREG;
        Uart_Bayrak=1;

        PIE1bits.RCIE=1;
        INTCONbits.GIEH=1;
        INTCONbits.GIEL=0;
    }
}

#pragma interruptlow kesmeL
void kesmeL(){

}
#pragma code

void main(void){
    
    TRISB=0x00;
    TRISC=0x80;
    TRISD=0x00;
    LATD=0x00;
    LATB=0x00;
    LATC=0x00;

    lcd_init();
   
    PIR1=0; 
    SPBRG=0x06;
    TXSTAbits.BRGH=0;
    BAUDCONbits.BRG16=0;
    TXSTAbits.SYNC=0;
    RCSTAbits.SPEN=1;
    RCSTAbits.CREN=1;

    RCONbits.IPEN=1;
    IPR1bits.RCIP=1;
    PIE1bits.RCIE=1;
    INTCONbits.GIEH=1;
    INTCONbits.GIEL=0;
    
    while(1)
    {
        if(Uart_Bayrak==1){
            Uart_Bayrak=0;
            veri_yolla(Uart_Karakter);
        }
    }
}


bootloader kullanmadan "&" karakterini lcdye alabiliyorum. ancak bootloader ile yüklerken
extern void _startup(void);

#pragma code RESET_VECTOR=0x1000
	void _reset (void)
	{
	    _asm goto _startup _endasm
	}

satırlarını aktifleştirip reset vektörünü 0x1000 e almam gerektiğini düşünüyorum. ama galiba yanlış düşünüyorum ki bir sonuç elde edemedim. reset ve interrupt vektörlerinden kaynaklı bir sorunum var galiba. işin içinden çıkamadım. yardımlarınızı bekliyorum.

justice_for_all

kesme vektör adreslerin yalnış sanırım
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

fryrmnd

@justice_for_all

nasıl olmalı hocam.

yüksek 0x08 düşük 0x18 değilmiydi. hid bootloader 0xFFF e kadar ayrılırsa reset i 0x1000 diğerlerini de 0x1008 ve 0x1018 e almak gerekmezmi? :-\

justice_for_all

INTCONbits.GIEL=0;
bu satırı

INTCONbits.PEIE=1;
yaparak denermisin bide
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

fryrmnd

yok hocam olmuyor. reset atıyor. zaten kesme önceliğini(IPEN) aktifleştirince PEIE değilde GIEL kullanmak gerekmiyor mu?

justice_for_all



yukarıda şekilde çevresel birimler kesmesi enable yapılmazsa kesme olayı gerçekleşmez ama.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

fryrmnd

hocam haklısın ama ben bootloader sız nasıl kesme aldım.  :o

justice_for_all

microchipin sitesinde HID bootloader la ilgili örnekler var bi bak istersen..

mesela örneğin birinde su sekilde yapmış senin yaptığın gibi devamı da aynı senin kod gibi yani ..

#if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)
		#define REMAPPED_RESET_VECTOR_ADDRESS			0x1000
		#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS	0x1008
		#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS	0x1018
	#elif defined(PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER)	
		#define REMAPPED_RESET_VECTOR_ADDRESS			0x800
		#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS	0x808
		#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS	0x818
	#else	
		#define REMAPPED_RESET_VECTOR_ADDRESS			0x00
		#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS	0x08
		#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS	0x18
	#endif
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

fryrmnd

tamam hocam ben de onlara bakıyorum zaten.
#if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)
ifadesi ile eğer projede bir yerde kod hid bootloader ile yüklenecek şeklinde bir direktif verilmişse   vektör adreslerini 1000 1008 ve 1018 kabul et demiyor mu?

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

fryrmnd

microchip hid custom demo projesinde timer0 kesmesini yüksek öncelikli kesme olarak ayarladım. bootloader ile yükleme yaptım güzel çalışıyor. sıfırdan proje oluşturup bootloader ile kesme yi bir türlü çalıştıramdım. arada bir trik var ama. acaba startup dosyası ile ilgili bir modifiye mi gerek. hid bootloader kullanıp kesme çalıştıran varsa olayı biraz anlatabilir mi?