[an error occurred while processing this directive]
правда я уже постил (много)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ы 13 мая 2005 г. 12:50
В ответ на: а что как не ее в бл пользовать? хочешь загрузчик на asm как пример дам?:) отправлено ы 13 мая 2005 г. 12:47

в связи с глючностью скрипта операция
сдвига мб похериться.
загрузчик работает по 1К-x modemy чтобы его вызвать
надо слать пробелы на ком при вкл питания



#include "iom128.h"
//MODULE BOOT


#define BlkCnt R3
#define SPMCSR_VAL R16
#define vRAMPZ R17
#define UpBlkNumH R9
#define UpBlkNumL R8


#define SREG_I 7
#define SREG_T 6
#define SREG_H 5
#define SREG_S 4
#define SREG_V 3
#define SREG_N 2
#define SREG_Z 1
#define SREG_C 0


RSEG boot_code:CODE


ORG $FE00*2

// ORG $0

CLI

ldi r19, 0x00
ldi r20, 0x80
ldi r21, 0x0F

LDI R16,$1
OUT SPH,R16
LDI R16,$80
OUT SPL,R16

LDI R16,(1< OUT UCSR0B,R16 // UCSR0B=(1< LDI R16,(1< STS UCSR0C,R16 // UCSR0C=(1< LDI R16,0
STS UBRR0H,R16
LDI R16,11
OUT UBRR0L,R16 // 38400

RCALL ChkAdr0On_FFFF // test for 0xFFFF at 0x0000
BREQ BadUserPrg

// start to check update

RCALL ChkUpdateR16
CPI R16,' '
BREQ Update
JMP 0

BadUserPrg:
RCALL OutBadAdr0Str

Update:
//----------------------

RCALL GetUserInput

CLR vRAMPZ
OUT RAMPZ,vRAMPZ
CLR UpBlkNumH
CLR UpBlkNumL

RCALL RxXmdm

RCALL PutResult

stop: RJMP stop

//************** put byte UART0
putch_r16_ascii:
PUSH R16
SWAP R16
RCALL _putch_r16_ascii
POP R16

_putch_r16_ascii:
ANDI R16,$0f
CPI R16,$0a
BRSH _outA_F
_out0_9: ORI R16,'0'
RJMP putch_r16
_outA_F: SUBI R16,($0a - 'A')

putch_r16: SBIS UCSR0A,UDRE0
RJMP putch_r16
OUT UDR0,R16
RET

getch_r16: SBIS UCSR0A,RXC0
RJMP getch_r16
IN R16,UDR0
RET


// USAGE:
// R0: c
// R1:R2: gcrc
#define nc R16
#define grcrh R1
#define grcrl R2

clear_crc: LDI R16,0
MOV grcrh,R16
MOV grcrl,R16
RET

update_crc:
//--------------------------------------------
// u16_t gcrc;
// updcrc(u8_t c) {
// int i;
// gcrc ^= (u16_t)(c << 8);
//
// for (i = 0; i <8; i++) {
// if (gcrc & 0x8000) {
// gcrc = (gcrc << 1) ^ 0x1021;
// } else {
// gcrc <<= 1;
// }
// }
// }
//--------------------------------------------
PUSH R16
PUSH R17
EOR grcrh,nc
LDI R16,8

_gcc: BCLR SREG_C
ROL grcrl
ROL grcrh
BRCC _ncb
//
LDI R17,$21
EOR grcrl,R17
LDI R17,$10
EOR grcrh,R17
//
_ncb: DEC R16
BRNE _gcc
POP R17
POP R16
RET

/* Control characters in x-modem protocol.*/
#define SOH 0x1
#define STX 0x2
#define EOT 0x4
#define ACK 0x6
#define NAK 0x15
#define CAN 0x18
#define CRC 0x43

/*
01 FE -data- --->
<---
02 FD -data- ---> (data gets line hit)
<---
02 FD -data- --->
<---
03 FC -data- --->
(ack gets garbaged) <---
times out after 10 seconds,
<---
03 FC -data- --->
<---
*/

#define bEOT 0
#define bOK 1
#define bBAD 2

GetXmdmLine:
RCALL getch_r16 //
CPI R16,EOT
BRNE _neot
CLR R16
SBR R16,(1< RET

_neot: CPI R16,STX
BRNE GetXmdmLine

GetXmdmFLine:
RCALL getch_r16 // 01
RCALL getch_r16 // FE

RCALL clear_crc

LDI XH,$4
LDI XL,$0 // X = $400

LDI YH,0
LDI YL,0

_gnxmb: RCALL getch_r16 // get byte
ST X+,R16 // store to SRAM
RCALL update_crc // check crc

// -----------------
ADIW YH:YL,1 // inc 1024 byte cnt
CPI YH,4
BRNE _gnxmb
// -----------------

RCALL getch_r16
MOV R3,R16
RCALL getch_r16
MOV R4,R16

CP R1,R3
BRNE _nack
CP R2,R4
BRNE _nack
CLR R16
SBR R16,(1< RET

_nack: CLR R16
SBR R16,(1< RET
//**************************************
ReqXmdm: PUSH R17
RqXmdm: LDI R16,CRC
RCALL putch_r16

LDI R17,8
CLR YH
CLR YL

_wSTX: SBIS UCSR0A,RXC0
RJMP _noSTX
IN R16,UDR0
CPI R16,STX
BRNE _noSTX
POP R17
RET

_noSTX: ADIW YH:YL,1
BRNE _wSTX
DEC R17
BRNE _wSTX
RJMP RqXmdm

//**************************************
RxXmdm: RCALL ReqXmdm
RCALL GetXmdmFLine
RJMP ChkLine

GetLine: RCALL GetXmdmLine
ChkLine:
SBRC R16,bEOT
RJMP _txEnd
SBRC R16,bBAD
BRNE _txNAK

//
RCALL Prg1024Bts
//

LDI R16,ACK
RCALL putch_r16
RJMP GetLine

_txNAK: LDI R16,NAK
RCALL putch_r16
RJMP GetLine

_txEnd: LDI R16,ACK
RCALL putch_r16
CLR R16
SBR R16,(1< RET

//**************************************
/*
X - Data to write in sram 0x400..0x800 = 1024 byte
Z - Pointer to flash

xxxx xxx - inside temp buffer
FEDC BA98 7654 3210
rmpz zzzz zzzz zzzz zzzz
*/
Prg1024Bts:
// at first cmp data to prg with data in flash
LDI XH,$4
LDI XL,$0 // X = $400

LDI R16,4
MOV BlkCnt,R16
// ---------------------------------------------
_StartCmpData:
// back up
MOVW R5:R4,XH:XL
MOVW R7:R6,ZH:ZL

EOR R2,R2 // cnt of 128 word = 256 bytes
_ncmp:
ELPM R0,Z+ // read flash byte
LD R1,X+ // read data byte
CP R0,R1 // cmp
BRNE _neqd //
INC R2
BRNE _ncmp
// ---------------------------------------------
// data block equal!

decBlkCnt: DEC BlkCnt
BRNE _StartCmpData

_wwwsb: LDS SPMCSR_VAL,SPMCSR
SBRS SPMCSR_VAL,RWWSB // If RWWSB is set, the RWW section is not ready yet
RJMP _exit

RCALL doRWWSE // re-enable the RWW section
RJMP _wwwsb

_exit: RET

// data not equal start to programm!
// restore ptrs
_neqd: MOVW XH:XL,R5:R4
MOVW ZH:ZL,R7:R6

// inc updated block
LDI R16,1
ADD UpBlkNumL,R16
LDI R16,0
ADC UpBlkNumH,R16

RCALL doRWWSE // re-enable the RWW section

////////
OUT RAMPZ,vRAMPZ

RCALL doPGERS // page erase

RCALL doRWWSE // re-enable the RWW section

// Load Temporary buffer
Wrloop: LD R0,X+ // Load R0:R1 pair
LD R1,X+ //
RCALL doPGLD
ADIW ZH:ZL,2
TST ZL // 80 pairs
BRNE Wrloop

DEC ZH // Point back to Page
RCALL doPGWR // Page write
INC ZH // Next Page

BRNE _ssrmpz
SBR vRAMPZ,1 // RAMPZ=1
_ssrmpz:

RCALL doRWWSE // re-enable the RWW section
RJMP decBlkCnt


//******************************************************
doPGLD: LDI SPMCSR_VAL,(1< RJMP _doSPM

doPGWR: LDI SPMCSR_VAL,(1< RJMP _doSPM

doPGERS: CLR ZL
LDI SPMCSR_VAL,(1< RJMP _doSPM

doRWWSE: LDI SPMCSR_VAL,(1< _doSPM: PUSH R17
STS SPMCSR,SPMCSR_VAL
SPM
_wmen: LDS R17,SPMCSR //Контроль окончания записи
SBRC R17,SPMEN
RJMP _wmen
POP R17
RET
//******************************************************
PutResult: SBRS R16,bEOT
RJMP up_error


up_ok: LDI ZH,HIGH(_updonestr)
LDI ZL,LOW (_updonestr)
RCALL OutStr
// Out UpBlkNumH:L

MOV R16,UpBlkNumH
RCALL putch_r16_ascii
MOV R16,UpBlkNumL
RJMP putch_r16_ascii


up_error: LDI ZH,HIGH(_uperrstr)
LDI ZL,LOW (_uperrstr)
RJMP OutStr
//******************************************************
GetUserInput:
// welcome message
LDI ZH,HIGH(PrgWlcom)
LDI ZL,LOW (PrgWlcom)
RCALL OutStr

_GetUserInput:
RCALL getch_r16
CPI R16,'1'
BRNE _t2

LDI ZH,HIGH(_umcystr)
LDI ZL,LOW (_umcystr)
RCALL OutStr

// MCU start at 0x0000
CLR ZH
CLR ZL
RET

_t2: CPI R16,'2'
BRNE _GetUserInput

LDI ZH,HIGH(_ufpgastr)
LDI ZL,LOW (_ufpgastr)
RCALL OutStr

// FPGA prg start at 0x2800 byte
LDI ZH,$28 // page 28
LDI ZL,$0
RET
//******************************************************
OutStr: PUSH R16
SBR vRAMPZ,1 // RAMPZ=1
OUT RAMPZ,vRAMPZ
_osb: ELPM R16,Z+
TST R16
BRNE _ostrb
POP R16
RET
_ostrb: RCALL putch_r16
RJMP _osb

//******************************************************
ChkAdr0On_FFFF:
CLR ZH
CLR ZL
LPM R0,Z+
LPM R1,Z
AND R0,R1
INC R0
RET

OutBadAdr0Str:
LDI ZH,HIGH(_adr0badstr)
LDI ZL,LOW (_adr0badstr)
RJMP OutStr


//******************************************************


ChkUpdateR16:
CLR YH
CLR YL
CLR R16
LDI R17,4

_wPRGS: SBIS UCSR0A,RXC0
RJMP _noPRGS
IN R16,UDR0
RET

_noPRGS: ADIW YH:YL,1
BRNE _wPRGS
DEC R17
BRNE _wPRGS
RET
//******************************************************
PrgWlcom: db "\n\r\n\rxxxxxx(c) Data Module\n\rSelect software update of:\n\r1) MCU\n\r2) FPGA\n\r>:"
_umcystr: db "\n\rUpdate MCU:\n\rWait file by 1K-Xmodem..."
_ufpgastr: db "\n\rUpdate FPGA:\n\rWait file by 1K-Xmodem..."
_updonestr: db "\n\rUpdate Done! nblk=0x"
_uperrstr: db "\n\rUpdate Error!"
_adr0badstr: db "\n\rProgram maybe corrupted!"

END


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru