Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
05.07.2007, 13:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Вот посмотри может это чем поможет
Прикрепленный файл: 7441926.rar
|
|
|
|
05.07.2007, 18:25
|
|
Прописка
Регистрация: 15.10.2006
Сообщений: 130
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 1 сообщении
|
спасибо,
изучу
|
|
|
|
05.07.2007, 18:28
|
|
Прописка
Регистрация: 15.10.2006
Сообщений: 130
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 1 сообщении
|
не, правда
Пересмотрел по совету urry'я внимательно свой код
- мура мурой
Вот, переписал немножко:
Код:
|
char* _RCREG;
char* hangup = "AT+CHUP\r";
char* init2= "AT+CNMI=1,1,0,0,1\r";
void Tx_String(char* buf)
{
int i = -1;
do
{
i++;
putchar(buf[i]);
}
while( buf[i]!='\r');
}
#int_RDA
RDA_isr()
{
_RCREG = 0x1A; // адрес RCREG
/* просто жду пока в буфере приемника появится 'R' */
if((*_RCREG) == 'R')
{
if(input(ind_yellow)) output_low(ind_yellow);
else output_high(ind_yellow);
}
}
void main()
{
char* init = "ATE0\r";
char* ok = "OK";
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RDA);
setup_oscillator(False);
port_b_pullups(false);
Tx_String(init);
Tx_String(init2);
enable_interrupts(GLOBAL);
for(;;);
} |
- но ведь все равно срабатывает только при первом дозвоне!
такое ощущение, что сразу после этого кто-то отключает мое прерываение
Хотелось бы добраться до отдельных битов регистра RCSTA (а именно до бита CREN)
Попробовал использовать для этого ассемблерные вставки,
но вот беда CCS-PICC мплабовские предопределения не понимает и задает глупые вопросы
Знаю что это как то можно устранить,
вот только как?
|
|
|
|
06.07.2007, 10:07
|
|
Прописка
Регистрация: 22.08.2006
Сообщений: 168
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 11 сообщении(ях)
|
Может быть и не совсем по тому алгоритму, но может кому интересен практически классический пейджер....
http://icdevelop.narod.ru/plusgsm/index.htm
|
|
|
|
07.07.2007, 21:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Значит, Вы переросли этот компилятор. Переходите на хайтек. Вот Ваш код на хайтеке - я специально не использовал стандартные библиотеки работы с уартом.
Проект в протеусе, в хайтеке присоединяю.
Код:
|
#include ‹pic.h›
#include ‹conio.h›
//-------------------------
#ifndef bool
#define bool static bit
#define false 0
#define true 1
#endif
#define XTAL 20000000 // частота кварца
#define SPBRG_ ((XTAL /9600) -16)/16
// вычисляется по формуле
//SPBRG=(частота кварца/скорость в бодах - 16)/16 , тогда BRGH =1
//---------------------------
__CONFIG(HS & WDTDIS & LVPDIS & MCLREN);
//---------------------------
void init_port(void);
void send_ar( unsigned char *ar);
static volatile bit svet @ ((unsigned)&PORTA*8)+0;
static bit busy;
unsigned char i;
unsigned char test1;
unsigned char st;
static unsigned char ar1[]={'A','T','+','C','H','U','P','\r'};
//---------------------------------------------
/* это прерывание */
interrupt void serial_ir(void)
{
if (TXIF)
{
TXREG=test1;
TXIE=0;
}
//----------------------------------------------
if (RCIF)
{
switch(st)
{
case 0: // еще не принят ни один символ
if(RCREG=='R')st++;
break;
case 1:
if(RCREG=='I') st++; else st=0;
break;
case 2:
if(RCREG=='N') st++; else st=0;
break;
case 3:
if(RCREG=='G') st++;else st=0;
break;
case 4:
if(RCREG=='\r' )
{
CREN =0;
RCIE=0;
svet^=1;
busy=1;
st=0;
break;
}
}
}
}
//-------------------------------------------
void init_port()
{
CMCON=7;//выключаем компараторы
TRISA=0xfe;
TRISB=0xff;
svet =0;
// все на ввод.вывод передачи порта для несущей, тоже.
// это невозможно понять, это нужно запомнить.
SPEN=1;//разрешение работы последовательного порта
SYNC =0;//включение асинхронного режима работы
TX9=0; // выбираем 8 - битовую передачу
RX9=0; // выбираем 8 - битовый прием
BRGH =1;//включаем высокоростной режим
SPBRG=SPBRG_;//
PIR1 = 0; /*контрольный выстрел в голову - после сброса регистр чистый и так*/
PEIE = 1; /* разрешаем прерывания периферии */
TXIE=0;//запрещаем прерывания от передатчика
TXEN=1;// подключаем ножку физически
// разрешаем прием
CREN =1;
// разрешаем прерывания от приемника
RCIE=1;
GIE = 1;// разрешаем прерывания вообче
}
//---------------------------------
//////////////////////////main/////////
main()
{ //начало маин
init_port();
busy=0;
st=0;
//----------------------------------------------------------------
for(;;) // начало бесконечного цикла
{ //начало фор
//--------------------
if (busy == 1) send_ar(ar1);
//--------------------
} // конец фор
} // конец маин
//================================================== =================
void send_ar(unsigned char *ar)
{
for (i=0;;i++)
{
test1=ar[i];
if(test1=='\r')break;
TXIE=1; // разрешаем прерывания от передатчика
do{
}while(TRMT == 0);//пока полный сдвиговый регистр
// ничего в регистр не пишем чтобы не перехлестнулось
}
TXIE=0; // запрещаем прерывания от передатчика
busy=0;
CREN =1;
// разрешаем прерывания от приемника
RCIE=1;
} |
Прикрепленный файл: 7596136.rar
|
|
|
|
07.07.2007, 21:41
|
|
Прописка
Регистрация: 15.10.2006
Сообщений: 130
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Что ж замечательно
Осталось узнать что такое "хайтек"
|
|
|
|
07.07.2007, 22:17
|
|
Прописка
Регистрация: 15.10.2006
Сообщений: 130
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Дозвон заработал.
И прерывание оказывается было непричем.
Оказывается переключать биты порта подобным способом
лучше не стоит:
if(input(ind_yellow)) output_low(ind_yellow);
else output_high(ind_yellow);
Странно...
Просто в прошлом проекте (еще на ассемблере)
один из битов порта одновременно отвечал
за включение/выключение светодиода
и в то же время являлся флагом дежурного режима,
т.е. я его не только переключал, но и читал,
чтобы узнать в каком режиме сейчас нахожусь.
А тут какая канитель возникла
Пришлось в качестве флага дополнительно
глобальную переменную вводить.
Но это еще полбеды,
решил наконец то перейти к подключению датчиков,
в старом проекте они обрабатывались прерыванием RB
(по перепаду уровня на RB4-RB7)
- все работало замечательно.
А что же тут -
активизировал это прерывание,
тихий ужас:
в общем судя по реакции МК
его с первых секунд после включения
не переставая бомбят этим прерыванием,
хотя к этим линиям вообще ничего не подключено!
блин я все понял: просто чертова хрень этот CCS
наворочал чего попало
надо обратно на ассемблер переходить
|
|
|
|
07.07.2007, 22:30
|
|
Прописка
Регистрация: 15.10.2006
Сообщений: 130
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 1 сообщении
|
"File does not exist anymore"
- нет ли у вас другого источника
|
|
|
|
07.07.2007, 22:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
плиз
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:20.
|
|