PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bootloader macht Probleme



H3llGhost
23.02.2008, 17:36
Hallo Leute,

ich habe ein Problem mit meinem Bootloader, dieser soll für einen ATmega 168 geschrieben werden.

Das ist die Hauptdatei:


/**************************************************
-------->>>>> programm-doku siehe asm_main.s
************************************************** */

#include <avr/io.h>


int main(void)
{
asm("rjmp asm_main");
return(0);
}


asm_main.s:


#include <avr/io.h>
#include "def_asm.h"



.section .text
.global asm_main

asm_main:


;Baudrate 2400
ldi temp1,hi8(BAUDRATE)
out IO_REG(UBRR0H), temp1
ldi temp1,lo8(BAUDRATE)
out IO_REG(UBRR0L),temp1
ldi temp1, (1<<RXEN0) | (1<<TXEN0)
out IO_REG(UCSR0B), temp1


ldi temp1,hi8(BAUDRATE)
out IO_REG(UBRR0H), temp1
ldi temp1,lo8(BAUDRATE)
out IO_REG(UBRR0L),temp1
ldi temp1, (1<<RXEN0) | (1<<TXEN0)
out IO_REG(UCSR0B), temp1

init:

;Baudrate 2400
ldi temp1,hi8(BAUDRATE)
out IO_REG(UBRR0H), temp1
ldi temp1,lo8(BAUDRATE)
out IO_REG(UBRR0L),temp1
ldi temp1, (1<<RXEN0) | (1<<TXEN0)
out IO_REG(UCSR0B), temp1

;Timer 2 für IR-CLK
ldi temp1, (1<<WGM21) | (1<<COM2A0) // 36khz ir-clk mit timer2
out IO_REG(TCCR2A), temp1
ldi temp1, (1<<CS21)
out IO_REG(TCCR2B),temp1
ldi temp1, 0x22
out IO_REG(OCR2A), temp1

;Dioden Status-LED IR-LED Front-LED
ldi temp1, (1<<PB3) | (1<<PB0)
out DDRB, temp1 // ir-led-driver und status-led1
ldi temp1, (1<<PD2) // status-led2
out DDRD, temp1
ldi temp1, (1<<PD6)
out DDRD, temp1 // rote front-led für batterie

; batt test5 init

;ADC Enable und ADC Prescaler auf 128
ldi temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) // adc-clk = sys-clk/128
out IO_REG(ADCSRA), temp1
;Reference Spannung auf Interne 2,56 Volt setzen und ADC5 als Input pin
ldi temp1, (1<<REFS0) | (1<<REFS1) | (1<<MUX2) | (1<<MUX0);
out IO_REG(ADMUX), temp1

ret

rcall init // init com-port-verbindung mit 2400 baud
ldi ZL, lo8(wait_send); // startstring senden
ldi ZH, hi8(wait_send);
rcall com_put_string // startstring senden

main_loop:
;Batt test
sbi IO_REG(ADCSRA), ADSC
batt_loop:
sbic IO_REG(ADCSRA), ADSC
rjmp batt_loop
clc
in INT_REG_L, ADCL
in INT_REG_H, ADCH
subi INT_REG_L, lo8(BATT_MIN)
sbci INT_REG_H, hi8(BATT_MIN)
brcc batt_ok
// versorgungs-spannung zu gering
sbi IO_REG(PORTD), PD6
rjmp ende
batt_ok:

;schleifen kopf
LDI r19,255
verzoeg111:
LDI r18,255
verzoeg11:
LDI r17,255
verzoeg1:


// Was da ?
rcall wait_serial // warte auf ein zeichen vom com-port
cpi CHAR_GET_REG, STARTZEICHEN // war es das startzeichen?
breq start_rec // ja, dann startet die datenübertragung


;Schleifen Fuß
DEC r17
BRNE verzoeg1
DEC r18
BRNE verzoeg11
DEC r19
BRNE verzoeg111
rjmp start_prog

