Bootloader Problemi

Başlatan kasif, 27 Ağustos 2006, 01:30:00

kasif

Merhabalar,

Seri iletişim ile ilgili bir program yazdım. Bunu programlayıcı ile pic e yazdırınca çalışıyor fakat aynı programı bootloader ile pic e atınca, ilk 2 LCD ekran görüntüleri geliyor fakat iletişim yapmıyor

Microcode Loader kullanıyorum, 18F4550 programlıyorum. Bootloaderin hex ini işlemciye attım, loader üzerinden programı atarken veya kontrol ettirirken sorun çıkmıyor.

Zaten bootloader ile atılan program, LCD görüntüsünde çalışıyor, ama iletişim yapmıyor.

Picbasic kodları aşağıda
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : Nedim KASIKIRIK                                   *
'*  Notice  : Copyright (c) 2006 Kasif .org / e                 *
'*          : All Rights Reserved                               *
'*  Date    : 26.08.2006                                        *
'*  Version : 1.0                                               *
'*  Notes   : 18F4550                                           *
'*          :                                                   *
'****************************************************************

DEFINE OSC 48 
DEFINE LOADER_USED 1

Include "modedefs.bas" 

Define	LCD_DREG	PORTD
Define	LCD_DBIT	4
Define	LCD_RSREG	PORTD
Define	LCD_RSBIT	2
Define	LCD_EREG	PORTD
Define	LCD_EBIT	3
Define  LCD_LINES   4 
Define  LCD_BITS    4 


    lcdout $fe,1
    lcdout "4  SATIR LCD EKRANLA"
    lcdout $fe,$c0
    lcdout "YAZILIMSAL SERI PORT"
    lcdout $fe,$94
    lcdout "' NEDIM  KASIKIRIK '"
    lcdout $fe,$d4
    lcdout "  26 AĞUSTOS  2006  "
    pause 5000
    
    lcdout $fe,1
    lcdout "********************"
    lcdout $fe,$c0
    lcdout "*    ILETISIME     *"
    lcdout $fe,$94
    lcdout "*      HAZIR       *"
    lcdout $fe,$d4
    lcdout "********************"

SERIGEL   VAR BYTE[16] 


pause 2000
basla : 
SerIn2 PORTC.7,84,5000,BASLA,[str SERIGEL\6] 
pause 400 

    lcdout $fe,1
    lcdout "A:",#SERIGEL[0],"/",#SERIGEL[1],"/",#SERIGEL[2]
    lcdout $fe,$c0
    lcdout "B:",#SERIGEL[3],"/",#SERIGEL[4],"/",#SERIGEL[5]
    lcdout $fe,$94
    lcdout "C:",SERIGEL[0],"/",SERIGEL[1],"/",SERIGEL[2]
    lcdout $fe,$d4
    lcdout "D:",SERIGEL[3],"/",SERIGEL[4],"/",SERIGEL[5]
    pause 1000

SEROUT2 PORTC.6,84,[serigel[0],serigel[1],13,10] 
pause 100 
goto basla  

Aynı programın hex dosyası, programlayıcı ile yüklenince sorunsuz çalışıyor, loader ile yüklenince 2. ekranda kalıyor.

Nerede hata olabilir?

SpeedyX

pbp de #seperate nin karşılığı neydi unuttum.
Programın asm sini alabilsek.
Eğer fuses kısmı problem değilse;
SERIGEL   VAR BYTE[16] satırını Define  LCD_BITS    4 ün altına alıp deneyin, birşey değiştirmezse #seperate denemek lazım, yani programın bir kısmını biraz yukarılara taşımak.
Programın bazı bloklarını alt program haline getirerek Call ile çağırmakta çözüm olabilir.

mmengi

18F4550 için loader Hex i nasıl temin ettiniz?

Yeni versiyonlarda bu pic için loader dosyası yok sizde MCSP nin hangi versiyonu var?

kasif

SpeedyX,

SERIGEL VAR BYTE[16] satırının yerini de değiştirdim, birşey farketmedi, asm kodları aşağıda, pek asm biliyorum, ama kodlarda bir sürü include dosya çağırıyor.
; PicBasic Pro Compiler 2.46, (c) 1998, 2005 microEngineering Labs, Inc. All Rights Reserved.  
_USED			EQU	1

	INCLUDE	"C:\PBP\PBP246\18F4550.INC"


; Define statements.
#define		OSC		 48 
#define		LOADER_USED		 1
#define		LCD_DREG			PORTD
#define		LCD_DBIT			4
#define		LCD_RSREG			PORTD
#define		LCD_RSBIT			2
#define		LCD_EREG			PORTD
#define		LCD_EBIT			3
#define		LCD_LINES		   4 
#define		LCD_BITS		    4 

