MPLAB в вопросах и ответах

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Да нет, это предупреждение должно возникать еще на уровне парсинга, а не кодогенерации. Вот сейчас я его подставлял в функцию, которая еще не используется - и получал предупреждения задолго до того, как получал предупреждение, что функция не используется и никакого кода для неё не сгенерено.

И собственно, уже понятно, что при выполнении c = (c << 1) - c преобразуется в int и выскакивает предупреждение. Устранить его можно кастингом, как в вами упомянутой теме и предложили: c = (unsigned char)(c << 1). Скорее вопрос, почему не выскакивает при (c <<= 1).
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="uldemir",url="/forum/viewtopic.php?p=3200995#p3200995"]Скорее вопрос, почему не выскакивает при (c <<= 1).[/uquote]
Возможно потому, что compound операторы работают непосредственно с исходной переменной.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Встал на лапы
Сообщения: 105
Зарегистрирован: Чт фев 11, 2016 16:59:20
Откуда: Иркутск

Сообщение profradio »

Хотел бы спросить еще непонятку (хоть к данной теме относится косвенно, но все же рискну спросить сдесь) - домучал код до двухканального вольтметра (во вложении). При проверке в протеусе - протеус работает, все показывает но выводит восклицательный знак с ошибкой:
[PIC12 ADC] PC=0x02EA. ADC conversion clock period (5e-07) is possibly invalid for device clock frequency. [U1]
Ошибка исчезает, если выставить в протеусе частоту м/к 1.25МГц и ниже. (А мне надо 4МГц) - Вопрос - что сделать, чтобы не было этой ошибки? Все значения делителя от 2-х до 64 и внутренн генерат 500КГц A/D Clock Source (TAD) я перепробовал, значение задержки после включения АЦП пробовал от 10 до 1000 мкс.
Может быть это фишка протеуса? Он на мой м/к pic 16f676 пишет PIC12.
Вложения
vm_lcd.zip
Файл протеуса
(7.25 КБ) 325 скачиваний
vm_lcd.c
Файл си
(5.46 КБ) 689 скачиваний
Открыл глаза
Аватара пользователя
Сообщения: 41
Зарегистрирован: Сб фев 13, 2016 21:58:21
Откуда: Волгоград

Сообщение Feklistov_as »

[PIC12 ADC] PC=0x02EA. ADC conversion clock period (5e-07) is possibly invalid for device clock frequency. [U1]
Я не знаю СИ. В программе не увидел настройки регистра ADCON0, а точнее битов 7-6, которые выбираются в зависимости от тактовой частоты. Для этого нужно обратится к таблице 11-1:
Изображение

И прочитать раздел 11.1, или просто поставить задержку в 20мкс
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 105
Зарегистрирован: Чт фев 11, 2016 16:59:20
Откуда: Иркутск

Сообщение profradio »

Не совсем понял - в PIC16f676 временная настройка делается не в ADCON0, а в ADCON1 - 4, 5, 6 битом.
6, 7 бит ADCON0 отвечают за:
7: Формат сохранения 10-разрядного результата
1=правое выравнивание
0=левое выравнивание
6: Выбор источника опорного напряжения
1=вывод VREF
0=напряжение питания VDD
Я пользовался вот этой таблицей:
Изображение
Для 4МГц время должно быть 2 или 4 мкс, а делитель соответственно на 8 или на 16 - код 001 или 101 - я перепробовал все 7 вариантов из таблицы - все та же ошибка.
Про время задержки я писал - перепробовал от 10 до 1000мкс - ошибка не уходит. Видимо дело в протеусе - попробую в железе.
Файл прошивки hex во вложении.
В коде настройки регистров такие:
ADCON0 = 0b11000001;
ADCON1 = 0b01010000;
У меня версия протеуса 8.5 SP0 professional - если есть возможность - попробуйте в своем протеусе проверить.
Вложения
vm_lcd.X.production.hex
Файл прошивки мк hex
(3.68 КБ) 702 скачивания
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 41
Зарегистрирован: Сб фев 13, 2016 21:58:21
Откуда: Волгоград

Сообщение Feklistov_as »

Не совсем понял - в PIC16f676 временная настройка делается не в ADCON0, а в ADCON1 - 4, 5, 6 битом.
Я виноват, Вы правы.
Тогда, вроде все правильно сделали.
Конечно пробуйте в железе, там все по другому. Но и на Протеус ругаться не нужно. Я много раз на него грешил, но в итоге- каждый раз проблема была во мне!! Хотя откуда он взял ошибку с PIC12 - даже догадок нет.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Подскажите, какие параметры надо указать в PSECT, чтобы переменные _error и _next_correction легли в один банк с остальными переменными (конкретно _correction, так как в конце в зависимости от старшего бита _correction мне надо увеличить или уменьшить _next_correction). Сейчас, судя по дизассемблеру они находятся в самом начале ОЗУ 0 и 1 адрес в нулевом банке
Спойлер

Код: Выделить всё

#include "xc.inc"
    GLOBAL    _unixtime, _flag, _correction
seconds  EQU    0
WINDOW_SIZE EQU    6750
    PSECT data, CLASS=COMRAM
_next_correction: DS    1
_error:          DS    2
 
 ; This is the high priority interrupt handler. It is placed at address 8.
    PSECT intcode,class=CODE,reloc=2
    GOTO    HI_ISR_ROUT

    PSECT isr_routine,class=CODE,reloc=2
HI_ISR_ROUT:
    BANKSEL PIE4
    BTFSC   TMR1IE
    BTFSS   TMR1IF
    BRA        INTEXIT
    BANKSEL _next_correction
    MOVF    _next_correction, W
    BANKSEL  PIR4
    ADDWF   c:TMR1H
    BCF        c:TMR1IF
    
    MOVLW   1
    BANKSEL _unixtime
    ADDWF   _unixtime+0, F
    MOVLW   0
    ADDWFC  _unixtime+1, F
    ADDWFC  _unixtime+2, F
    ADDWFC  _unixtime+3, F
    BSF        _flag, seconds
    
; а теперь Брезенхем
    BANKSEL _correction
    MOVF    _correction, W
    BTFSS   _correction, 7    ; проверяем знак коррекции
    GOTO    positive
    COMF    _correction, W
    ADDLW   1

positive:
    BANKSEL _error
    ADDWF   _error, F
    MOVLW   0
    ADDWFC  _error+1, F
    MOVLW   0x80
    BANKSEL _next_correction
    MOVWF   _next_correction

    BANKSEL _error
    MOVLW   low(WINDOW_SIZE)
    SUBWF   _error, W
    
    MOVLW   high(WINDOW_SIZE)
    SUBWFB  _error+1, W
    
    BTFSS   c:CARRY  ;skip if error >= 6750
    GOTO    INTEXIT      ;goto if error <  6750
    
    MOVLW   low(WINDOW_SIZE)
    SUBWF   _error, F
    MOVLW   high(WINDOW_SIZE)
    SUBWFB  _error+1, F
    
    BANKSEL _correction
    BTFSS   _correction, 7
    INCF    _next_correction
    BTFSC   _correction, 7
    DECF    _next_correction
    
    
INTEXIT:
    RETFIE  F
    END
Распределение памяти выглядит так, но я в дизассемблере вижу, что _next_correction берётся с нулевого адреса, а _error накладывается на _unixtime по адресу 1 и 2.

Код: Выделить всё

Psect Usage Map:

 Psect      | Contents                   | Memory Range      | Size
------------|----------------------------|-------------------|------------
 reset_vec  |                            | 000000h - 000003h |  4 bytes  
 intcode    | Interrupt service routine  | 000008h - 00000Bh |  4 bytes  
 init       | Initialization code        | 00000Ch - 00000Fh |  4 bytes  
 isr_routin |                            | 000010h - 00006Bh | 92 bytes  
 text0      | Program and library code   | 00006Ch - 0000C5h | 90 bytes  
 cinit      |                            | 0000C6h - 0000D7h | 18 bytes  
------------|----------------------------|-------------------|------------
 bssCOMRAM  |                            | 000001h - 000007h |  7 bytes  
------------|----------------------------|-------------------|------------
 config     | Device configuration words | 300000h - 30000Bh | 12 bytes  
------------|----------------------------|-------------------|------------
 idloc      | User ID registers          | 200000h - 20000Fh | 16 bytes  
