У меня компилятор XC8 v 1.41 не распознает STATUS_bits.C = 0; не распознает.
Смотрите как прописаны биты регистра STATUS в заголовочном файле XC8 для вашего микроконтроллера. У меня эти файлы в по такому пути расположены: C:\Program Files\Microchip\xc8\v1.33\include
_________________ Астролябия-сама меряет, было бы что мерять!!!
нет там нижнего подчеркивания но дело даже не в этом - в си не надо проверять флаг переноса и пытаться "btfsc" выполнить ... это ж не асм тоже самое и с "goto" - не нужен в си безусловный переход
нет там нижнего подчеркивания но дело даже не в этом - в си не надо проверять флаг переноса и пытаться "btfsc" выполнить ... это ж не асм тоже самое и с "goto" - не нужен в си безусловный переход
Вы меня в каждой теме "поражаете". Что не вопрос то хвастовство, что всё знаете. Знаете? Хорошо, отлично. Считаете, что я не достоин Вашего совета и подсказки? Проходите мимо. То, что Вы пишете - об этом весь интернет кишит. К сожалению нет полноценного обучения данной теме. Приходится самому карабкаться. Можете подсказать? Подскажите как. Не хотите - мимо.
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Сб дек 14, 2024 00:12:19
Нашел транзистор. Понюхал.
Карма: 3
Рейтинг сообщений: 21
Зарегистрирован: Чт ноя 26, 2015 23:22:35 Сообщений: 158 Откуда: не с Уфы
Рейтинг сообщения:0
В какой ещё "каждой"? Вы меня с кем-то путаете... Я точно также как и вы сравнительно недавно начал осваивать си... То, что я написал - это и есть подсказки. Могу повторить - не проверяйте флаг С. Найдите другой способ. Вы же его проверять зачем хотите? Чтобы перенос отследить, верно? После чего? Вычитания? Ну так есть же операторы больше/меньше - используйте их. Я к тому, что например, зачем отнимать 5 из 3, если 3 меньше пяти... и это можно выяснить ещё до вычитания ... как вариант ...
насчет ещё флага С - его можно использовать в иных (своих) целях ... например, в функции записи в ипром, прежде чем отключить прерывания, им временно можно запомнить текущее состояние GIE : STATUSbits.CARRY = 0; if (INTCONbits.GIE) {STATUSbits.CARRY = 1;} INTCONbits.GIE = 0; чтобы потом именно восстановить как было, а не тупо включить if (STATUSbits.CARRY) {INTCONbits.GIE = 1;} разумеется, это для случаев, когда в промежутке точно нет кода. который может повлиять на него (сдвиги, арифметика) ... а здесь как раз такой случай, ибо речь о последовательности раблокировки записи
Друзья. Объясните, пожалуйста, как быть с регистром W. Как его в Си сохранять в прерываниях и вообще работать с ним. И еще. В MPLAB он весит по адресу 0x9F но там же висит и ADCON1. Как так? Заранее спасибо за ответ.
Друзья. Объясните, пожалуйста, как быть с регистром W.
Никак не быть. Вам уже объяснили, что в Си нельзя применять то, что Си использует для своих целей. Нельзя писать на Си, копируя код на АСМе. Поэтому забудьте про названия регистров ядра. В Си это табу. Можно использовать только ОЗУ, флеш и регистры периферии. Но тоже по правилам Си.
В младших пиках ОЗУ разделено на банки. Обращение в дизасме к определенному адресу ничего не означает. Для того, чтобы узнать в какой банк произошло обращение, нужно смотреть на RP-биты регистра STATUS. Если вы пишите на Си, забудьте об этом. Это вас не касается. Компилятор все сделает как надо.
Товарищи! Правильно ли я делаю подключение функции из другого файла? Есть функция предположим - void fun_1(void) в файле. Я пытаюсь вызвать её в main следующим способом:
extern void fun_1(void); void main (void) { extern fun_1(void); return; } Но ничего не выходит. Компилятор говорит - "На текущем компьютере не найдено ни одной строки исходного кода" Подскажите, пожалуйста с extern. Заранее спасибо.
Добавлено after 7 minutes 33 seconds: Товарищи! Я ПОНЯЛ!!! Невнимательность моя! ):
extern void fun_1(void); void main (void) { fun_1(); return; }
А причем тут extern? Для функций объявленных в другом файле или даже в этом, но ниже ее вызова, объявляют ее прототип в начале кода. А экстерном объявляют переменные используемые в этом файле, но объявленные в другом, чтобы не было повторного объявления..
При том, что функции определённые в других модулях являются внешними
Внезапно все функции в Си по умолчанию получают спецификатор extern (в отличии от static). Поэтому писать его в прототипе нет никакой необходимости - он будет проигнорирован.
Друзья, а можно ли в MPLAB разбивать ассемблерный файл как в си, по разным файлам? К примеру - в одном файле основная программа, а прерывания в другом файле? Если да то как это реализовать? Заранее спасибо.
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Пн дек 23, 2024 20:53:45
Нашел транзистор. Понюхал.
Карма: 3
Рейтинг сообщений: 21
Зарегистрирован: Чт ноя 26, 2015 23:22:35 Сообщений: 158 Откуда: не с Уфы
Рейтинг сообщения:0
создаем новый файл в папке проекта (скажем - int.asm) ... в нем пишем код ... затем там, где этот код должен размещаться пишем INCLUDE "int" Либо изначально создаем некий главный файл (main.asm) и в нем уже определяем карту всего кода, типа так: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0x00 goto _INIT
org 0x04 INCLUDE "int" INCLUDE "INIT" INCLUDE "FILE1" INCLUDE "FILE2" ; ; org 0x700 INCLUDE "TABLE" ; END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Чередуем, убираем, добавляем, фиксируем по нужным адресам .... как душе угодно метка _INIT в файле INIT.asm
Я сейчас точно не помню как реализован синтаксис абсолютного адреса конкретно в XC8 и XC16, но общее правило - это спецификатор at или @ в объявлении переменной. uint8_t var __at(0x1000);
Я сейчас точно не помню как реализован синтаксис абсолютного адреса конкретно в XC8 и XC16, но общее правило - это спецификатор at или @ в объявлении переменной. uint8_t var __at(0x1000);
Привет. Я пытаюсь изучить программирование PIC на си. Сочинил в mplab x простую программу под xc8 v2.50 Программа работает только на половину. Задумка была такая. Брать из массива число по индексу массива и отправлять это число в порт. Индикация светодиодами для контроля. Управление от двух кнопок. Получилось, что та часть программы, которая считает переменную - индекс массива в плюс, работает корректно, а та часть, где индекс должен уменьшаться, просто пролетает до нуля от первого нажатия на кнопку. При этом декремент на самом деле происходит, но не на единицу, как должно быть, а сразу уменьшает до нуля, как будто в цикле for. С инкрементом ни каких проблем. Проверял и в протеусе 8.17, и на реальном макете. Пошаговая отладка в mplab x проходит правильно. Не работает, как задумывалось, а что упустил, не пойму. Светодиодом мигал.
Спойлер
Код:
/* * File: main.c * Mplab X v5.35 * XC8 compiler v2.50 * For Proteus v8.17 */
// CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#include <xc.h>
#define _XTAL_FREQ 2000000 // 2Mhz xtal
unsigned char array[] = { //Data to port C 0xA5,0x5A,0xF0,0x0F };
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения