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?
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?