MPLAB в вопросах и ответах
Re: MPLAB в вопросах и ответах
Да нет, это предупреждение должно возникать еще на уровне парсинга, а не кодогенерации. Вот сейчас я его подставлял в функцию, которая еще не используется - и получал предупреждения задолго до того, как получал предупреждение, что функция не используется и никакого кода для неё не сгенерено.
И собственно, уже понятно, что при выполнении c = (c << 1) - c преобразуется в int и выскакивает предупреждение. Устранить его можно кастингом, как в вами упомянутой теме и предложили: c = (unsigned char)(c << 1). Скорее вопрос, почему не выскакивает при (c <<= 1).
И собственно, уже понятно, что при выполнении c = (c << 1) - c преобразуется в int и выскакивает предупреждение. Устранить его можно кастингом, как в вами упомянутой теме и предложили: c = (unsigned char)(c << 1). Скорее вопрос, почему не выскакивает при (c <<= 1).
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: MPLAB в вопросах и ответах
[uquote="uldemir",url="/forum/viewtopic.php?p=3200995#p3200995"]Скорее вопрос, почему не выскакивает при (c <<= 1).[/uquote]
Возможно потому, что compound операторы работают непосредственно с исходной переменной.
Возможно потому, что compound операторы работают непосредственно с исходной переменной.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
Re: MPLAB в вопросах и ответах
Хотел бы спросить еще непонятку (хоть к данной теме относится косвенно, но все же рискну спросить сдесь) - домучал код до двухканального вольтметра (во вложении). При проверке в протеусе - протеус работает, все показывает но выводит восклицательный знак с ошибкой:
[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.
[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 КБ) 321 скачивание
-
- vm_lcd.c
- Файл си
- (5.46 КБ) 686 скачиваний
- Feklistov_as
- Открыл глаза
- Сообщения: 41
- Зарегистрирован: Сб фев 13, 2016 21:58:21
- Откуда: Волгоград
Re: MPLAB в вопросах и ответах
[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 в вопросах и ответах
Не совсем понял - в 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 - если есть возможность - попробуйте в своем протеусе проверить.
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 КБ) 699 скачиваний
- Feklistov_as
- Открыл глаза
- Сообщения: 41
- Зарегистрирован: Сб фев 13, 2016 21:58:21
- Откуда: Волгоград
Re: MPLAB в вопросах и ответах
Не совсем понял - в PIC16f676 временная настройка делается не в ADCON0, а в ADCON1 - 4, 5, 6 битом.
Я виноват, Вы правы.
Тогда, вроде все правильно сделали.
Конечно пробуйте в железе, там все по другому. Но и на Протеус ругаться не нужно. Я много раз на него грешил, но в итоге- каждый раз проблема была во мне!! Хотя откуда он взял ошибку с PIC12 - даже догадок нет.
Re: MPLAB в вопросах и ответах
Подскажите, какие параметры надо указать в PSECT, чтобы переменные _error и _next_correction легли в один банк с остальными переменными (конкретно _correction, так как в конце в зависимости от старшего бита _correction мне надо увеличить или уменьшить _next_correction). Сейчас, судя по дизассемблеру они находятся в самом начале ОЗУ 0 и 1 адрес в нулевом банке
Распределение памяти выглядит так, но я в дизассемблере вижу, что _next_correction берётся с нулевого адреса, а _error накладывается на _unixtime по адресу 1 и 2.
Чёрт... убил целый час в поисках что такое регистр CCPTMRS в pic18f25k40. Упоминание есть, описания - нет. Посмотрел в хидерах XC8 - есть. Даже адрес есть. Ищу по адресу в дашите - Reserved. Гуглопоиск - ничего. Эррата - ничего. Потом в поиске наткнулся на предыдущую версию (40001843c.pdf против 40001843d.pdf) - тот даташит еще в старом стиле и там этот регистр есть.
Спойлер
Код: Выделить всё
#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 в вопросах и ответах
Теперь такие "нюенсы" с даташитами все чаще попадаться будут...
Приходится по несколько версий хранить (и не только для ПИКов, но и для остальных семейств...)

Приходится по несколько версий хранить (и не только для ПИКов, но и для остальных семейств...)
Re: MPLAB в вопросах и ответах
а, кажется, разобрался. не хватало поля 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 раз.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
Re: MPLAB в вопросах и ответах
Железячники, выручайте, написал простенькую программку для МК PIC18F1230 в MPLAB X 4.05. Программка должна на выходе давать случайную импульсную последовательность. За крутоть кода не поясню, я новичек в программировании МК и мог выпустить т.н. быдло-код.
Вот код:
Ошибки и предупреждения:
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
Сам проект прикладываю
Вот код:
Спойлер
Код: Выделить всё
#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 chipE:\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 КБ) 317 скачиваний
Re: MPLAB в вопросах и ответах
А при чём тут железячники? Ошибка типа софтверная. Уберите последний инклюд, думаю он и так из первого должен вызываться. А... похоже, компилятор не поддерживает ваш ПИК?
А что за компилятор вы пользуете? MPLAB - это IDE, а не компилятор.
Если PIC C18, то наоборот, первый инклюд выкиньте.
и нахрена вам в микроконтроллере argv argc? Как вы их передавать собираетесь? Если там поставить просто void, то может, и stdlib вам не нужен будет.
Добавлено after 29 minutes 3 seconds:
Аха, Всё же XC8. Ну, тогда все инклюды долой, делаем один #include <xc.h>
И не забываем, что надо еще конфигурационное слово сделать...
Ладно, подскажу: Window -> PIC Memory Views -> Configuraton bits. Там их устанавливаете и там же есть кнопка сгенерить. Сгенеренный текст копируете в исходник.
А что за компилятор вы пользуете? MPLAB - это IDE, а не компилятор.
Если PIC C18, то наоборот, первый инклюд выкиньте.
и нахрена вам в микроконтроллере argv argc? Как вы их передавать собираетесь? Если там поставить просто void, то может, и stdlib вам не нужен будет.
Добавлено after 29 minutes 3 seconds:
Аха, Всё же XC8. Ну, тогда все инклюды долой, делаем один #include <xc.h>
И не забываем, что надо еще конфигурационное слово сделать...
Ладно, подскажу: Window -> PIC Memory Views -> Configuraton bits. Там их устанавливаете и там же есть кнопка сгенерить. Сгенеренный текст копируете в исходник.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
Re: MPLAB в вопросах и ответах
Спасибо, помогло.
Вопрос про MPLAB:
Как сделать поддержку русских комментариев?
Вопрос про MPLAB:
Как сделать поддержку русских комментариев?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: MPLAB в вопросах и ответах
Кодировку можно выбрать какой-нибудь по-умолчанию во всех проектах :

Чтобы потом не мучиться каждый раз при выборе.
Чтобы потом не мучиться каждый раз при выборе.
Re: MPLAB в вопросах и ответах
Меня сегодня прозрело немного по поводу "implicit signed to unsigned conversion" при выполнении сдвигов. Надо мне обрабатывать отдельно младший и старший ниббл. Ну, скажем из БКД получить двоичное. Надо старший ниббл умножить на 10 и прибавить младший. С младшим проблем нет: temp & 0x0Fu - и все дела. А вот со старшим есть нюанс: (temp >> 4) * 10 - даёт предупреждение, ((temp>>4) & 0x0Fu) * 10 - даёт предупреждение, а вот ((temp & 0xF0u) >> 4) * 10 - отрабатывает чисто. Правда, это в случае, если переменная temp имеет тип unsigned char. Что будет с unsigned int - пока не разбирался.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: MPLAB в вопросах и ответах
Вышла новая MPLAB X IDE v4.15 (добавили поддержку программирования Atmel-ов из IDE)
Не рекомендую её ставить.
Эта падла не сохраняет положение окон. Каждый раз, при запуске, приходилось открывать текст программы вручную.
"Откатился" на v4.10.
Не рекомендую её ставить.
Эта падла не сохраняет положение окон. Каждый раз, при запуске, приходилось открывать текст программы вручную.
"Откатился" на v4.10.
- Родэрик
- Нашел транзистор. Понюхал.
- Сообщения: 162
- Зарегистрирован: Чт ноя 26, 2015 23:22:35
- Откуда: не с Уфы
- Контактная информация:
Re: MPLAB в вопросах и ответах
У меня на xp она вообще не запустилась. То есть 4.10 получается последняя версия с поддержкой xp.
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: MPLAB в вопросах и ответах
Доброе время суток уважаемые коты, только на днях порвал с виндус ХР, MPLAB 8.40 PROTEUS 7.7, и шагнул в мир виндус 7, PROTEUS 8, и MPLAB XC8, вот хотелось спросить, ссылки где можно скачать рабочий MPLAB XC8 и Си компилятор к нему с лекарствами, без лекарств то полно....?
заранее спасибо.
заранее спасибо.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
- Feklistov_as
- Открыл глаза
- Сообщения: 41
- Зарегистрирован: Сб фев 13, 2016 21:58:21
- Откуда: Волгоград
Re: MPLAB в вопросах и ответах
скачать рабочий MPLAB XC8 и Си компилятор к нему с лекарствами
А разве они не бесплатные?! Все на оффициальном сайте есть.
Или нужны с самый лучшей оптимизацией кода?
http://www.microchip.com/mplab/compilers
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: MPLAB в вопросах и ответах
Хорошо, установил всё бесплатное, но ужас..., не могу соединить MPLAB X и PROTEUS 8, более того MPLAB X не генерирует файл "cof" поэтому отладить программу в пошаговом режиме с PROTEUS 8 не получится, подскажите кто как это победил ?
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.