mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bootloader für den ATmega 168 macht Probleme


Autor: H3ll Ghost (h3llghost)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.e 
lf

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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, man kann Punkt 5 der Regeln ignorieren, muß sich dann aber nicht 
über das Resultat wundern.

Und eine Hauptdatei gibt es nicht, es gibt nur einen kompletten 
Dateianhang.

Wie soll denn jemand die Fehlermeldungen dem Codeschnipsel zuordnen?


Ich vermute mal, Du verwendest IN/OUT auf Adressen, die außerhalb des 
erlaubten Bereichs sind. Dann muß man LDS/STS nehmen.


Peter

Autor: H3ll Ghost (h3llghost)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal für deine Hilfe!

Aber ich habe nun ein anderes Problem ...
Ich kann meinen selbst geschrieben Bootloader einfach nicht starten bzw. 
er wird nicht gestartet.

Meine Fuse-Bits sind wie folgt:

http://palmavr.sourceforge.net/cgi-bin/fc.cgi?P_PR...

Den Bootloader habe ich als Anhang angefügt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.