Страница 19 из 25
Re: MPLAB в вопросах и ответах
Добавлено: Вс окт 08, 2017 08:25:19
uldemir
Да нет, это предупреждение должно возникать еще на уровне парсинга, а не кодогенерации. Вот сейчас я его подставлял в функцию, которая еще не используется - и получал предупреждения задолго до того, как получал предупреждение, что функция не используется и никакого кода для неё не сгенерено.
И собственно, уже понятно, что при выполнении c = (c << 1) - c преобразуется в int и выскакивает предупреждение. Устранить его можно кастингом, как в вами упомянутой теме и предложили: c = (unsigned char)(c << 1). Скорее вопрос, почему не выскакивает при (c <<= 1).
Re: MPLAB в вопросах и ответах
Добавлено: Вс окт 08, 2017 10:34:30
Siarzhuk
[uquote="uldemir",url="/forum/viewtopic.php?p=3200995#p3200995"]Скорее вопрос, почему не выскакивает при (c <<= 1).[/uquote]
Возможно потому, что compound операторы работают непосредственно с исходной переменной.
Re: MPLAB в вопросах и ответах
Добавлено: Пн окт 09, 2017 17:02:18
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.
Re: MPLAB в вопросах и ответах
Добавлено: Пн окт 09, 2017 17:51:08
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мкс
Re: MPLAB в вопросах и ответах
Добавлено: Вт окт 10, 2017 04:45:54
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 - если есть возможность - попробуйте в своем протеусе проверить.
Re: MPLAB в вопросах и ответах
Добавлено: Вт окт 10, 2017 05:24:11
Feklistov_as
Не совсем понял - в PIC16f676 временная настройка делается не в ADCON0, а в ADCON1 - 4, 5, 6 битом.
Я виноват, Вы правы.
Тогда, вроде все правильно сделали.
Конечно пробуйте в железе, там все по другому. Но и на Протеус ругаться не нужно. Я много раз на него грешил, но в итоге- каждый раз проблема была во мне!! Хотя откуда он взял ошибку с PIC12 - даже догадок нет.
Re: MPLAB в вопросах и ответах
Добавлено: Ср ноя 29, 2017 21:50:12
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) - тот даташит еще в старом стиле и там этот регистр есть.
Re: MPLAB в вопросах и ответах
Добавлено: Сб дек 02, 2017 08:02:12
BOB51
Теперь такие "нюенсы" с даташитами все чаще попадаться будут...
Приходится по несколько версий хранить (и не только для ПИКов, но и для остальных семейств...)

Re: MPLAB в вопросах и ответах
Добавлено: Сб дек 02, 2017 08:53:58
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
Но надо будет одним глазом поглядывать на адреса выделенные моей секции.
Re: MPLAB в вопросах и ответах
Добавлено: Сб дек 02, 2017 16:12:58
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
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
Сам проект прикладываю
Re: MPLAB в вопросах и ответах
Добавлено: Сб дек 02, 2017 16:49:13
uldemir
А при чём тут железячники? Ошибка типа софтверная. Уберите последний инклюд, думаю он и так из первого должен вызываться. А... похоже, компилятор не поддерживает ваш ПИК?
А что за компилятор вы пользуете? MPLAB - это IDE, а не компилятор.
Если PIC C18, то наоборот, первый инклюд выкиньте.
и нахрена вам в микроконтроллере argv argc? Как вы их передавать собираетесь? Если там поставить просто void, то может, и stdlib вам не нужен будет.
Добавлено after 29 minutes 3 seconds:
Аха, Всё же XC8. Ну, тогда все инклюды долой, делаем один #include <xc.h>
И не забываем, что надо еще конфигурационное слово сделать...
Ладно, подскажу: Window -> PIC Memory Views -> Configuraton bits. Там их устанавливаете и там же есть кнопка сгенерить. Сгенеренный текст копируете в исходник.
Re: MPLAB в вопросах и ответах
Добавлено: Вс дек 03, 2017 07:04:17
SpeedFighter
Спасибо, помогло.
Вопрос про MPLAB:
Как сделать поддержку русских комментариев?
Re: MPLAB в вопросах и ответах
Добавлено: Вс дек 03, 2017 07:16:48
КРАМ
Включив соответствующий код раскладки. Например:

Re: MPLAB в вопросах и ответах
Добавлено: Вс дек 03, 2017 10:58:21
Аlex
Кодировку можно выбрать какой-нибудь по-умолчанию во всех проектах :
Чтобы потом не мучиться каждый раз при выборе.
Re: MPLAB в вопросах и ответах
Добавлено: Вс янв 21, 2018 21:13:31
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 - пока не разбирался.
Re: MPLAB в вопросах и ответах
Добавлено: Ср мар 07, 2018 12:04:46
Albert_V
Вышла новая MPLAB X IDE v4.15 (добавили поддержку программирования Atmel-ов из IDE)
Не рекомендую её ставить.
Эта падла не сохраняет положение окон. Каждый раз, при запуске, приходилось открывать текст программы вручную.
"Откатился" на v4.10.
Re: MPLAB в вопросах и ответах
Добавлено: Ср мар 07, 2018 14:00:40
Родэрик
У меня на xp она вообще не запустилась. То есть 4.10 получается последняя версия с поддержкой xp.
Re: MPLAB в вопросах и ответах
Добавлено: Чт мар 29, 2018 00:26:30
БАТАРЕЙКУС
Доброе время суток уважаемые коты, только на днях порвал с виндус ХР, MPLAB 8.40 PROTEUS 7.7, и шагнул в мир виндус 7, PROTEUS 8, и MPLAB XC8, вот хотелось спросить, ссылки где можно скачать рабочий MPLAB XC8 и Си компилятор к нему с лекарствами, без лекарств то полно....?
заранее спасибо.
Re: MPLAB в вопросах и ответах
Добавлено: Чт мар 29, 2018 08:12:11
Feklistov_as
скачать рабочий MPLAB XC8 и Си компилятор к нему с лекарствами
А разве они не бесплатные?! Все на оффициальном сайте есть.
Или нужны с самый лучшей оптимизацией кода?
http://www.microchip.com/mplab/compilers
Re: MPLAB в вопросах и ответах
Добавлено: Сб мар 31, 2018 22:45:21
БАТАРЕЙКУС
Хорошо, установил всё бесплатное, но ужас..., не могу соединить MPLAB X и PROTEUS 8, более того MPLAB X не генерирует файл "cof" поэтому отладить программу в пошаговом режиме с PROTEUS 8 не получится, подскажите кто как это победил ?