Sida 1 av 1

AT8051 och bootloader

Postat: 18 september 2007, 13:51:17
av Piratman
Om jag vill göra en bootlooader till 89C51, så behöver jag kunna dirigera om interrupt vektorn.

Jag måste använda interrupten både i bootloadern och i applikationsprogrammet.

Så när bootloadern skickar programexekveringen till applikationsprogrammet så ska interruptvektorn ställas om och för detta behövs lite assembler vad jag förstår.
Någon som sitter på en lösning?

Postat: 19 september 2007, 00:45:42
av macgyver
Så här kan man göra om man inte har externt exekverbart minne:

Kod: Markera allt

;en hårdvaruadresserad vector
int_vect1:
	push int_vect1_l	;
	push int_vect1_h	; Register i internminnet
	ret


;omdirigera vector till ny adress i dptr

set_vector:
	mov	int_vect1_l, dpl
	mov	int_vect1_h, dph
	ret	

Postat: 19 september 2007, 01:09:34
av Piratman
Tyvärr, blev jag inte så mycket klokare :(
Men det beror på att mina kunskaper om assembler är = 0

Jag har gjort C-kod för avkodning av hex-fil klar, som ska ligga som bootloadern.

Vad jag förstår måste jag peka om interruptvektorn till en plats där jag får plats att kontrollera on det ska diregeras till bootloadern eller till app.programmet.

Postat: 19 september 2007, 01:18:48
av Piratman
Detta är ett exempel jag har hittat men detta är väl ovillkorligt hopp??
Jag skulle vilja villkora detta.
Man kan använda bit:en PSW.1 som väljare PSW.1 = 0 boot, 1 app.prog.

Kod: Markera allt

ExInt0 EQU 02003h ; X0
T0Int EQU 0200Bh ; T0
ExInt1 EQU 02013h ; X1
T1Int EQU 0201Bh ; T1
SerInt EQU 02023h ; S0

ORG 0000h
LJMP Start ; start bootstrap

ORG 0003h
LJMP ExInt0 ; call ISR of X0
RETI

ORG 000Bh
LJMP T0Int ; call ISR of T0
RETI

ORG 0013h
LJMP ExInt1 ; call ISR of X1
RETI

ORG 001Bh
LJMP T1Int ; call ISR of T1
RETI

ORG 0023h
LJMP SerInt ; call ISR of S0
RETI


Postat: 19 september 2007, 01:55:30
av Piratman
STOR spåning:

Kan man göra på detta vis?

Kod: Markera allt

T0IntBoot  EQU 0010Bh ; T0 
T0IntApp   EQU 0300Bh ; T0 

ORG 000Bh 
JNB PSW.1, T0IntBoot ; call T0IntBoot if PSW.1=0  
LJMP T0IntApp 
RETI 

Troligen inte, jag ser 2 problem: dels ska JNB laddas med relativ adress (eller räknar kompilatorn om?)
och dels har jag bara 8 byte till nästa interrupt-adress.....

Någon som kan hjälpa min ur detta?