Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
27.11.2006, 19:46
|
|
Временная регистрация
Регистрация: 14.09.2006
Сообщений: 58
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 1 сообщении
|
Передача по PSP (Parallel Slave Port) для PIC
Проблема в том, что
если в функции SendChars паузу сделать 50 мкс, то почему-то данные переданные ведомому контроллеру
не будут успевать выводиться им по RS???
Прога для контроллера №1
Код:
|
#include ‹18F452.h›
#device adc=10
#device high_ints=true
void SetSpeed (char MD, int32 V);
void SendChars (char *Buf, unsigned int n);
int8 ReadDataPsp (void);
//************************************************** ***********
#fuses HS,NOWDT,NOPROTECT,NOLVP
#opt 9
#use delay(clock=10000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,bits=8,ERRO RS)
//************************************************** ***********
// Байты
#byte TRISE = 0xF96
#byte PORTD=0xF83
#byte PORTE=0xF84
#byte PIE1=0xF9D
// Биты
#bit RE0 = PORTE.0
#bit RE1 = PORTE.1
#bit TXIE=PIE1.4
//************************************************** ***********
union LongByte
{
char b[4];
int32 l;
};
int next_in = 0;
int next_out = 0;
short data_lost = TRUE;
void main ()
{
set_tris_e(0b11111100);
set_tris_d(0b00000000);
PORTE = 0;
while(1)
{
SetSpeed (0xF0, 0xF1F2F3F4);
ReadDataPsp();
}
}
// Работа с PSP портом
void SetSpeed (char MD, int32 V)
{
char Buf[6]; // Буфер для хранения команды
union LongByte TmpV;
TmpV.l = V;
Buf[0] = MD;
Buf[1] = 0x01;
Buf[2] = TmpV.b[0];
Buf[3] = TmpV.b[1];
Buf[4] = TmpV.b[2];
Buf[5] = TmpV.b[3];
SendChars(Buf, 6);
}
//************************************************** ****
void SendChars (char *Buf, unsigned int n)
{
unsigned int i;
for (i = 0 ; i ‹ n; i++)
{
RE1=1;RE0=1;
delay_ms(50); // Пауза на 50 мс
PORTD = Buf[i];
RE1 = 0;RE0 = 1;
}
}
int8 ReadDataPsp (void)
{
int8 dataPsp;
set_tris_d(0b11111111); // Установка порта D на вход
RE0=0;RE1=1; // Установка CS=0; RD=0; WR=1 - запрос на чтение данных
delay_us(50); // Задержка 50 мкс
dataPsp = PORTD; // Считывание данных с порта D в переменную dataPsp
RE0=1;RE1=1; // Установка CS=0; RD=1; WR=1
set_tris_d(0b00000000); // Установка порта D на выход
//************************************************** **************
// Вывод на RS
putc(dataPsp);
while(TXIE); // Ожидаем освобождения передатчика
//************************************************** **************
return dataPsp;
} |
Прога для контроллера №2
Код:
|
#include ‹18F452.h›
#device adc=10
#device high_ints=true
//************************************************** ***********
#fuses HS,NOWDT,NOPROTECT,NOLVP
#opt 9
#use delay(clock=10000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,bits=8,ERRO RS)
//************************************************** ***********
#define BUFFER_SIZE 96
// Байты
#byte TRISE = 0xF96
#byte PORTD=0xF83
#byte PORTE=0xF84
#byte PIE1=0xF9D
// Биты
#bit RE0 = PORTE.0
#bit RE1 = PORTE.1
#bit TXIE=PIE1.4
//************************************************** ***********
int next_in = 0;
int next_out = 0;
short data_lost = FALSE;
#int_psp
void psp_isr()
{
if(psp_overflow()) data_lost=TRUE;
if (TRISE & 0x80) // Если запись в PSP порт произошла
{
write_bank(2, next_in++, psp_data); // пишем во второй банк
if(next_in == BUFFER_SIZE)
next_in = 0;
}
else // Если чтение из PSP порта произошло
{
static int8 i=0;
output_D(i++);
}
}
void main ()
{
psp_data = 0;
setup_psp(PSP_ENABLED);
enable_interrupts(GLOBAL);
enable_interrupts(INT_PSP);
while(1)
{
if(next_in!=next_out)
{
//************************************************** *************************
putc(read_bank(2,next_out));
while(TXIE); // Ожидаем освобождения передатчика
//************************************************** *************************
if(++next_out==BUFFER_SIZE)
next_out=0;
if(data_lost)
{
printf("
Data lost
");
data_lost = FALSE;
}
}
}
} |
-- Прилагается рисунок: --
Прикрепленный файл: 3677513.rar
|
|
|
|
28.11.2006, 01:22
|
|
Прописка
Регистрация: 03.08.2006
Сообщений: 267
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Извиняюсь, я, собственно, не по коду, а по схеме. Может быть правильней вывод 25 U1(RE0/_RD/AN5) соединить с выводом 26 U4(RE1/_WR/AN6) и, соответственно, выв. 26 U1 с выв. 25 U4?
С уважением, Mike18.
|
|
|
|
28.11.2006, 07:18
|
|
Временная регистрация
Регистрация: 14.09.2006
Сообщений: 58
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 1 сообщении
|
Сообщение от mike18
|
Извиняюсь, я, собственно, не по коду, а по схеме. Может быть правильней вывод 25 U1(RE0/_RD/AN5) соединить с выводом 26 U4(RE1/_WR/AN6) и, соответственно, выв. 26 U1 с выв. 25 U4?
С уважением, Mike18.
|
Ну может быть вы и правы. Но все-таки и программно можно так реализовать...
|
|
|
|
29.11.2006, 03:57
|
|
Прописка
Регистрация: 03.08.2006
Сообщений: 267
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Сообщение от moyaproba
|
Ну может быть вы и правы. Но все-таки и программно можно так реализовать...
|
Наверно, всё таки не прав. Совершенно искренне заблуждался насчёт PSP. Нет у него аппаратного режима "мастер" (А если бы и был...?). Он, собственно, и называется параллельный ведомый. Поленился сразу референц мануал посмотреть.
С уважением, Mike18.
|
|
|
|
29.11.2006, 20:23
|
|
Временная регистрация
Регистрация: 14.09.2006
Сообщений: 58
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 1 сообщении
|
Сообщение от mike18
|
Сообщение от moyaproba
|
Ну может быть вы и правы. Но все-таки и программно можно так реализовать...
|
Наверно, всё таки не прав. Совершенно искренне заблуждался насчёт PSP. Нет у него аппаратного режима "мастер" (А если бы и был...?). Он, собственно, и называется параллельный ведомый. Поленился сразу референц мануал посмотреть.
С уважением, Mike18.
|
Да да вы не правы были и без всяких наверно. Мастером он будет без всяких аппаратных средств, как обычный порт, т.к. иначе он будет реагировать на свои прерывания...
Меня вот сейчас интересует тот вопрос, с какой вообще с частотой может обмениваться по нему?
И насчет того что в протеусе, при увеличении скорости обмена, второй контроллер не успевает выводит по RS...
|
|
|
|
29.11.2006, 21:32
|
|
Прописка
Регистрация: 03.08.2006
Сообщений: 267
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Сообщение от moyaproba
|
Да да вы не правы были и без всяких наверно. Мастером он будет без всяких аппаратных средств, как обычный порт, т.к. иначе он будет реагировать на свои прерывания...
|
Вот здесь я готов поспорить. В режиме аппаратного мастера параллельный порт мог бы без Вашего участия, то есть самостоятельно формировать синхросигналы записи и чтения ведомому контроллеру, а не получать их, что в том числе отразилось бы и на скорости обмена. Но, что говорить о том, чего у него нет. Бедный, бедный Слейв .
|
|
|
|
29.11.2006, 21:54
|
|
Временная регистрация
Регистрация: 14.09.2006
Сообщений: 58
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 1 сообщении
|
Сообщение от mike18
|
Сообщение от moyaproba
|
Да да вы не правы были и без всяких наверно. Мастером он будет без всяких аппаратных средств, как обычный порт, т.к. иначе он будет реагировать на свои прерывания...
|
Вот здесь я готов поспорить. В режиме аппаратного мастера параллельный порт мог бы без Вашего участия, то есть самостоятельно формировать синхросигналы записи и чтения ведомому контроллеру, а не получать их, что в том числе отразилось бы и на скорости обмена. Но, что говорить о том, чего у него нет. Бедный, бедный Слейв .
|
На то он и Parallel Slave Port . Жалко что аналогичного мастера в нем нету, не помешал бы, с этим соглашусь...
Назывался бы тогда PMP
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:50.
|
|