Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> возврат из функции не по адресу в AVR studio (С) 
V
    Опции темы
kot34
Дата 23.10.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 23.10.2008

Репутация: нет
Всего: нет




Написал(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;
}



PM MAIL   Вверх
Mazzi
Дата 23.10.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Указатель стека правильно настроен? 


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
kot34
Дата 23.10.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 23.10.2008

Репутация: нет
Всего: нет




Так и есть:

Код

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

Это сообщение отредактировал(а) kot34 - 23.10.2008, 17:27
PM MAIL   Вверх
Mazzi
Дата 23.10.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Запустив отладку перейди в окошко дизассемблированного кода и посмотри что выполняется сразу после ресета. 

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

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

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


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
kot34
Дата 23.10.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



Попробовал задать другой адрес для указателя стека, и методом научного тыка выяснил программа работает при установки SP на адреса менее 0x1000
ммм... это здорово, но расходится с офф. версией границы озу smile
PM MAIL   Вверх
kot34
Дата 24.10.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



Дело было в том что стоял режим совместимости с ATmega103
- в нем нет памяти под доп регистры в/в => граница озу = 0х1000
тема закрыта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0853 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.