------------|----------------------------|-------------------|------------
Чёрт... убил целый час в поисках что такое регистр CCPTMRS в pic18f25k40. Упоминание есть, описания - нет. Посмотрел в хидерах XC8 - есть. Даже адрес есть. Ищу по адресу в дашите - Reserved. Гуглопоиск - ничего. Эррата - ничего. Потом в поиске наткнулся на предыдущую версию (40001843c.pdf против 40001843d.pdf) - тот даташит еще в старом стиле и там этот регистр есть.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Друг Кота
Аватара пользователя
Сообщения: 15607
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Теперь такие "нюенсы" с даташитами все чаще попадаться будут...
Приходится по несколько версий хранить (и не только для ПИКов, но и для остальных семейств...)
:(
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

а, кажется, разобрался. не хватало поля space=1. А если я размещаю в секции COMRAM - оно точно будет до 0x5F адреса? и можно ли тогда до неё добраться через ACCESS?

Похоже, что так и есть:
COMRAM — consists of a single memory range that covers the common (unbanked) RAM, if present, for all PIC18 devices
Но надо будет одним глазом поглядывать на адреса выделенные моей секции.
Последний раз редактировалось uldemir Сб дек 02, 2017 19:58:32, всего редактировалось 1 раз.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

Сообщение SpeedFighter »

Железячники, выручайте, написал простенькую программку для МК PIC18F1230 в MPLAB X 4.05. Программка должна на выходе давать случайную импульсную последовательность. За крутоть кода не поясню, я новичек в программировании МК и мог выпустить т.н. быдло-код.

Вот код:
Спойлер

Код: Выделить всё

#include <pic.h>  // Библитека пичков
#include <stdio.h>
#include <stdlib.h>
#include <pic18f1230.h> // Библиотека конкретного пичка

#define SIGNAL 30 // Длительность сигнала в мкс
#define DELMIN 100 // Минимальное время задержки в мкс
#define DELMAX 400000 // Максимальное время задержки в мкс


void delay(int type); // Функция задержки 
void Prepare(void); // Функция подготовки МК

int main(int argc, char** argv)
{
    Prepare(); // Запуск подготовки МК
    while(1) // Бесконечный цикл, основная задача МК
    {
        delay(0); // Задержка межуд сигналами
        TRISB = 0b00010000; // Подаем на выход лог. единицу
        delay(1); // Длительность сигнала
        TRISB = 0b00000000; // Выставляем лог. ноль        
    }
    return (EXIT_SUCCESS);    
}

void delay(int type) // Функция задержки
{
    int N; // Локальная переменная для промежуточных присвоений
    if(type == 0)
    {
        N = DELMIN + rand() % DELMAX; // Формируем случайную задержку
    }
    else
    {
        N = SIGNAL; // Определяем длительность сигнала
    }
    
    for(int i = 0; i <= N; i++) {} // Держим заданный лог. уровень
}

// Подготовка МК
void Prepare(void)
{
    TRISA = 0b00000000; // Направление работы ножек порта А
    TRISB = 0b00010000; // Направление работы ножек порта В
    CMCON = 0x07; // Отключение компараторов
    PORTA = 0; // Очищаем порт А
    PORTB = 0; // Очищаем порт Б
    RBPU = 0;  // Подтягивающие R (0-вкл, 1-выкл)
}

Ошибки и предупреждения:
СпойлерE:\Development environment\MPLABX\Compiler\include\pic_chip_select.h:3588: error: (103) #error: Device-specific header could not be found for target chip
E:\Development environment\MPLABX\Compiler\include\pic.h:25: warning: (111) redefining preprocessor macro "CLRWDT" (E:\Development environment\MPLABX\Compiler\include\pic18.h: 39)
E:\Development environment\MPLABX\Compiler\include\pic.h:26: warning: (111) redefining preprocessor macro "SLEEP" (E:\Development environment\MPLABX\Compiler\include\pic18.h: 47)
E:\Development environment\MPLABX\Compiler\include\pic.h:42: warning: (111) redefining preprocessor macro "__CONFIG" (E:\Development environment\MPLABX\Compiler\include\pic18.h: 53)
E:\Development environment\MPLABX\Compiler\include\pic.h:45: warning: (111) redefining preprocessor macro "__IDLOC" (E:\Development environment\MPLABX\Compiler\include\pic18.h: 57)
E:\Development environment\MPLABX\Compiler\include\pic.h:50: warning: (111) redefining preprocessor macro "__PROG_CONFIG" (E:\Development environment\MPLABX\Compiler\include\pic18.h: 50)
(908) exit status = 1
Сам проект прикладываю
Вложения
Programm.X.rar
Файл проекта
(33.9 КБ) 320 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

А при чём тут железячники? Ошибка типа софтверная. Уберите последний инклюд, думаю он и так из первого должен вызываться. А... похоже, компилятор не поддерживает ваш ПИК?
А что за компилятор вы пользуете? MPLAB - это IDE, а не компилятор.
Если PIC C18, то наоборот, первый инклюд выкиньте.

и нахрена вам в микроконтроллере argv argc? Как вы их передавать собираетесь? Если там поставить просто void, то может, и stdlib вам не нужен будет.

Добавлено after 29 minutes 3 seconds:
Аха, Всё же XC8. Ну, тогда все инклюды долой, делаем один #include <xc.h>
И не забываем, что надо еще конфигурационное слово сделать...
Ладно, подскажу: Window -> PIC Memory Views -> Configuraton bits. Там их устанавливаете и там же есть кнопка сгенерить. Сгенеренный текст копируете в исходник.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

Сообщение SpeedFighter »

Спасибо, помогло.

Вопрос про MPLAB:

Как сделать поддержку русских комментариев?
Друг Кота
Аватара пользователя
Сообщения: 25406
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Включив соответствующий код раскладки. Например:
Изображение
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Кодировку можно выбрать какой-нибудь по-умолчанию во всех проектах :
Изображение
2017-12-03_11-57-25.png
(68.96 КБ) 1557 скачиваний
Чтобы потом не мучиться каждый раз при выборе.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Меня сегодня прозрело немного по поводу "implicit signed to unsigned conversion" при выполнении сдвигов. Надо мне обрабатывать отдельно младший и старший ниббл. Ну, скажем из БКД получить двоичное. Надо старший ниббл умножить на 10 и прибавить младший. С младшим проблем нет: temp & 0x0Fu - и все дела. А вот со старшим есть нюанс: (temp >> 4) * 10 - даёт предупреждение, ((temp>>4) & 0x0Fu) * 10 - даёт предупреждение, а вот ((temp & 0xF0u) >> 4) * 10 - отрабатывает чисто. Правда, это в случае, если переменная temp имеет тип unsigned char. Что будет с unsigned int - пока не разбирался.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

Вышла новая MPLAB X IDE v4.15 (добавили поддержку программирования Atmel-ов из IDE) :kill:
Не рекомендую её ставить.
Эта падла не сохраняет положение окон. Каждый раз, при запуске, приходилось открывать текст программы вручную. :kill:
"Откатился" на v4.10.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

У меня на xp она вообще не запустилась. То есть 4.10 получается последняя версия с поддержкой xp.
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 347
Зарегистрирован: Сб фев 07, 2009 19:21:25

Сообщение БАТАРЕЙКУС »

Доброе время суток уважаемые коты, только на днях порвал с виндус ХР, MPLAB 8.40 PROTEUS 7.7, и шагнул в мир виндус 7, PROTEUS 8, и MPLAB XC8, вот хотелось спросить, ссылки где можно скачать рабочий MPLAB XC8 и Си компилятор к нему с лекарствами, без лекарств то полно....?
заранее спасибо.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Открыл глаза
Аватара пользователя
Сообщения: 41
Зарегистрирован: Сб фев 13, 2016 21:58:21
Откуда: Волгоград

Сообщение Feklistov_as »

скачать рабочий MPLAB XC8 и Си компилятор к нему с лекарствами
А разве они не бесплатные?! Все на оффициальном сайте есть.
Или нужны с самый лучшей оптимизацией кода?
http://www.microchip.com/mplab/compilers
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 347
Зарегистрирован: Сб фев 07, 2009 19:21:25

Сообщение БАТАРЕЙКУС »

Хорошо, установил всё бесплатное, но ужас..., не могу соединить MPLAB X и PROTEUS 8, более того MPLAB X не генерирует файл "cof" поэтому отладить программу в пошаговом режиме с PROTEUS 8 не получится, подскажите кто как это победил ?
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Ответить

Вернуться в «PIC»