// Speichern
start_rec:
sbi IO_REG(PORTB), PB0 // led on IR-Diode
sbi IO_REG(PORTD), PD2 // led on Status
clr temp1
sts page_adr, temp1 // flash-page-adress mit 0 initialisieren
sts page_adr+1, temp1 // programm wird immer ab adresse 0 gespeichert

rcall flash_get // flashdaten einlesen

cbi IO_REG(PORTB), PB0 // led off
cbi IO_REG(PORTD), PD2 // led off
sbi IO_REG(PORTD), PD6 // led on
rcall wait_serial // wartezeit eine sekunde
cbi IO_REG(PORTD), PD6 // led off
ldi ZL, lo8(flash_ok); // startstring senden
ldi ZH, hi8(flash_ok);
rcall com_put_string // startstring senden


start_prog:
clr ZL // adresse 0 = reset vector
clr ZH
ijmp // indirect jump zum reset vector


*** END ***
ende:
rjmp ende


def_asm.h:



#define BIT(n) (1<<(n))
#define IO_REG(n) _SFR_IO_ADDR(n)

#define sbi(p,b) p|=(1<<(b))
#define cbi(p,b) p&=(~(1<<(b)))

/*************************
registerdefinitionen
**************************/
#define CHAR_GET_REG r24 // register für char-rückgabe
#define CHAR_PUT_REG r25 // register für char-übergabe
#define CHAR_RET_REG r24 // register für char-rückgabe

#define INT_REG_H r25 // register für int high byte
#define INT_REG_L r24 // register für int low byte

#define temp1 r16 // arbeitsregister
#define temp2 r17
#define temp3 r18
#define temp4 r19

#define STARTZEICHEN ':' // startzeichen für einen record
#define SEKUNDE 2 // für zeitschleife

#define MAXRECORDS 17 // wert für maximale anzahl daten im record

#define BATT_MIN 810 // minimalster batterie-wert ca. 4,5V
#define BAUDRATE 520 // UBRR Wert für Baudrate 2400


Wenn ich auf kompilieren gehe kommt folgende Message:
gcc plug-in: Error: Object file not found on expected location D:\Eigene Dateien\schule\elektro\Asuro\c-programme\bootloader\default\bootloader.elf

Und folgendes Buildprotokoll:


Build started 23.2.2008 at 17:35:14
avr-gcc.exe -mmcu=atmega168 -mmcu=atmega168 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT asm_main.o -MF dep/asm_main.o.d -x assembler-with-cpp -Wa,-gdwarf2 -c ../asm_main.s
../asm_main.s: Assembler messages:
../asm_main.s:14: Error: number must be less than 64
../asm_main.s:16: Error: number must be less than 64
../asm_main.s:18: Error: number must be less than 64
../asm_main.s:22: Error: number must be less than 64
../asm_main.s:24: Error: number must be less than 64
../asm_main.s:26: Error: number must be less than 64
../asm_main.s:33: Error: number must be less than 64
../asm_main.s:35: Error: number must be less than 64
../asm_main.s:37: Error: number must be less than 64
../asm_main.s:41: Error: number must be less than 64
../asm_main.s:43: Error: number must be less than 64
../asm_main.s:45: Error: number must be less than 64
../asm_main.s:59: Error: number must be less than 64
../asm_main.s:62: Error: number must be less than 64
../asm_main.s:112: Error: number must be less than 32
../asm_main.s:114: Error: number must be less than 32
../asm_main.s:117: Error: number must be less than 64
../asm_main.s:118: Error: number must be less than 64
../asm_main.s:177: Error: junk at end of line, first unrecognized character is `*'
make: *** [asm_main.o] Error 1
Build succeeded with 0 Warnings...


Ich habe keine Idee, was ich machen kann.
Habt ihr noch eine Idee?

damaltor
24.02.2008, 23:37
versuch mal das IO_REG() wegzulassen, eigentlich sollte der compiler es auch verstehen wenn du den namen des registers direkt hinschreibst... ich denke es hängt mit diesem makro IO_REG zusammen, denn scheinbar kommt der fehler immer in diesen zeilen wo es verwendet wird.

H3llGhost
25.02.2008, 16:19
Ich musste einfach lts und sts benutzen anstatt in und out ... ;)