RAM_START       		EQU	00000h
RAM_END         		EQU	007FFh
RAM_BANKS       		EQU	00008h
BANK0_START     		EQU	00060h
BANK0_END       		EQU	000FFh
BANK1_START     		EQU	00100h
BANK1_END       		EQU	001FFh
BANK2_START     		EQU	00200h
BANK2_END       		EQU	002FFh
BANK3_START     		EQU	00300h
BANK3_END       		EQU	003FFh
BANK4_START     		EQU	00400h
BANK4_END       		EQU	004FFh
BANK5_START     		EQU	00500h
BANK5_END       		EQU	005FFh
BANK6_START     		EQU	00600h
BANK6_END       		EQU	006FFh
BANK7_START     		EQU	00700h
BANK7_END       		EQU	007FFh
BANKA_START     		EQU	00000h
BANKA_END       		EQU	0005Fh

R0              		EQU	RAM_START + 000h
R1              		EQU	RAM_START + 002h
R2              		EQU	RAM_START + 004h
R3              		EQU	RAM_START + 006h
R4              		EQU	RAM_START + 008h
R5              		EQU	RAM_START + 00Ah
R6              		EQU	RAM_START + 00Ch
R7              		EQU	RAM_START + 00Eh
R8              		EQU	RAM_START + 010h
FLAGS           		EQU	RAM_START + 012h
GOP             		EQU	RAM_START + 013h
RM1             		EQU	RAM_START + 014h
RM2             		EQU	RAM_START + 015h
RR1             		EQU	RAM_START + 016h
RR2             		EQU	RAM_START + 017h
RS1             		EQU	RAM_START + 018h
RS2             		EQU	RAM_START + 019h
_SERIGEL         		EQU	RAM_START + 01Ah
_PORTL           		EQU	 PORTB
_PORTH           		EQU	 PORTC
_TRISL           		EQU	 TRISB
_TRISH           		EQU	 TRISC
#define _PORTC_7         	 PORTC, 007h
#define _PORTC_6         	 PORTC, 006h

