Gast
#2416682
Abend,
sitze jetzt schon Tage an dem Bootloader aber leider will das alles
nicht so wie ich will ;).
Egal was ich auch tue ich hab das gefühl der Bootloader wird nicht nach
dem Reset gestartet und die Interrupts funktionieren auch nicht wie sie
sollen.
Fuses:
BootSZ auf 4096Words gestellt
laut Datenblatt beginnt mein Bootloader damit bei 0x7000h.
BootRST ist ein Haken drinne damit er auch mit dem Bootloader startet.
Compiler:
Optimization auf (-O0) gestellet also keine Optimierung
damit hier nix scheif läuft
Linker:
Folgende zusatz Argumente für den Linker
-Wl,--section-start=.text=0x7000
Hex File danach überprüft sieht gut aus. Auch ein Auslesen
des Controllers zeigt das alles richtig geflasht wurde.
Code:
#include <avr/io.h>
#include <stdbool.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//#include "bootloader.h"
//#include "uart.h"
#ifdef atmega644p
#endif
uint8_t wait;
uint8_t temp;
int main()
{
wait = 0;
/* Interrupt Vektoren verbiegen */
char sregtemp = SREG;
cli();
temp = MCUCR;
MCUCR = temp | (1<<IVCE);
MCUCR = temp | (1<<IVSEL);
SREG = sregtemp;
DDRB = 255;
PORTB = 255;
_delay_ms(1000);
PORTB = ~(1);
_delay_ms(1000);
TCCR0B |= (1<<CS00) | (1<<CS02);
TIMSK0 |= (1<<TOIE0);
sei();
_delay_ms(1000);
PORTB = ~(2);
while(1)
{
}
}
ISR(TIMER0_OVF_vect)
{
wait++;
PORTB = ~wait;
}
Kurzes Programm das einfach nur über ein Timer Interrupt ein paar Leds
blicken lassen soll.
Problem:
1)Die erste LED geht an sobald der Global Interrupt aktiviert wird und
der erste Interrupt kommt fängt das Programm von vorne an.
2)Flashe ich eine andere Aplikation auf Adresse 0 startet das Programm
immer von dieser. Egal was ich auch bei dem Fuse BOOTRST einstelle.
(Hab natürlich drauf geachtet das ich nicht den Flash lösche wenn ich
dsa 2 Programm rein flashe. Beim Auslesen aus dem Controller sieht man
auch schön beide Programme)
Anmerkung:
Flashe ich das ganze an Adresse 0 ohne die Interrupt Vektoren zu
verändern läuft alles wie es soll (war ja klar).
Jemand eine Idee?
Gruß
Daniel