Перейти к содержанию
    

BlackJack

Участник
  • Постов

    16
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о BlackJack

  • Звание
    Участник
    Участник

Контакты

  • ICQ
    Array
  1. Кто-нибудь работает с pick&place машинами TWS QUADRA Laser? Вопрос собсно про формат файлов для них. Не можем заставить работать так, как нам надо.
  2. Исходник я дам, не проблема, но в стуктуре данных будешь сама разбираться. CRC не считал, а использовал обычную контрольную сумму. Передающую часть сама разберешь. #define x_crc 1 #define x_ptr 2 #define x_use 3 #define x_cta 4 #define x_end 5 #define x_data 6 #define tx_ptr 0 #define Crc_Init FEND #define MAX_Pack_sz MAX_FRAME_SIZE - 3 #define PreambulaTime 4 #define FESC 0xDB #define FEND 0xC0 #define TFESC 0xDD #define TFEND 0xDC #define tx_end 1 //FESC=> FESC+TFESC //FEND=> FESC+TFEND typedef void (*LRead_CallBack) (signed char); typedef struct { unsigned char Pre;//Предыдущий байт unsigned char Crc; unsigned char Ptr;//указатель текущего байта в буфере unsigned char Ready;//флаг готовности буфера unsigned char CTA;//флаг синхронизации со тсартовым байтом unsigned char End;//указатель на последний байт в буфере //unsigned char Length;//Длина пакета unsigned char Frame[MAX_Pack_sz]; } TFrameBuf; //-****************************************-/ //-* interrupt handled uart reсеiver / //-**************************************** #pragma vector=RS485_RXC_VECTOR __interrupt void USART1_RXC_interrupt( void ) { register char Sdata,temp; Sdata=RS485_PORT; if (Sdata==FEND){ //получен старт, синхронизируемся RX_driver_Errorlevel=Sinc_err; Frame_buf.CTA=1; Frame_buf.Ptr=x_end;//=6, последний байт заголовка перед буфером if(Frame_buf.Ready)RX_driver_Errorlevel=Buf_overrun;//Set ErrorLevel Frame_buf.Ready=0; Frame_buf.Crc=Crc_Init;//то есть =FEND Frame_buf.End=MAX_Pack_sz+x_end;//потом подрихтуется????????????????? } else if (Frame_buf.CTA)//sinchronized { temp=Frame_buf.Pre; Frame_buf.Pre=Sdata; if (temp==FESC){ if ((Sdata!=TFESC)|(Sdata!=TFEND)) {Frame_buf.CTA=0; RX_driver_Errorlevel=Sinc_err; //Set ErrorLevel } ; if (Sdata==TFESC) {Sdata=FESC;}; if (Sdata==TFEND) {Sdata=FEND;}; } else {// No STuffing if (Sdata!=FESC){//proceed byte if (Frame_buf.Ptr==x_end){//first simbol is length if(Sdata> MAX_Pack_sz)Frame_buf.End=MAX_Pack_sz+x_data; else Frame_buf.End=Sdata+x_data; }; Frame_buf.Frame[Frame_buf.Ptr-x_end]=Sdata; //Store Byte //в том числе и CRC! Frame_buf.Ptr++; if (Frame_buf.Ptr >Frame_buf.End ){ //pack recd if (Frame_buf.Crc==Sdata){// crc ok RX_driver_Errorlevel= RX_OK; Frame_buf.Ready=1; Frame_buf.CTA=0; if ( LL_ReadCallback!=NULL)LL_ReadCallback(Frame_buf.Frame[0]); //В этом колбаке просто ставится флажок, что данные прибыли } else {//bad crc Frame_buf.Ready=0; Frame_buf.CTA=0; RX_driver_Errorlevel=BadCrc; }; } else {Frame_buf.Crc+=Sdata;};// pack rcd };//proceed }; //no stuffing }//Sinchronized };
  3. Я разбирался. В конце концов написал свой обработчик на С, работает уже давно. Не думаю, что он проще. Тоже надо въезжать. Пишите на С сами, ничего военного. Вот комменты к моей проге прием синхронизируется по старт байту FEND Следующий за стартовым байт -длина фрейма без учета байт-стаффинга и контрольной суммы. Байт стаффинг делается на лету. Контрольная сумма вычисляется тут же и если соответствует, то вызывается CallBack с errorlevel=CRC_OK, иначе errorlevel=BadCRC errorlevel выставляется также в случаях потери синхронизации и затирании несчитанного фрейма
  4. Работа с DS1305(6)

    Я раьотал с 1305 , но давно. Из фишек помню только то, что если напряжение на батарейном питании есть и оно ниже чем на просто питании, они не ходят. Ну а код посмотрю, если в старых проектах найду, выложу. вот что нашел. Это работало. камень 8535 #define wait1 __delay_cycles(200) #define wait5 __delay_cycles(480) #define onRTC PORTD|=0x80; #define offRTC PORTD&=~0x80; #define wSPI while (!(SPSR & 0x80)) // тнициализация DS1305 //---------------------------- for (j=0;j<=2;j++) {// онициялизация регистров управления onRTC; wait1; SPCR = 0x5f; //0x5C; //вкл SPI SPDR=0x8f; //адрес CR wSPI; // SPDR=j; //вкл OSC, off WR, потом вкл реж прерывания INT0 wSPI; // SPCR = 0x00; //выкл SPI offRTC; wait50; }; //----------------------------------------- //----------------------------------------- wait50; onRTC;// PORTD|=0x80; wait1; SPCR = 0x5f; //0x5C; //вкл SPI SPDR=0x87; //адрес pfgbcb wSPI; // //07h SPDR = 0x80; // записываем Al0 sec , без маски wSPI; // SPDR = 0x80; // записываем Al0 min с маской. wSPI; // SPDR = 0x80; // записываем Al 0hr wSPI; // SPDR = 0x80; // записываем Al 0day wSPI; // //0bh SPDR = 0x80; // записываем Al 1sec , без маски?если надо раз в минуту wSPI; // SPDR = 0x80; // записываем Al 1min с маской. wSPI; // SPDR = 0x80; // записываем Al 1hr wSPI; // SPDR = 0x80; // записываем Al 1day wSPI; // SPCR = 0x00; //выкл SPI offRTC;//PORTD&=~0x80; wait50; //--------Прпочитаем время, чтобы сбросить прерывание--------------------- onRTC; wait1; SPCR = 0x5f; //0x5C; //вкл SPI SPDR=0; //адрес чтения часов wSPI; // for (j=0;j<=18;j++){ SPDR = 0xFF; // з wSPI; // i = SPDR; // //Sendchar(i); };
  5. из флєш - в уарт

    Что именно не работает? и при чем здесь экран? программ передачи байта живая?
  6. LQFP в срочном заказе

    Резонит может делать футпринты LQFP, то есть с шагом 0,5мм ? При срочном изготовлении, естественно.. Зазор между площадками получается 7мил или 0,18 мм. Да и фанауты нужно сделать...
  7. Глюк UART

    Модель памяти сделай Small а не Tiny, там же -в сетапе.
  8. Пиши вот в таком духе, легче будет разбираться. Это для меги88, но сути не меняет. работает. А дергать ногой лучче так PORTx^=1<<PxX void InitTimerDriver(void) {//Настройка таймеров и счетчиков-------------------------- // счет по переполнению (1 мс) TCCR0B=(1<<CS00)|(1<<CS01);// prescaler 64==172.8kHz TCNT0=RELOAD_T0_VALUE; //=255-173 TIMSK0|=(1<<TOIE0);//|(1<<TOIE1) ; // разрешить прерывания по переполнению TIFR0|=(1<<TOV0); //сбросим флаг, который мог появиться от маленьких зелененьких человечков }; /*обработчик прерываний таймера*/ #pragma vector=TIMER0_OVF_vect __interrupt void timer_interrupt(void) { // Вызов функции для обработки очереди таймеров TimersHandler(); TCNT0=RELOAD_T0_VALUE;// 1мс ReloadTimer(); }
  9. USART

    Фигня :). у меня адм485 переключается сразу. в том смысле, что передернул вывод, а следующей командой можно в UDR писать. на 38400 начало не глотает, проверено. Хотя по сути рс485 вначале и должна идти преамбула=активная пауза. Флаги-то зачем? используй прерывание. Все равно UDR надо прочитать, даже если была ошибка фрейминга. А еще с АДМ бывает такая фишка: без растягивающих резисторов она иногда работает лучше.
  10. USART

    Что-то похожее на лечение гланд. Зачем нужны все эти задержки? получил флаг TXC после последнего байта пакета -значит можно переключится на прием и просто ждать RXC.
  11. Постой-ка. Почему 0,5 с??? там вроде бы преобразование 800 мс длится... Замедляйся. и скорость СМбас тоже пониже сделай, на всякий случай.
  12. Если для локации использована ЛЧМ, то лучший способ -согласованная фильтрация. По смыслу-та же автокорреляция. Литературы -море. На бумаге. Навскидку -Баскаков или Гоноровский с радиотехническими цепями и сигналами - для общего развития. Для более детального -Рабинер с Гоулдом, куда ж без них. По деталям - надо смотреть бумажную литературу.
  13. Немного непонятно из вопроса: различаются именно соседние измерения, или дрейфус плавный? Дело в том, что у меня в прибор заложен этот чип и вчера я тормознул закупку...
  14. Любой ФНЧ повернет фазу, другое дело , насколько. Если делать не сильно навернутый и срез не слишком близко к измеряемой частоте, то и сдвиг будет маленький, и самое главное, заренее известный. Думаю, от активного фильтра не увернуться, иначе так и будешь блох ловить.
×
×
  • Создать...