; Constants.
_T2400           		EQU	00000h
_T1200           		EQU	00001h
_T9600           		EQU	00002h
_T300            		EQU	00003h
_N2400           		EQU	00004h
_N1200           		EQU	00005h
_N9600           		EQU	00006h
_N300            		EQU	00007h
_OT2400          		EQU	00008h
_OT1200          		EQU	00009h
_OT9600          		EQU	0000Ah
_OT300           		EQU	0000Bh
_ON2400          		EQU	0000Ch
_ON1200          		EQU	0000Dh
_ON9600          		EQU	0000Eh
_ON300           		EQU	0000Fh
_MSBPRE          		EQU	00000h
_LSBPRE          		EQU	00001h
_MSBPOST         		EQU	00002h
_LSBPOST         		EQU	00003h
_LSBFIRST        		EQU	00000h
_MSBFIRST        		EQU	00001h
_CLS             		EQU	00000h
_HOME            		EQU	00001h
_BELL            		EQU	00007h
_BKSP            		EQU	00008h
_TAB             		EQU	00009h
_CR              		EQU	0000Dh
_UnitOn          		EQU	00012h
_UnitOff         		EQU	0001Ah
_UnitsOff        		EQU	0001Ch
_LightsOn        		EQU	00014h
_LightsOff       		EQU	00010h
_Dim             		EQU	0001Eh
_Bright          		EQU	00016h
	INCLUDE	"IL_DEN10.MAC"
	INCLUDE	"C:\PBP\PBP246\PBPPIC18.LIB"

	LCDOUT?C	0FEh
	LCDOUT?C	001h
	LCDOUT?C	034h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	053h
	LCDOUT?C	041h
	LCDOUT?C	054h
	LCDOUT?C	049h
	LCDOUT?C	052h
	LCDOUT?C	020h
	LCDOUT?C	04Ch
	LCDOUT?C	043h
	LCDOUT?C	044h
	LCDOUT?C	020h
	LCDOUT?C	045h
	LCDOUT?C	04Bh
	LCDOUT?C	052h
	LCDOUT?C	041h
	LCDOUT?C	04Eh
	LCDOUT?C	04Ch
	LCDOUT?C	041h
	LCDOUT?C	0FEh
	LCDOUT?C	0C0h
	LCDOUT?C	059h
	LCDOUT?C	041h
	LCDOUT?C	05Ah
	LCDOUT?C	049h
	LCDOUT?C	04Ch
	LCDOUT?C	049h
	LCDOUT?C	04Dh
	LCDOUT?C	053h
	LCDOUT?C	041h
	LCDOUT?C	04Ch
	LCDOUT?C	020h
	LCDOUT?C	053h
	LCDOUT?C	045h
	LCDOUT?C	052h
	LCDOUT?C	049h
	LCDOUT?C	020h
	LCDOUT?C	050h
	LCDOUT?C	04Fh
	LCDOUT?C	052h
	LCDOUT?C	054h
	LCDOUT?C	0FEh
	LCDOUT?C	094h
	LCDOUT?C	027h
	LCDOUT?C	020h
	LCDOUT?C	04Eh
	LCDOUT?C	045h
	LCDOUT?C	044h
	LCDOUT?C	049h
	LCDOUT?C	04Dh
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	04Bh
	LCDOUT?C	041h
	LCDOUT?C	053h
	LCDOUT?C	049h
	LCDOUT?C	04Bh
	LCDOUT?C	049h
	LCDOUT?C	052h
	LCDOUT?C	049h
	LCDOUT?C	04Bh
	LCDOUT?C	020h
	LCDOUT?C	027h
	LCDOUT?C	0FEh
	LCDOUT?C	0D4h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	032h
	LCDOUT?C	036h
	LCDOUT?C	020h
	LCDOUT?C	041h
	LCDOUT?C	0FFD0h
	LCDOUT?C	055h
	LCDOUT?C	053h
	LCDOUT?C	054h
	LCDOUT?C	04Fh
	LCDOUT?C	053h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	032h
	LCDOUT?C	030h
	LCDOUT?C	030h
	LCDOUT?C	036h
	LCDOUT?C	020h
	LCDOUT?C	020h
	PAUSE?C	01388h
	LCDOUT?C	0FEh
	LCDOUT?C	001h
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	0FEh
	LCDOUT?C	0C0h
	LCDOUT?C	02Ah
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	049h
	LCDOUT?C	04Ch
	LCDOUT?C	045h
	LCDOUT?C	054h
	LCDOUT?C	049h
	LCDOUT?C	053h
	LCDOUT?C	049h
	LCDOUT?C	04Dh
	LCDOUT?C	045h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	02Ah
	LCDOUT?C	0FEh
	LCDOUT?C	094h
	LCDOUT?C	02Ah
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	048h
	LCDOUT?C	041h
	LCDOUT?C	05Ah
	LCDOUT?C	049h
	LCDOUT?C	052h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	020h
	LCDOUT?C	02Ah
	LCDOUT?C	0FEh
	LCDOUT?C	0D4h
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	LCDOUT?C	02Ah
	PAUSE?C	007D0h

	LABEL?L	_basla	
	SERIN2DPIN?T	_PORTC_7
	SERIN2MODE?C	054h
	SERIN2TIME?C	01388h
	SERIN2COUNT?C	006h
	SERIN2STR?BL	_SERIGEL, _basla
	PAUSE?C	00190h
	LCDOUT?C	0FEh
	LCDOUT?C	001h
	LCDOUT?C	041h
	LCDOUT?C	03Ah
	LCDOUTD?B	_SERIGEL
	LCDOUT?C	02Fh
	LCDOUTD?B	_SERIGEL + 00001h
	LCDOUT?C	02Fh
	LCDOUTD?B	_SERIGEL + 00002h
	LCDOUT?C	0FEh
	LCDOUT?C	0C0h
	LCDOUT?C	042h
	LCDOUT?C	03Ah
	LCDOUTD?B	_SERIGEL + 00003h
	LCDOUT?C	02Fh
	LCDOUTD?B	_SERIGEL + 00004h
	LCDOUT?C	02Fh
	LCDOUTD?B	_SERIGEL + 00005h
	LCDOUT?C	0FEh
	LCDOUT?C	094h
	LCDOUT?C	043h
	LCDOUT?C	03Ah
	LCDOUT?B	_SERIGEL
	LCDOUT?C	02Fh
	LCDOUT?B	_SERIGEL + 00001h
	LCDOUT?C	02Fh
	LCDOUT?B	_SERIGEL + 00002h
	LCDOUT?C	0FEh
	LCDOUT?C	0D4h
	LCDOUT?C	044h
	LCDOUT?C	03Ah
	LCDOUT?B	_SERIGEL + 00003h
	LCDOUT?C	02Fh
	LCDOUT?B	_SERIGEL + 00004h
	LCDOUT?C	02Fh
	LCDOUT?B	_SERIGEL + 00005h
	PAUSE?C	003E8h
	SEROUT2DPIN?T	_PORTC_6
	SEROUT2MODE?C	054h
	SEROUT2PACE?C	000h
	SEROUT2?B	_SERIGEL
	SEROUT2?B	_SERIGEL + 00001h
	SEROUT2?C	00Dh
	SEROUT2?C	00Ah
	PAUSE?C	064h
	GOTO?L	_basla

	END


