-         

Ergebnis 1 bis 3 von 3

Thema: Bootloader macht Probleme

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168

    Bootloader macht Probleme

    Anzeige

    Hallo Leute,

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

    Das ist die Hauptdatei:
    Code:
    /**************************************************
    	-------->>>>> programm-doku siehe asm_main.s
    ***************************************************/
    
    #include <avr/io.h>
    
    
    int main(void)
    {
    	asm("rjmp asm_main");
    	return(0);
    }
    asm_main.s:
    Code:
    #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:
    Code:
    #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?

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    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.
    kleinschreibung ist cool!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Ich musste einfach lts und sts benutzen anstatt in und out ...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •