- 12V Akku mit 280 Ah bauen         
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

    LiFePo4 Akku selber bauen - Video
    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
    Milda
    Alter
    38
    Beiträge
    4.064
    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.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  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
  •  

fchao-Sinus-Wechselrichter AliExpress