Forum: Mikrocontroller und Digitale Elektronik IVEL bei mega32 lässt sich nicht setzen


von Neubi (Gast)


Lesenswert?

hi,

bin gerade dabei mir einen bootloader zu schreiben. ich möchte gerne 
einen timer+interrupt und eine uart+interrupt verwenden. dh die vectoren 
gehören im bootloader verbogen

-> leider wird immer wieder die vektortabelle auf adresse 0x0000 
verwendet, dh der simulator und emulator (mkii) stoppen beim breakpoint 
auf adresse 0x000E (ISR(TIMER1_COMPA_vect)


was mach ich falsch ... jemand einen tip?


danke,
neubi



Fuses:
1
OCDEN = [ ]
2
JTAGEN = [X]
3
SPIEN = [X]
4
CKOPT = [ ]
5
EESAVE = [ ]
6
BOOTSZ = 2048W_3800
7
BOOTRST = [X]
8
BODLEVEL = 2V7
9
BODEN = [ ]
10
SUT_CKSEL = EXTCLK_6CK_4MS
11
12
HIGH = 0x98 (valid)
13
LOW = 0xD0 (valid)

1
int main(void)
2
{
3
    SystemInit();
4
    ...
5
    return 1;
6
}
1
void SystemInit(void)
2
{
3
    volatile uint8_t temp;
4
5
    temp = GICR;
6
    GICR = temp | (1<<IVCE);
7
    GICR = temp | (1<<IVSEL);



Atmel Studio 6 (Version: 6.0.1996 - Service Pack 2)
© 2011 Atmel Corp.
All rights reserved.


OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1
Platform: Win32NT


Installed Packages: ARMGCC - 3.3.1.128
ARM Toolchain
Version: 4.7.0.59 - GCC  4.7.0
Package GUID: b55b919b-ef5f-4608-97eb-ddf473177814
Company: Atmel
HelpUrl:

CMSIS
Version: 2.10
Package GUID: b55b919b-ef5f-4608-97eb-ddf473177814
Company: Atmel
HelpUrl:



Installed Packages: Atmel Gallery - 1.2
Atmel Gallery
Version: 1.2
Package GUID: AtmelStudioExtensionManager
Company: Atmel


Installed Packages: Atmel Software Framework - 3.5.0.186
ASF
Version: 3.5.0
Package GUID: 519cc26f-02f6-4ace-8bf7-30c1cdea1f02
Company: Atmel
HelpUrl: http://asf.atmel.com/3.5.0

ASF
Version: 3.4.1
Package GUID: 519cc26f-02f6-4ace-8bf7-30c1cdea1f02
Company: Atmel
HelpUrl: http://asf.atmel.com/3.4.1

ASF
Version: 3.3.0
Package GUID: 519cc26f-02f6-4ace-8bf7-30c1cdea1f02
Company: Atmel
HelpUrl: http://asf.atmel.com/3.3.0

ASF
Version: 2.11.1
Package GUID: 519cc26f-02f6-4ace-8bf7-30c1cdea1f02
Company: Atmel
HelpUrl: http://asf.atmel.com/2.11.1



Installed Packages: AVRAssembler - 2.1.51.64
AVR Assembler
Version: 2.1.39.232
Package GUID: 4ef81ed0-2355-4ec8-98b8-f72b79ee5d72
Company: Atmel
HelpUrl:



Installed Packages: AVRGCC - 3.4.1.95
AVR Toolchain 8 Bit
Version: 3.4.1.830 - GCC  4.6.2
Package GUID: a3796ad3-98fe-4e60-bd15-57100d343560
Company: Atmel
HelpUrl:

AVR Toolchain 32 Bit
Version: 3.4.1.348 - GCC  4.4.3
Package GUID: a3796ad3-98fe-4e60-bd15-57100d343560
Company: Atmel
HelpUrl:



Installed Packages: Visual Assist X for Atmel Studio - 10.7.1904.0
Visual Assist X for Atmel Studio
Version: 10.7.1904.0
Package GUID: 7997A33C-B154-4b75-B2AC658CD58C9510
Company: Whole Tomato Software

von Georg G. (df2au)


Lesenswert?

Neubi schrieb:
> temp = GICR;
>     GICR = temp | (1<<IVCE);
>     GICR = temp | (1<<IVSEL);

und nun überleg noch einmal, welche Bits in GICR wirklich gesetzt 
werden.
(Ein Tipp: IVCE ist es nicht)

von Neubi (Gast)


Lesenswert?

hmmm ... zuerst IVCE und 4 taktzyklen später IVSEL ....oder nicht?

setzen will ich IVSEL, muss aber zuerst enablen!?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Datenblatt aufmachen, IVSEL suchen, fertigen C Code von Atmel finden

von Georg G. (df2au)


Lesenswert?

Neubi schrieb:
> zuerst IVCE und 4 taktzyklen später IVSEL

Laut Datenblatt maximal 3 Zyklen später (sagt zumindest das mir 
vorliegende Datenblatt). Und dazu noch die Randbedingung, dass IVCE beim 
zweiten Schreibvorgang auf 0 gesetzt werden soll.

Wie fritzler schrieb... im Datenblatt findet man den Code dafür.

von Neubi (Gast)


Lesenswert?

lt datenblatt
1
/* Enable change of interrupt vectors */
2
GICR = (1<<IVCE);
3
/* Move interrupts to boot Flash section */
4
GICR = (1<<IVSEL);


ich hätte mal gesagt mein code unterscheidet sich nicht von dem im 
datenblatt?! ... auch mit diesen 2 zeilen funktionierts irgendwie nicht!

hat noch jemand vielleicht auch einen !hilfreichen! tipp?



danke,
Neubi

von Neubi (Gast)


Lesenswert?

GELÖST ....

zum debuggen hab ich die optimierung auf null -O0 gesetzt/ausgeschalten. 
übers disassembly sieht man jedoch im code, dass das setzen des flags 
nicht innerhalb von 4 zyklen passiert

bei optimierung -O2 beschränkt sich das setzen der flags auf einen 
2zeiler und siehe da .... jetzt funktionierts :)


-> soviel zu den obergscheiten "Datenblatt aufmachen" und "Ein Tipp: 
IVCE ist es nicht" kommentaren ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.