"seperate" tam olarak ne işe yarar, nasıl kullanmalıyım?

mmengi,

MCSP Versiyon 2.3.0.0 da
18F4550 nin 4Mhc ve 20Mhz olmak üzere 2 tane bootloader hex i var.

Edit:
Şimdi USB denemesi yaptım, sonuç aynı,
Eğer işlemciyi programlayıcı ile programlarsam tam çalışıyor, eğer bootloader ile programlarsam(doğrulama da yapıyorum) ekran yazıları yazıyor fakat USB bağlantısı çalışmıyor.

Programımda hata olmadığını düşünüyorum, bootloader da hata var desem, neden ilk iki LCD ekranı sorunsuz çalışıyor.

Yanlış hatırlamıyor isem, bootloader larda WDT kapalı olmalı, ama "define bootloader 1" komutu zaten bunu kapatıyordur diye düşünüyorum.

Edit 2:
Ayrıca ben Kristal Hızı işini anlayamadım, "DEFINE OSC 48" kullanıyorum, başka bir denememde işlemciyi "DEFINE OSC 20" tanımı ile programlamıştım, çalışmamıştı.

Ama hata OSC de de olsa LCD neden düzgün çalışıyor, iki ekran arasında 5 saniye bekleme yapıyorum, zamanda doğru, tam 5 saniye bekliyor. Sorun nerede anlayamadım.

Edit 3:

Açaba girişlerde(input) genel bir problem var mı diye aşağıdaki ufak ADC programını yükledim. Çok güzel çalıştı. Seri veya USB neden çalışmıyor.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : Nedim KASIKIRIK                                   *
'*  Notice  : Copyright (c) 2004 Kasif .org                     *
'*          : All Rights Reserved                               *
'*  Date    : 10.08.2004                                        *
'*  Version : 1.0                                               *
'*  Notes   : 18F4550                                           *
'*          :                                                   *
'****************************************************************
DEFINE OSC 48 
DEFINE LOADER_USED 1

Include "modedefs.bas"

Define	LCD_DREG	PORTD
Define	LCD_DBIT	4
Define	LCD_RSREG	PORTD
Define	LCD_RSBIT	2
Define	LCD_EREG	PORTD
Define	LCD_EBIT	3

DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

Define	ADC_BITS	10	' Set number of bits in result
Define	ADC_CLOCK	3	' Set clock source (3=rc)
Define	ADC_SAMPLEUS	50	' Set sampling time in uS

adval	var	word		' Create adval to store result


	TRISA = %11111111	' Set PORTA to all input
	ADCON1 = %10000010	' Set PORTA analog and right justify result

	Pause 500		' Wait .5 second

loop:	ADCIN 0, adval		' Read channel 0 to adval

	Lcdout $fe, 1		' Clear LCD
	Lcdout "Value: ", DEC adval	' Display the decimal value  

	Pause 100		' Wait .1 second

	Goto loop		' Do it forever
	End


Fazla edit yaptım galiba ,

kasif

Bende bir gelişme yok, sizlerde gelişme var mı?

Yukarıdaki denemelerden sonra 16F877A ile bir deneme yaptım, sonuç aynıydı.

Yani işlemcilerde veya devrede bir sorun olduğunu sanmıyorum.

Veya problemsiz çalışan 18F4550 veya 16F877A işlemciler için bootloader yazılımı ve hex leri var mı?

SpeedyX

şöyle değiştirsek; (programda giriş/çıkış tanımlaması yok, portlar başlangıçta sıfırlanmıyor...)
DEFINE OSC 48
DEFINE LOADER_USED 1

Include "modedefs.bas"

Define   LCD_DREG   PORTD
Define   LCD_DBIT   4
Define   LCD_RSREG   PORTD
Define   LCD_RSBIT   2
Define   LCD_EREG   PORTD
Define   LCD_EBIT   3
Define  LCD_LINES   4
Define  LCD_BITS    4

SERIGEL   VAR BYTE[16]

    call ekran1
    pause 5000
    call ekran2
    pause 2000

basla :
    SerIn2 PORTC.7,84,5000,BASLA,[str SERIGEL\6]
    pause 400
    call veriyaz
    pause 1000
    SEROUT2 PORTC.6,84,[serigel[0],serigel[1],13,10]
    pause 100
