Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > возврат из функции не по адресу в AVR studio (С)


Автор: kot34 23.10.2008, 15:08

Написал(1/2содрал) драйвер для управления жк знакосинтезирующим индикатором.
Оформил в виде програмки и тестирую.
МК - mega64
ЖК - 16100 (на hd44780(предположительно))
При отладке в АВстудии без подключения к МК программа работает без ошибок(не выдает).
При отладке с подключенным МК(JTAG интерфейс) -  отладчик возвращается из первой же функции(MainIni();) по ложному адресу(в Program counter адрес ~ 0x001000, а вызывалась функция с адреса ~ 0x0000b9)
Так происходит с любой первой функцией.
В чем может быть ошибка/проблема ?

Код

#include "defines.h"
#include <ctype.h>
#include <stdint.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd.h"

static void ioinit(void)
{
  lcd_init();
}

void MainIni(void) {
//регистрам присваиваю наччальные значения...
    // Input/Output Ports initialization
    // Timer/Counter initialization
    // External Interrupt(s) initialization
    // Timer(s)/Counter(s) Interrupt(s) initialization
    // Analog Comparator initialization
    // wdt initialization


}// <- после этой скобки в program 
 //       counter оказывается большой адрес

//FILE uart_str = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
FILE lcd_str = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE);

static void delay_1s(void)
{
  uint8_t i;

  for (i = 0; i < 100; i++){
asm("wdr");
    _delay_ms(1);
  }
}

int main(void)
{

  MainIni();

  uint8_t i;
  ioinit();

  stderr = &lcd_str;

  fprintf(stderr, "Hello world!\n");

  fprintf(stderr, "Bye-bye");
  delay_1s();
  for (i = 0; i < 3; i++)
    {
      putc('.', stderr);
      delay_1s();
    }
  fprintf(stderr, "\n ");

  return 0;
}



Автор: Mazzi 23.10.2008, 15:20
Указатель стека правильно настроен? 

Автор: kot34 23.10.2008, 16:20

Так и есть:

Код

+00000046:   2411        CLR     R1               Clear Register
+00000047:   BE1F        OUT     0x3F,R1          Out to I/O location
+00000048:   EFCF        SER     R28              Set Register
+00000049:   E1D0        LDI     R29,0x10         Load immediate
+0000004A:   BFDE        OUT     0x3E,R29         Out to I/O location
+0000004B:   BFCD        OUT     0x3D,R28  


avrstudio записывает в него 0x10ff 
- у mega64 это граница озу
=> дело не в SP ?

Автор: Mazzi 23.10.2008, 16:53
Запустив отладку перейди в окошко дизассемблированного кода и посмотри что выполняется сразу после ресета. 

В атмеге64 указатель стека располагается по адресам 

    0x3E (0x5E) SPH (Старший байт указателя)
    0x3D (0x5D) SPL (младший байт указателя)

Указатель следует настраивать на конечные адреса ОЗУ.

Автор: kot34 23.10.2008, 18:01
Попробовал задать другой адрес для указателя стека, и методом научного тыка выяснил программа работает при установки SP на адреса менее 0x1000
ммм... это здорово, но расходится с офф. версией границы озу smile

Автор: kot34 24.10.2008, 13:30
Дело было в том что стоял режим совместимости с ATmega103
- в нем нет памяти под доп регистры в/в => граница озу = 0х1000
тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)