реклама на сайте
подробности

 
 
> PIC16, параллельный вызов функции из main() и обработчика прерываний не работ
Almaz1988
сообщение Feb 22 2013, 06:52
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602



Здравствуйте.
Пишу программу под PIC16f1825 в ( MPLAB X IDE v1.30 + HI-TECH PICC (v9.81) ).
Программа в общем виде состоит из двух блоков: главной функции main() и обработчика прерываний.
Так вот, столкнулся с такой проблемой, что не могу использовать функции параллельно в обоих блоках,
Функции эти:
Код
    itoa_al( char *buff, uint32_t data ); //саописный аналог функции sprintf() для преобразования числа в строку
    uartSendString( char *buff ); // функция отправки строки по uart


Т.е., если я в main() в бесонечном цикле преобразовываю любое число в строку и шлю его по uart'у, то в случае
определенного прерывания, вызывающего эти же две функции по uart'у отсылается не число а нули.

Если в main() эти две функции не использовать, то в обработчике прерывания они срабатывают нормально.

Код:
Код
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>

//.................

static void interrupt isr(void)
{
    //.......................
    itoa_al( buff, 34 );
    uartSendString( buff );
}

int main(int argc, char** argv)
{
    //.........................
    while(1)
    {
         delayMsTimer0( 2000 );
         itoa_al( buff, 34 );
         uartSendString( buff );
    }
}


В чем может быть проблема?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Almaz1988
сообщение Feb 22 2013, 10:16
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602



Цитата
Не совсем понял, почему, пользуясь HI-TECH PICC (v9.81), Вы цитируете ман HI-TECH C PRO for the PIC18.

В обоих мануалах относительно duplication function написано одно и тоже

Цитата
Согласно мана, именно так для "compiler-generated duplicate". Компилятор в ПРО режиме?

При установке HI-TECH крякнул его для работы в PRO-режиме, но в упор не вижу где поменять режим? Пока работаю в lite-режиме.
Вот что выдает компилятор при сборке проекта:
Цитата
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.83
Copyright © 2011 Microchip Technology Inc.
Serial number: HCPICP-654321 (PRO)



Цитата
Чесслово, ни разу не пользовался ни тем, ни другим. Для отладки и диагностики из прерываний можно придумать менее горбатые способы. А зачем ещё пихать в прерывания мелких пиков что-то printf- или xxxtoa-образное, мне не придумывается.

Да, пришло в голову более простое решение вопроса.

Цитата
ЗЫЖ чем "int main(int argc, char** argv)" лучше "void main(void)"?

Ничем)

Но хотелось бы запуститься в PRO-режиме, как переключать режимы ( установлен компиллятор в режиме PRO )?
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 22 2013, 10:56
Сообщение #3



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Almaz1988 @ Feb 22 2013, 14:16) *
При установке HI-TECH крякнул его для работы в PRO-режиме, но в упор не вижу где поменять режим? Пока работаю в lite-режиме.
Но хотелось бы запуститься в PRO-режиме, как переключать режимы ( установлен компиллятор в режиме PRO )?

В lite "compiler-generated duplicate" не работает.
За MPLabX не скажу (неповоротливый монстр, имхо; попробовал - не понравилось).
В обычном МПЛаб'е: Project -> Build options -> Project (или для файлов по отдельности) -> Compiler : Operation mode.
В комплекте с MPLabX идут все XC (-8, -16, -32). Развиваться будут только они. Вероятно, имеет смысл переключиться на них. (чтение на предмет совместимости приветствуется)
Цитата
Ничем)

picc при компиляции генерит startup.as. Т.к. в lite оптимизация почти отсутствует, то излишества от "int main(int argc, char** argv)" скорее всего останутся as is. Не проверял. Да и какой смысл лишний раз грузить компилятор ненужной работой и надеяться на разумность оптимизации?

UPD: Проверил. В startup.as argc и argv не попадают (что логично). В любом режиме компилятор резервирует по 2 байта под argc и argv (в сегменте COMMON), что опять же логично - как сказали, так и сделал. Мог бы ругнуться на отсутствие возвращаемого значения в функции, объявленной "int ()", но похоже, это он таки соптимизировал.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th August 2025 - 18:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016