Страница 1 из 3
PIC12F675 помогите разобраться с программированием
Добавлено: Вт июн 30, 2015 12:54:39
Alexandr617
Помогите разобраться, что я делаю не так. Я хочу сделать, чтобы на пятой ноге МК светодиод моргал, ориентировался по разным примерам кода, но что-то ничего не получается.
Компилятор выдаёт следующее:
Build D:\Led_S\LED_ON for device 12F675
Using driver D:\Program Files\HI-TECH Software\PICC\lite\9.60\bin\picc.exe
Make: The target "D:\Led_S\Untitled.obj" is out of date.
Executing: "D:\Program Files\HI-TECH Software\PICC\lite\9.60\bin\picc.exe" -C D:\Led_S\Untitled.c -q --chip=12F675 -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Warning [176] D:\Led_S\Untitled.c; 15.0 missing newline
Error [192] D:\Led_S\Untitled.c; 6.1 undefined identifier "PORTA"
Error [192] D:\Led_S\Untitled.c; 7.1 undefined identifier "TRISA"
Warning [361] D:\Led_S\Untitled.c; 13.1 function declared implicit int
Warning [337] D:\Led_S\Untitled.c; 14.1 line does not have a newline on the end
********** Build failed! **********
Вот код:
Код: Выделить всё
#include <pic.h>
void main()//Начало программы.
{
unsigned short i;
PORTA = 0;//Очищаем порт А.
TRISA = 0b00010000;//Направление работы ножек порта А.
while(1)//Бесконечный цикл.
for(i=0; i<8; i++)
{
PORTA=i;
Delay_ms(500);
}
}
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Вт июн 30, 2015 13:17:15
otest
Нет у него PORTA, TRISA.
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Вт июн 30, 2015 13:42:57
Alexandr617
А FlowCode показует, что у него PORT A есть... А как тогда на этой МК подавать напряжение на выход?
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Вт июн 30, 2015 14:05:56
botchin
Качаем datasheet, читаем внимателно, доходим до 3.1. Делаем открътие, что в 12F675 есть GPIO и TRISIO регистръ. Понимаем что нужно читат далее. Читаем!
Удачи
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Вт июн 30, 2015 14:09:07
pyzhman
И это
убрать. И понять, для чего было впихнуто.
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Вт июн 30, 2015 17:06:45
Alexandr617
Ковыряюсь, но ничего не выходит,… можете показать пример как правильно на этом МК управлять входом\выходом?
Вот что я изменил:
Код: Выделить всё
#include <pic.h>
#define P12F675
#define diod TRIS4
void main(void)//Начало программы.
{
GPIO = 0;//Очищаем порт.
TRISIO = 0b11110111;//Направление работы ножек порта.
WPPU = 0;// Подтягивающие R(0-вкл.; 1-выкл.).
while(1)//Бесконечный цикл.
{
diod=1;
Delay_ms(500);
diod=0;
Delay_ms(500);
}
}
Я правильно назначил направление работы ножек?
Но компилятор по-прежнему чем-то недоволен
Build D:\Led_S\LED_ON for device 12F675
Using driver D:\Program Files\HI-TECH Software\PICC\lite\9.60\bin\picc.exe
Make: The target "D:\Led_S\Untitled.obj" is out of date.
Executing: "D:\Program Files\HI-TECH Software\PICC\lite\9.60\bin\picc.exe" -C D:\Led_S\Untitled.c -q --chip=12F675 -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Warning [176] D:\Led_S\Untitled.c; 18.0 missing newline
Error [192] D:\Led_S\Untitled.c; 10.1 undefined identifier "WPPU"
Warning [361] D:\Led_S\Untitled.c; 14.1 function declared implicit int
Warning [337] D:\Led_S\Untitled.c; 17.1 line does not have a newline on the end
********** Build failed! **********
Есть еще такой момент, когда я собрал на этом МК, как оно должно работать в FlowCODE, FlowCODE скомпилировал и выдал hex файл. Но при попытке с имитировать работу в протеусе МК с этим hex файлом не работает. С другими МК таких проблем не было.
Код который предлагает FlowCODE:
Код: Выделить всё
//************************************************************************************
//**
//** File name: D:\hhhhhhhhhhhhhhhhhhhhhh\Flowcode1.c
//**
//** Generated by: Flowcode v5.2.0.0
//**
//**
//** http://www.matrixmultimedia.com
//**
//************************************************************************************
#define MX_PIC
#define MX_USES_UINT8 1
#define MX_USES_SINT16 0
#define MX_USES_CHAR 0
#define MX_USES_FLOAT 0
#define MX_USES_SINT32 0
#define MX_USES_BOOL 1
#define MX_USES_UINT16 0
#define MX_USES_UINT32 0
//Defines for microcontroller
#define P12F675
#define FC_CAL_PIC
#define FC_USEGPIO
#define MX_ADC
#define MX_ADC_TYPE_5
#define MX_ADC_BITS_10
#define MX_EE
#define MX_EE_SIZE 128
//Functions
#define MX_CLK_SPEED 19660800
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif
//Configuration data
//Internal functions
#include "D:\Program Files\Flowcode\v5\FCD\internals.c"
//Macro function declarations
//Variable declarations
#define FCV_FALSE (0)
#define FCV_TRUE (1)
#include "D:\Program Files\Flowcode\v5\CAL\includes.c"
//Macro implementations
void main()
{
//Initialization
ansel = 0x20;
cmcon = 0x07;
//Interrupt initialization code
option_reg = 0xC0;
//Loop
//Loop: While 1
while (1)
{
//Output
//Output: 0 -> A4
trisio = trisio & 0xEF;
if ((0))
gpio = (gpio & 0xEF) | 0x10;
else
gpio = gpio & 0xEF;
//Delay
//Delay: 500 ms
delay_ms(255);
delay_ms(245);
//Output
//Output: 1 -> A4
trisio = trisio & 0xEF;
if ((1))
gpio = (gpio & 0xEF) | 0x10;
else
gpio = gpio & 0xEF;
//Delay
//Delay: 500 ms
delay_ms(255);
delay_ms(245);
}
mainendloop: goto mainendloop;
}
void MX_INTERRUPT_MACRO(void)
{
}
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Вт июн 30, 2015 18:37:49
botchin
Опять читаем док. Там приблизително сказано: Каждъй от входов, исключая GP3, можно подтягивать через WPUx (WPU0-WPU5 - искл. WPU3) Перед етим нужно разрешить подтягивание через GPPU бит (OPTION REG:7)
Вас компилятор ругает в основном за то что не знает что такое WPPU
Flow разрешил подтягивание: option_reg = 0xC0; => самъй старшии бит ето разрешение подтяжки, а вот я нигде не увидел подтяжка какого то въвода.
А вам зачем подтягивание? Въ не нажимаете еще на клавишу!
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 09:21:01
pyzhman
Код: Выделить всё
#include <pic.h>
#define diod GPIO2 // светодиод подключен к ножке 5
void main(void)//Начало программы.
{
GPIO = 0;//Очищаем порт.
TRISIO = 0b11111011;//Направление работы ножек порта.
while(1)//Бесконечный цикл.
{
diod= 1;
_delay(500);
diod= 0;
_delay(500);
}
}

Надо бы еще определить содержимое CMCON и ANSEL, но демонстрация и так работает. (частота тактирования задана 4МГц)
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 12:05:01
Alexandr617
Всё уже компилируется

Я даже по-разному поэкспериментировал, вот код:
Код: Выделить всё
#include <pic.h>
//PIC12F675
#define Delay_ms
#define knopka GPIO5 //Кнопка #1.
#define knopka2 GPIO3 //Кнопка #2.
#define diod1 TRIS0 //Светодиод #1.
#define diod2 TRIS1 //Светодиод №2.
#define diod3 GPIO2 //Светодиод #3(Должен просто моргать).
#define diod4 GPIO4 //Светодиод #4(Должен Вкл. при нажатии 'knopka2').
__CONFIG (INTIO & UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS);
void ZX1(void) //Подготовка МК.
{
TRISIO =0b101000; //Направление работы ножек порта(1-вход, 0-выход)
CMCON = 0x07; //Отключение компараторов.
GPIO = 0b000000; //Очищаем порт.
WPU5 = 1; //Подтягивающий резистор(1-вкл., 0-откл.).
}
//Начало программы.
void main(void)
{
ZX1(); //Вызов функции подготовки МК.
while(1) //Бесконечный цикл.
{
diod4 = knopka2; //Включить светодиод #4.
if(GPIO==0b100000) //Если кнопка нажата(вторая нога МК).
{
GPIO = 0b000001;
diod1 = 0; //Включить светодиод #1.
diod2 = 1; //Выключить светодиод #2.
Delay_ms(500);
}
else //Если кнопка не нажата.
{
GPIO = 0b000010;
diod1 = 1; //Выключить светодиод #1.
diod2 = 0; //Включить светодиод #2.
Delay_ms(500);
}
diod3 = 0; //Включить светодиод #3.
Delay_ms(500);
diod3 = 1; //Выключить светодиод #3.
Delay_ms(500);
}
}
Но мне почему-то не получается сделать задержку, при «Delay_ms(500);» она не происходит, а при «_Delay(500);» код не компилируется. И при тестировании в Proteus не было стабильного горения светодиодов, они с огромной частотой моргали. Из-за чего это может быть?
Надо бы еще определить содержимое CMCON и ANSEL
Что это, для чего и как это сделать? «CMCON = 0x07;» я видел в подобной схеме на ЛабКит, но я так и не понял, для чего отключаются компараторы. Можете рассказать что и для чего?
. нужно разрешить подтягивание через GPPU бит (OPTION REG:7)
Как это правильно организовать на этой МК?
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 12:22:57
pyzhman
pyzhman писал(а):Надо бы еще...
Alexandr617 писал(а):Всё уже компилируется
Вы всё сможете сами. При экспериментах ясно представляйте себе что и как происходит.
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 12:47:27
Alexandr617
Главное желание и понимание всех происходящих процессов и всё получится

но в данный момент я не понимаю почему задержка не происходит и почему светодиоды моргаит с огромной частотой. Я ведь вынес функцию подготовки МК за пределы бесконечного цикла, она не должна сбрасывать порт в 0.
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 12:59:45
pyzhman
Вы еще не разобрались с
Alexandr617 писал(а):...Я хочу сделать, чтобы на пятой ноге МК светодиод моргал...
, а уже поналепили кнопок. Кто ж за вами угонится? Сделайте сначала одно, а потом беритесь за следующее.
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 13:02:20
pyzhman
Alexandr617 писал(а):...Я ведь вынес функцию подготовки МК за пределы бесконечного цикла, она не должна сбрасывать порт в 0.
Она и так была вынесена за пределы бесконечного цикла.
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 13:10:46
botchin
Разберитесь с разницей меж TRISIO и GPIO регистров
Alexandr617 писал(а):#define diod1 TRIS0 //Светодиод #1.
#define diod2 TRIS1 //Светодиод №2.
#define diod3 GPIO2 //Светодиод #3(Должен просто моргать).
#define diod4 GPIO4 //Светодиод #4(Должен Вкл. при нажатии 'knopka2').
Что из етого верно?
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 14:19:02
Alexandr617
Код: Выделить всё
#include <pic.h>
//PIC12F675
#define diod GPIO2 //Светодиод.
__CONFIG (INTIO & UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS);
//Начало программы.
void main(void)
{
TRISIO = 0b111011; //Направление работы ножек порта(1-вход, 0-выход)
GPIO = 0b000000; //Очищаем порт.
while(1) //Бесконечный цикл.
{
diod = 1; //Включить светодиод.
_delay(500); //Задержка 0,5сек.
diod = 0; //Выключить светодиод.
_delay(500); //Задержка 0,5сек.
}
}
Почему?
Build D:\Led_ON2\LED_ON for device 12F675
Using driver D:\Program Files\HI-TECH Software\PICC\lite\9.60\bin\picc.exe
Make: The target "D:\Led_ON2\Untitled.obj" is out of date.
Executing: "D:\Program Files\HI-TECH Software\PICC\lite\9.60\bin\picc.exe" -C D:\Led_ON2\Untitled.c -q --chip=12F675 -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Warning [176] D:\Led_ON2\Untitled.c; 17.0 missing newline
Warning [361] D:\Led_ON2\Untitled.c; 13.1 function declared implicit int
Warning [337] D:\Led_ON2\Untitled.c; 16.1 line does not have a newline on the end
Executing: "D:\Program Files\HI-TECH Software\PICC\lite\9.60\bin\picc.exe" -oLED_ON.cof -mLED_ON.map --summary=default --output=default Untitled.obj --chip=12F675 -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
HI-TECH PICC-Lite COMPILER (Microchip PICmicro) V9.60
Copyright (C) 1984-2006 HI-TECH SOFTWARE
Error [499] ; . undefined symbol:
__delay (Untitled.obj)
********** Build failed! **********
Что я делаю не так, что с установкой задержки не хочет компилироваться?
То что я дописывал «#define delay_ms» я так понимаю это не правильно.
GPIO – это 6-разрядный порт входа/выхода. GPIO имеет соответствующие биты направления в регистре TRISIO, позволяющие настраивать канал как вход или выход. Запись «1» в TRISIO переводит соответствующий выходной буфер в 3-е состояние. Запись «0» в регистр TRISIO определяет соответствующий канал как выход, содержимое защелки GPIO передаётся на выход микроконтроллера(если входная защелка подключена к выходу микроконтроллера).
Получается, подачу напряжения с выхода делаем с помощью GPIO, я правильно понимаю?
Исправил TRIS на GPIO, также всё моргает.
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 14:26:05
pyzhman
1. Вы так и не увидели, что в рабочем варианте одно подчеркивание перед delay, а у вас два?
2. Директива #define что делает? И каков смысл ее использования в вашем варианте?
3. С помощью GPIO мы управляем портом. В данном случае подачей 1 или 0.
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 15:03:02
Alexandr617
pyzhman писал(а):1. Вы так и не увидели, что в рабочем варианте одно подчеркивание перед delay, а у вас два?
2. Директива #define что делает? И каков смысл ее использования в вашем варианте?
1. Без разницы одно, два или вообще без подчеркивания, одни и теже ошибки выдаёт. Правда компилятор всегда показует на одну больше... Обратите внимание, в коде одно подчеркивание, а компилятор показал два.
2.
Директива #define определяет идентификатор и последовательность символов, которая будет подставляться вместо идентификатора каждый раз, когда он встретится в исходном файле.
действительно, непонятно для чего я её вставил.(
Удалил "GPIO=0b000001" и "GPIO=0b000010", это была моя ошибка, кнопка каждый раз сбивалась в "0". Теперь каждая нога отдельно от другой переключается, стало стабильней переключаться, но светодиоды всё равно моргают с огромной частотой.
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 15:35:48
botchin
Я сам работаю на ASM, но вот что нашел:
Код: Выделить всё
#include <htc.h> // Required to interface with delay routines
#ifndef _XTAL_FREQ
// Unless already defined assume 4MHz system frequency
// This definition is required to calibrate __delay_us() and __delay_ms()
#define _XTAL_FREQ 4000000
#endif
/** demonstration of various built-in delay mechanisms */
void main(void){
while(1){
NOP();
_delay(1000); // delay for 1000 instruction cycles
CLRWDT();
__delay_us(400); // delay for 400 microseconds
CLRWDT();
__delay_ms(2); // delay for 2 milliseconds
CLRWDT();
}
}
Включи вот ети рядъ
#include <htc.h> // Required to interface with delay routines
#ifndef _XTAL_FREQ
// Unless already defined assume 4MHz system frequency
// This definition is required to calibrate __delay_us() and __delay_ms()
#define _XTAL_FREQ 4000000
#endif
должно получится
-----------------------------------------------
Поставил себе HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode) V9.71a
обе функции не трябуют #include <htc.h>
функция _delay(unsigned long ); проходит
функция __delay_us(unsigned long ); проходит требует #define _XTAL_FREQ 4000000
функция __delay_ms(unsigned long ); проходит требует #define _XTAL_FREQ 4000000
Заметь _delay() с один прочеркон, а __delay_us() i __delay_ms() с два
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Ср июл 01, 2015 23:11:42
Alexandr617
pyzhman писал(а):И это
убрать. И понять, для чего было впихнуто.
Я уже понял для чего это впихнули, это пустой цикл для задержки.
http://icdevelop.narod.ru/picc/
Напишем простенькую программку для мигания светодиодом:
#include "pic.h"
#define bitset(var,bitno) ((var) |= 1 << (bitno))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
main() {
unsigned int k;
CMCON = 0x07; //компараторы выключены
TRISA = 0b11111110; //RA0 выход
repeat:
for (k=0; k<45000; k++);//"пустой" цикл для временной задержки
bitset(PORTA, 0); //выставить на RA0 высокий уровень
for (k=0; k<45000; k++);
bitclr(PORTA, 0); //выставить на RA0 низкий уровень
goto repeat; //повторить ещё раз
}
Я так понял что не все компиляторы имеют delay.
------------------------------------
botchin писал(а):Я сам работаю на ASM, но вот что нашел.
Включи вот ети рядъ
#include <htc.h> // Required to interface with delay routines
#ifndef _XTAL_FREQ
// Unless already defined assume 4MHz system frequency
// This definition is required to calibrate __delay_us() and __delay_ms()
#define _XTAL_FREQ 4000000
#endif
должно получится
-----------------------------------------------
Поставил себе HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode) V9.71a
обе функции не трябуют #include <htc.h>
функция _delay(unsigned long ); проходит
функция __delay_us(unsigned long ); проходит требует #define _XTAL_FREQ 4000000
функция __delay_ms(unsigned long ); проходит требует #define _XTAL_FREQ 4000000
Заметь _delay() с один прочеркон, а __delay_us() i __delay_ms() с два
Огромное спасибо за попытки мне помочь! Но это мне не помогло( компилятор выдаёт теже ошибки. Этот компилятор был в стандарте с MPLAB-ом, думаю стоит попробовать установить другую версию или компилятор...
-------
Кстати, пробовал вставлять Нопы с асма, задержку даёт, только очень маленькую, после этого вставил тот пустой цикл для задержки всё стало отлично МОРГАТЬ)). Простая прога моргалка уже залита в МК и стабильно могает уже 30мин. А с кнопками есть ещё вопросы, при нажатии кнопки светодиод почему-то не включается на постоянную работу он просто моргает поочерёдно с постоянно моргающим светодиодом.
--------------------
А FlowCODE я так понял имеет ошибки, по крайней мере для pic12f675 100%! Конфигурации в hex не ложит(PICkit об этом предупреждал. Конечно, после прошивки МК не работал, но прошивка была удачно залита) и в оболочке я мог (как бы) делать GP3 как на вход так и на выход.
Re: PIC12F675 помогите разобраться с программированием
Добавлено: Чт июл 02, 2015 06:25:59
botchin
Поставил себе HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode) V9.71a
обе функции не трябуют #include <htc.h>
функция _delay(unsigned long ); проходит
функция __delay_us(unsigned long ); проходит требует #define _XTAL_FREQ 4000000
функция __delay_ms(unsigned long ); проходит требует #define _XTAL_FREQ 4000000
Заметь _delay() с один прочеркон, а __delay_us() i __delay_ms() с два прочеркa
Alexandr617 писал(а):Я так понял что не все компиляторы имеют delay
В язъках типа С функции бъвают встроеннъе и библиотечнъе. Delay встроенная - компилятор вставляет ее при нужде,
Код: Выделить всё
#include <pic.h>
#define _XTAL_FREQ 4000000
void main(void)
{
while(1)
_delay(100);
__delay_us(100);
__delay_ms(100);
}
Вот ето компилируется на все сто - HI-TECH C Compiler V9.71a
Кстати у етого компилятора в среде MPLAB довольно хорошии HELP на 344 страниц. Откръвается с Project/Hi-TECH C Manual F11