Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Chettuser

Сообщение Chettuser »

Народ, уже полдня мучаю XC8. Сдаюсь! :(
Код простейший, PIC тоже - 84A:
(код урезан!)
Спойлер

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

#include <xc.h>
#include <stdlib.h>
#include <stdio.h>

#pragma config FOSC=HS, WDTE=OFF, CP=OFF, PWRTE=OFF
#define _XTAL_FREQ 	4000000;		// Тактовая частота
#define LRED    RB0;
#define LYELLOW RB1;
#define LGREEN  RB2;

init(void);
delay_s(int S);

void main (void)
{
	init();
	
	while(1)
	{	
//		RED = 1;  // Не работает тоже!
		RB0 = 1;
		delay_s(10);

	}
}


delay_s(int S)		// Задержка в секундах
{
int k = 0;
while(S>0)
{
	while(k<10)
	{
		[b]__delay_ms(100);[/b]
		k++;
	}
S--;
}
return;
}

init(void)
{
	TRISA = 0xFF;
	TRISB = 0x00;
	
	PORTA = 0x00;
	PORTB = 0x00;
return;
}
Такое ощущение, что XC8 в упор не видит pic.h, где прописан тот самый __delay_ms(x); :(
Что я забыл включить?
Лог ошибок:
Error [195] D:\My designs\SVETOFOR\SVETOFOR.c; 66.38 expression syntax
Error [187] D:\My designs\... .c; 66.38 too few function arguments
Error [194] D:\My designs\... .c; 66.38 ")" expected
Error [195] D:\My designs\... .c; 66.38 expression syntax
Error [195] D:\My designs\... .c; 66.39 expression syntax
Вложения
SVETOFOR.zip
(2.85 КБ) 159 скачиваний
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

А я ведь чуть было не подумал, что у меня XC8 тоже с катушек съехал, пока пытался скомпилить Ваш код :) Мало того, я ещё в хелп полез, убеждаться что всё написано верно и всё подключено :))
Из дефайна точку с запятой уберите !
Варвары, как ещё назвать... :)))
Контактная информация:
Реклама
Chettuser

Сообщение Chettuser »

Никогда не пользовался, но тут что называется назрело...
Перекопал весь справочник по XC8 но не наткнулся даже на похожее.
Кто как делал сброс PIC16 программно?
Неужели кроме ассемблерного перехода на 0x0000 нет способа?

Собственно для чего это понадобилось - мне нужно вернуться в функцию main из подфункции, но не с того места откуда выскочил, а на начало этой main. Другого способа не вижу (эх... как хорошо было на ассемблере "goto" и все дела!).
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

watchdog используйте
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

oleg110592, не а ...
Переписывать все , ибо алгоритм не верен ....
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Как вариант. Можно ещё повесить любую ногу на MCLR и подавать на неё "0". Контроллер ресетнится.
А так, по текущей проблеме, соглашусь с dosikus'ом. Если случилось так, что нужно перескочить куда-то в нестандартное место, то алгоритм явно неверен, и его нужно пересматривать.
Контактная информация:
Chettuser

Сообщение Chettuser »

Вопрос решен. Закрыт.
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Ну почему... в ответственных приложениях при обнаружении сбоя или ошибки... вполне можно заюзать типа...

((void (*)())0x0000)(); // RESET 0000H
"Я не даю готовых решений, я заставляю думать!"(С)
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Стас, у него шаблон снесет , проще разрешить goto и метки юзать . :)))

Chettuser, только не из функции а после ее вызова и по результату вызова.
А если нужен именно Reset а не просто переход на вектор Reset ,
проще watchdog юзать, как oleg110592 советовал .
И при старте анализировать флаги сброса ...
Chettuser

Сообщение Chettuser »

Я уже выкрутился, спасибо. :)
Chettuser

Сообщение Chettuser »

Возможно ли сделать аналогичное на PIC?
http://www.polesite.ru/?p=1965
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Это плюсы, а конкретно - использование шаблонов. Если компилятор будет их (++) поддерживать, то - возможно.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

В купе с призрачным преимуществом легкости разводки получаем батхерт от плюсов с соответствующими тормозами .
Проще юзать SMD монтаж и двухстороннюю разводку с изготовлением плат на китайских площадках...
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2198
Зарегистрирован: Ср мар 14, 2007 01:50:10

Сообщение Adusik »

Подскажите пожалуйста, что дописать в конфигу чтобы были установлены биты защиты как программной области так и епрома? Нужно All Protect.
Сейчас защищена только область программы: __CONFIG ( WDTDIS & INTIO & MCLRDIS & PROTECT );
Chettuser

Сообщение Chettuser »

Сегодня компилятор выдал на работе фокус:
Error [141] D:\V..... er.h; 1.15 can't open include file "xc.h": Too many open files
(908) exit status = 1
И ошибку на заголовок (содержащий xc.h) во всех *.с-файлах.
Чего ему не понравилось?

Кстати, где прячется описание ошибок (Error [141]), где посмотреть кто-нибудь знает? Справку перелопатил, не нашёл.
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Сб авг 14, 2010 05:26:04
Откуда: Воронеж

Сообщение Demonit88 »

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

Сообщение uldemir »

А чего их назначать? делаем include - там всё назначено:

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

#include <p18f25k20.h>
#pragma config FOSC=INTIO67, FCMEN=OFF, PWRT=ON, IESO=OFF, BOREN=SBORDIS, BORV=22, WDTEN=OFF, PBADEN = OFF

И обращения делаются через операции с ними:

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

#pragma interruptlow tmr0routine   // прерывание
void tmr0routine(void) {

	LATA = 0;                               // обнулим порт А
	if ((PORTC & 0x07) != 0x07) blink_cnt = 0;  // если из 3х младших выводов порта Ц содержат хоть одну единицу
	LATB = (videobuf.............                 // выводим данные в порт Б
	LATCbits.LATC7 = videobuff[videobuf_offs] >> 7; // Отдельно можно изменить один бит порта Ц

	INTCONbits.TMR0IF = 0;  // Ну и сбрасываем флаг запроса прерывания.
}
Написано под PICC18 компилятор. В XC8 #pragma может иметь иной синтаксис.
Не думаю, что 629-й кристалл, это тот, под который стоит писать на C - там и на ассемблере мало что умещается. Поэтому не знаю, поддерживает ли его какой компилятор C - даже в голову такая мысль не приходила.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

поддерживают - и хайтек и хc8
Контактная информация:
Chettuser

Сообщение Chettuser »

#pragma нормально воспринимается XC8, а вот __CONFIG не всегда молча съедает.
Ответить

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