goto basla

ekran1:
    lcdout $fe,1
    lcdout "4  SATIR LCD EKRANLA"
    lcdout $fe,$c0
    lcdout "YAZILIMSAL SERI PORT"
    lcdout $fe,$94
    lcdout "' NEDIM  KASIKIRIK '"
    lcdout $fe,$d4
    lcdout "  26 AĞUSTOS  2006  "
    return

ekran2:
    lcdout $fe,1
    lcdout "********************"
    lcdout $fe,$c0
    lcdout "*    ILETISIME     *"
    lcdout $fe,$94
    lcdout "*      HAZIR       *"
    lcdout $fe,$d4
    lcdout "********************"
    return

veriyaz:
    lcdout $fe,1
    lcdout "A:",#SERIGEL[0],"/",#SERIGEL[1],"/",#SERIGEL[2]
    lcdout $fe,$c0
    lcdout "B:",#SERIGEL[3],"/",#SERIGEL[4],"/",#SERIGEL[5]
    lcdout $fe,$94
    lcdout "C:",SERIGEL[0],"/",SERIGEL[1],"/",SERIGEL[2]
    lcdout $fe,$d4
    lcdout "D:",SERIGEL[3],"/",SERIGEL[4],"/",SERIGEL[5]
    return

Aklıma başka birşey gelmiyor. Birde verdiğiniz tam olarak asm değil. LST dosyası varsa onu yapıştırın.

kasif

Denedim, aynı şey, programlayıcı ile programlarsam sorun yok, bootloader ile yaparsam yarım çalışıyor.

Hatta aşağıdaki şekilde değişiklik yaptım, söyle bir hata oluştu, pic' kesinlikle veri gitmedi, fakat pic den PC ye garip veriler(her seferinde farklı) geldi. Kristal OSC hızından şüpheleniyorum.
DEFINE OSC 48 
DEFINE LOADER_USED 1 

Include "modedefs.bas" 

Define   LCD_DREG   PORTD 
Define   LCD_DBIT   4 
Define   LCD_RSREG   PORTD 
Define   LCD_RSBIT   2 
Define   LCD_EREG   PORTD 
Define   LCD_EBIT   3 
Define  LCD_LINES   4 
Define  LCD_BITS    4 

SERIGEL   VAR BYTE[16] 

    call ekran1 
    pause 5000 
    call ekran2 
    pause 2000 

basla : 
    SerIn2 PORTC.7,84,2000,gelmedi,[str SERIGEL\6] 
    pause 400 
    call veriyaz
    pause 1000 
    SEROUT2 PORTC.6,84,[serigel[0],serigel[1],13,10] 
    pause 100 
goto basla 

gelmedi: 
    pause 1000 
    SEROUT2 PORTC.6,84,["NK",13,10] 
    pause 100 
    call EKRAN0
    pause 1000 
goto basla 

ekran0: 
    lcdout $fe,1 
    lcdout "********************" 
    lcdout $fe,$c0 
    lcdout "*       HATA       *" 
    lcdout $fe,$94 
    lcdout "*   VERI GELMEDI   *" 
    lcdout $fe,$d4 
    lcdout "********************" 
    return 

ekran1: 
    lcdout $fe,1 
    lcdout "4  SATIR LCD EKRANLA" 
    lcdout $fe,$c0 
    lcdout "YAZILIMSAL SERI PORT" 
    lcdout $fe,$94 
    lcdout "' NEDIM  KASIKIRIK '" 
    lcdout $fe,$d4 
    lcdout "  26 AĞUSTOS  2006  " 
    return 

ekran2: 
    lcdout $fe,1 
    lcdout "********************" 
    lcdout $fe,$c0 
    lcdout "*    ILETISIME     *" 
    lcdout $fe,$94 
    lcdout "*      HAZIR       *" 
    lcdout $fe,$d4 
    lcdout "********************" 
    return 

veriyaz: 
    lcdout $fe,1 
    lcdout "A:",#SERIGEL[0],"/",#SERIGEL[1],"/",#SERIGEL[2] 
    lcdout $fe,$c0 
    lcdout "B:",#SERIGEL[3],"/",#SERIGEL[4],"/",#SERIGEL[5] 
    lcdout $fe,$94 
    lcdout "C:",SERIGEL[0],"/",SERIGEL[1],"/",SERIGEL[2] 
    lcdout $fe,$d4 
    lcdout "D:",SERIGEL[3],"/",SERIGEL[4],"/",SERIGEL[5] 
    return