AT8051 och bootloader

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Piratman
Inlägg: 20
Blev medlem: 18 september 2007, 13:37:39
Ort: Ånge

AT8051 och bootloader

Inlägg 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?
macgyver
Inlägg: 321
Blev medlem: 8 juni 2005, 00:24:09
Ort: Göteborg
Kontakt:

Inlägg 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	
Piratman
Inlägg: 20
Blev medlem: 18 september 2007, 13:37:39
Ort: Ånge

Inlägg 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.
Piratman
Inlägg: 20
Blev medlem: 18 september 2007, 13:37:39
Ort: Ånge

Inlägg 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

Piratman
Inlägg: 20
Blev medlem: 18 september 2007, 13:37:39
Ort: Ånge

Inlägg 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?
Skriv svar