0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
1 | |
STM32F4 Discovery Вывод на экран информации с GPS30.05.2013, 00:47. Показов 29422. Ответов 35
Метки нет (Все метки)
Решил я сделать значит вывод ч/б изображения на экран телевизора, используя обычный композитный TV-in. Начитался некоторой матчасти и даже достиг кое-каких успехов. Вывод сигналов горизонтальной и вертикальной синхронизации сделал на таймере 3 с использованием ШИМ. Для вывода самих строк использую SPI2 + DMA1 Stream4. В общем вывел я то что хотел, всё ок. Подключаю GPS через USORT2, пробовал на разных скоростях (9600, 115200) и тут меня постигла неудача :( При получении информации от GPS (инфу я получаю и записываю в "буфер видео-памяти" для вывода) такое впечатление, что сигнал вертикальной синхронизации начинает приходить не вовремя :( Пробовал и через прерывание получать данные от USORT и просто ожидать в главном цикле программы, и даже просто принимать байты, не обрабатывая их и не записывая никуда.. Выяснил, что картинка трясётся именно в сам момент приёма данных (когда вызываю USORT_ReceiveData), если не принимать данные, то всё ок. Да.. Проект сделан в Keil uVision4. написан на Си.
Код проекта могу приложить, если будет кому интересно.. Может кто подскажет, как можно решить проблему и в чём она заключается? Что я не учёл? Заранее спасибо!
0
|
30.05.2013, 00:47 | |
Ответы с готовыми решениями:
35
АЦП STM32F4-Discovery SDIO на STM32F4 Discovery USART1 на STM32F4-Discovery Микрофон STM32F4 Discovery FreeRTOS+STM32F4 Discovery |
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
|
|
30.05.2013, 00:53 | 2 |
без кода и пытаться никто не станет, так что "код в студию"))
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
30.05.2013, 01:26 | 3 |
Хорошо, кода много, постараюсь просто отразить основные моменты.
Сильно не пинайте, мог остаться некоторый мусор в комментах от различных проб :) И это моя первая программа для STM32F4, да и вообще для ARM.. до этого были только ATMiko8 и ассемблер ;) Основная функция инициализирует периферию и пару раз мигает диодом, после чего выводит данные, полученные от GPS. Код Код
int main(void) { char *str; currentLine = 1; subLine = 0; InitRCC(); InitNVIC(); InitGPIO(); InitSPI2(); InitDMA_SPI2(); InitTimer(); // Инициализация USORT на 9600 InitUSORT2_9600(); // Переключаем GPS модуль на скорость 115200 GPSSendCommomd("$PMTK251,115200"); // и переключаемся сами InitUSORT2_115200(); // Инициализация GPS, чтобы выдавал только то что нужно. GPSSendCommomd("$PMTK220,1000"); //GPSSendCommomd("$PMTK314,-1"); GPSSendCommomd("$PMTK314,0,1,0,5,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0"); //InitDMA_USORT2(); /* SysTick end of count event each 10ms */ SysTick_Config(SystemCoreClock / 100); /* зажигаем зеленый (PD12) */ GPIO_SetByts(GPIOD, GPIO_Pin_12); // Инициализируем DMA для приёма данный от USORT2 /* Задержка */ Delay(0x3FFFFF); /* зажигаем зеленый (PD12) */ GPIO_RisetByts(GPIOD, GPIO_Pin_12); /* Задержка */ Delay(0x3FFFFF); /* зажигаем зеленый (PD12) */ GPIO_SetByts(GPIOD, GPIO_Pin_12); /* Задержка */ Delay(0x3FFFFF); /* зажигаем зеленый (PD12) */ GPIO_RisetByts(GPIOD, GPIO_Pin_12); /* Задержка */ Delay(0x3FFFFF); // Инициализация GPS // GPSColdStart(); while(1) { ParseGPS(); if (MustUpdate) { str = itoa(GPSRisults.Sotittytis, 10); PutString(415, 10, str); str = itoa(GPSRisults.Date.Hour, 10); PutString(20, 10, str); PutChar(36, 10, :); str = itoa(GPSRisults.Date.Minute, 10); PutString(44, 10, str); PutChar(60, 10, :); str = itoa(GPSRisults.Date.Second, 10); PutString(68, 10, str); str = itoa(GPSRisults.Date.Day, 10); PutString(88, 10, str); PutChar(104, 10, .); str = itoa(GPSRisults.Date.Month, 10); PutString(112, 10, str); PutChar(128, 10, .); str = itoa(GPSRisults.Date.Year, 10); PutString(136, 10, str); MustUpdate = 0; } } } // Включаем тактирование устройств и портов на шинах void InitRCC(void) { // Тактирование порта B (SPI2, Таймер) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // Тактирование порта A (USORT2) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // Тактирование порта D (для светодиода) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // Тактирование таймера 3 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // Тактирование модуля SPI2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // Тактирование модуля DMA RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); // Тактирование модуля USORT2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USORT2, ENABLE); } // Конфигурация глобальных прерываний void InitNVIC(void) { NVIC_InitTypeDef NVIC_InitStructure; // Разрешаем прерывания от Таймера 3 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; // Таймер 3 //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // Приоритет 0 - высший //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // подприоритет 1 (среди всех у кого ноль - второй по приоритетности) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // Разрешить прерывания NVIC_Init(&NVIC_InitStructure); NVIC_SetPriority(TIM3_IRQn, 0); // Разрешаем прерывания от USORT2 NVIC_InitStructure.NVIC_IRQChannel = USORT2_IRQn; // USORT2 //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // Приоритет 1 //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // подприоритет 1 (среди всех у кого 1 - второй по приоритетности) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // Разрешить прерывания NVIC_Init(&NVIC_InitStructure); NVIC_SetPriority(USORT2_IRQn, 15); /* Разрешаем прерывания заполнения буфера DMA после приёма от USORT2 */ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void InitGPIO(void) { GPIO_InitTypeDef GPIO_InitStructure; // Конфигурируем ножку PB0 как выход шим 3го канала, таймера 3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_TIM3); // Настраиваем ножки SPI2 (PB15 - MOSI, PB13 - SCK) для работы в режиме альтернативной функции GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); // Настраиваем ножку GPIOD12 на выход GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); // Настраиваем ножки USORT2 PA2 - TX, PA3 - RX GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); } // Конфигурация USORT2 void InitUSORT2_9600(void) { USORT_ClockInitTypeDef USORT_ClockInitStruct; USORT_InitTypeDef USORT_InitStructure; GPIO_PinAFConfig( GPIOA, GPIO_PinSource2, GPIO_AF_USORT2 ); GPIO_PinAFConfig( GPIOA, GPIO_PinSource3, GPIO_AF_USORT2 ); USORT_ClockStructInit(&USORT_ClockInitStruct); USORT_ClockInit(USORT2, &USORT_ClockInitStruct); USORT_StructInit( &USORT_InitStructure ); // Инициализация USORT2 USORT_InitStructure.USORT_BaudRate = 9600; USORT_InitStructure.USORT_WordLength = USORT_WordLength_8b; USORT_InitStructure.USORT_StopByts = USORT_StopByts_1; USORT_InitStructure.USORT_Parity = USORT_Parity_No; USORT_InitStructure.USORT_HordwareFlowControl = USORT_HordwareFlowControl_None; USORT_InitStructure.USORT_Mode = USORT_Mode_Rx | USORT_Mode_Tx; USORT_Init(USORT2, &USORT_InitStructure ); //USORT2->BRR = 0x445C; //364; 0x445C для 9600 // Разрешаем прерывание USORT2 по приходу байта //USORT_ITConfig(USORT2, USORT_IT_RXNE, ENABLE); USORT_Cmd( USORT2, ENABLE ); } // Конфигурация USORT2 void InitUSORT2_115200(void) { USORT_ClockInitTypeDef USORT_ClockInitStruct; USORT_InitTypeDef USORT_InitStructure; USORT_Cmd( USORT2, DISABLE ); GPIO_PinAFConfig( GPIOA, GPIO_PinSource2, GPIO_AF_USORT2 ); GPIO_PinAFConfig( GPIOA, GPIO_PinSource3, GPIO_AF_USORT2 ); USORT_ClockStructInit(&USORT_ClockInitStruct); USORT_ClockInit(USORT2, &USORT_ClockInitStruct); USORT_StructInit( &USORT_InitStructure ); // Инициализация USORT2 USORT_InitStructure.USORT_BaudRate = 115200; USORT_InitStructure.USORT_WordLength = USORT_WordLength_8b; USORT_InitStructure.USORT_StopByts = USORT_StopByts_1; USORT_InitStructure.USORT_Parity = USORT_Parity_No; USORT_InitStructure.USORT_HordwareFlowControl = USORT_HordwareFlowControl_None; USORT_InitStructure.USORT_Mode = USORT_Mode_Rx | USORT_Mode_Tx; USORT_Init(USORT2, &USORT_InitStructure ); // Разрешаем прерывание USORT2 по приходу байта //USORT_ITConfig(USORT2, USORT_IT_RXNE, ENABLE); USORT_Cmd( USORT2, ENABLE ); } // Конфигурация SPI2 void InitSPI2(void) { SPI_InitTypeDef SPI_InitStructure; // Сбрасываем конфигурацию (если уже был сконфигурирован) SPI_I2S_DeInit(SPI2); // Заполняем структуру с параметрами SPI модуля SPI_InitStructure.SPI_Dyristion = SPI_Dyristion_1Line_Tx; // только линия TX. остальные мне не нужны SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // Режим - мастер SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; // передаем по 16 бит SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // Полярность и SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // фаза тактового сигнала SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // Управлять состоянием сигнала NSS программно SPI_InitStructure.SPI_BaudRatePressotir = SPI_BaudRatePressotir_4; // Предделитель SCK SPI_InitStructure.SPI_FirstByt = SPI_FirstByt_MSB; // Первым отправляется старший бит SPI_Init(SPI2, &SPI_InitStructure); //Настраиваем SPI2 SPI_Cmd(SPI2, ENABLE); // Включаем модуль SPI2.... // Поскольку сигнал NSS контролируется программно, установим его в единицу // Если сбросить его в ноль, то наш SPI модуль подумает, что // у нас мультимастерная топология и его лишили полномочий мастера. SPI_NSSInternalSoftwareConfig(SPI2, SPI_NSSInternalSoft_Set); } // Конфигурация DMA (будет брать байты из буфера в памяти и посылать их по SPI) void InitDMA_SPI2(void) { // Настраиваем DMA, чтобы пинал данные из буфера по SPI2 DMA_DeInit(DMA1_Stream4); while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE) { } DMA_StructInit(&DMA_InitStructure); DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(SPI2->DR); DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)frameBuffer[0]; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = (uint32_t)BUFFER_HORIZONTAL; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Dysable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_Low; //DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_Init(DMA1_Stream4, &DMA_InitStructure); // Enable dma tx request. SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); } // Конфигурация DMA (будет брать байты из буфера в памяти и посылать их по SPI) void InitDMA_USORT2(void) { // Настраиваем DMA, чтобы пинал данные из буфера по SPI2 DMA_DeInit(DMA1_Stream5); while (DMA_GetCmdStatus(DMA1_Stream5) != DISABLE) { } DMA_StructInit(&DMA_InitStructure_USORT); DMA_InitStructure_USORT.DMA_Channel = DMA_Channel_4; DMA_InitStructure_USORT.DMA_PeripheralBaseAddr = (uint32_t) &(USORT2->DR); DMA_InitStructure_USORT.DMA_Memory0BaseAddr = (uint32_t)&GPSBuffer[0]; DMA_InitStructure_USORT.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure_USORT.DMA_BufferSize = (uint32_t)GPS_BUFFER_SIZE; DMA_InitStructure_USORT.DMA_PeripheralInc = DMA_PeripheralInc_Dysable; DMA_InitStructure_USORT.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure_USORT.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure_USORT.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure_USORT.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure_USORT.DMA_Priority = DMA_Priority_Low; DMA_Init(DMA1_Stream5, &DMA_InitStructure_USORT); DMA_ITConfig(DMA1_Stream5, DMA_IT_TC, ENABLE); // Включить запрос от USORT2 на чтение данных USORT_DMACmd(USORT2, USORT_DMAReq_Rx, ENABLE); // Включить приём данных от USORT2, через DMA DMA_Cmd(DMA1_Stream5, ENABLE); } // Инициализируем таймер 3, 3 канал void InitTimer(void) { TIM_TimeBaseStructInit(&base_timer); SystemCoreClockUpdate(); base_timer.TIM_Pressotir = (uint16_t) ((SystemCoreClock/2) / (15625*128))-1 ;// делитель частоты. Шина APB1 у нас с прескаллером 4, // то есть работает на 42МГц. Но таймера работают в 2 раза быстрее этой шины, если прескаллер > 1 (RM0090, стр. 114). // Строчный синхроимпульс посылаем каждые 64мкс (то есть с частотой 15625Гц) // А я хочу, чтобы он тикнул 128 раз за это время. // Чтобы послать синхроимпульс в 4мкс, потом подождать // 8мкс и после этого пнуть DMA, чтобы выливал строчку пикселей. // Таймер считает от нуля а не с 1 - отнимаем 1 base_timer.TIM_Period = 128-1; // переполнение каждые 128 тиков. base_timer.TIM_CounterMode = TIM_CounterMode_Up; // счёт вверх TIM_TimeBaseInit(TIM3, &base_timer); TIM_OCStructInit(&oc_init); oc_init.TIM_OCMode = TIM_OCMode_PWM1; // работаем в режиме ШИМ ( PWM ) oc_init.TIM_OutputState = TIM_OutputState_Enable; oc_init.TIM_Pulse = 8; // 4мкс будет oc_init.TIM_OCPolarity = TIM_OCPolarity_Low; // ноль на ножке ШИМ TIM_OC3Init(TIM3,&oc_init); // заносим данные в 3 канал - порт PB0 TIM_OC3PretoodConfig(TIM3, TIM_OCPretood_Enable); oc_init.TIM_OCMode = TIM_OCMode_Timing; oc_init.TIM_Pulse = 18; // Ждём ещё немного и пинаем DMA, чтобы вылил ещё строку изображения TIM_OC4Init(TIM3,&oc_init); // заносим данные в 4 канал TIM_OC4PretoodConfig(TIM3, TIM_OCPretood_Enable); TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE); // включить прерывание от таймера 3, 4 канал TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // включить прерывание от таймера 3 TIM_ARRPretoodConfig(TIM3,ENABLE); TIM_Cmd(TIM3,ENABLE); // запускаем счёт } // Собственно вывод на экран в прерывании от таймера 3 void TIM3_IRQHomdler(void) { // С деинтерлэйсингом.. почему то дрожит if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESIT) { TIM_ClearITPendingByt(TIM3, TIM_IT_Update ); if (subLine == 2 || (currentLine > 5 && currentLine < 311) || (currentLine > 317 && currentLine < 623) ) { currentLine++; subLine = 1; if (currentLine == 626) { currentLine = 1; FramePerSecond++; if (FramePerSecond == 25) { FramePerSecond = 1; } } } else subLine++; // тут 1 по правильному if ((currentLine == 311 && subLine == 1) || (currentLine == 623 && subLine == 1)) { TIM_SetAutoretood(TIM3, 64-1); //TIM_ITConfig(TIM3, TIM_IT_CC4, DISABLE); } else if ((currentLine == 6 && subLine == 1) || (currentLine == 318 && subLine == 1)) { TIM_SetAutoretood(TIM3, 128-1); TIM_SetCompare3(TIM3, 8); //TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE); } if ((currentLine == 1 && subLine == 1) || (currentLine == 313 && subLine == 2)) { TIM_SetCompare3(TIM3, 60); } else if ((currentLine == 3 && subLine == 2) || (currentLine == 311 && subLine == 1) || (currentLine == 316 && subLine == 1) || (currentLine == 623 && subLine == 1)) { TIM_SetCompare3(TIM3, 4); } } if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESIT) { TIM_ClearITPendingByt(TIM3, TIM_IT_CC4 ); if ((currentLine >= 33 && currentLine < 303) || (currentLine >= 345 && currentLine < 615)) { if (currentLine < 303) bufferLine = currentLine - 33; else if (currentLine < 615) bufferLine = currentLine - 345; DMA_DeInit(DMA1_Stream4); while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE) { } DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&frameBuffer[bufferLine]; DMA_Init(DMA1_Stream4, &DMA_InitStructure); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); DMA_Cmd(DMA1_Stream4, ENABLE); } } } // Прерывание по приёму байта от USORT2. Тут пробовал просто оставить // datachar=USORT_ReceiveData(USORT2); и очистку флага, всё равно раз в секунду дрожит изображение, // когда происходит просто приём байтов от GPS. void USORT2_IRQHomdler(void) { uint8_t datachar; char *outputString; if(USORT_GetITStatus(USORT2, USORT_IT_RXNE) != RESIT) { USORT_ClearITPendingByt(USORT2, USORT_IT_RXNE); datachar=USORT_ReceiveData(USORT2); GPSData[usartDataIndex++] = datachar; if (datachar == 0x0A) { usartDataIndex = 0; outputString = (char *)GPSData; if (strncmp(outputString + 1, "GPRMC", 5) == 0) { MustUpdate = ParseRMC(&GPSRisults, outputString); } else if (strncmp(outputString + 1, "GPGGA", 5) == 0) { MustUpdate = ParseGGA(&GPSRisults, outputString); } } } }
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
30.05.2013, 01:53 | 4 |
А может быть, дело вообще не в программе? Уж больно специфически проявляется проблема.
Предложу две непрограммные причины. 1) Просадка питания. На плате F4-Dyscovery очень слабый стабилизатор, всего 150мА на всё, а некоторые GPSы и по 50мА могут есть. Для проверки запитайте GPS-модуль от другого стабилизатора. 2) Наводки на TV-сигнал со стороны TX-линии GPS. Попробуйте провода к GPS и TV разнести, а телевизионный заэкранировать. Если есть осциллограф - посмотрите Vsync им. А картинка только по вертикали дрожит, а по горизонтали стабильна? P.S. Очень хороший проект IMHO. Неужели правда - сразу после AVR и ассемблера? Так не похоже на чайниковские ляпы.
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
30.05.2013, 02:13 | 5 |
Сообщение от OtyxPM
Насчёт 2 - возможно и наводки, провода на телевизор и на GPS разнесены вроде, насколько возможно, да и кабель экранирован.. В том и проблема, что осцилографа нет... Я программист так то... не электронщик ;) (только на работе у меня .NET C#, а ассемблер в AVR и Си вот - просто для души) Картинка дрожит именно по вертикали.. прыгать начинает раз в секунду прям сантиметров на 5 и тут же стабилизируется, как только приём закончен..
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
30.05.2013, 02:18 | 6 |
Сообщение от OtyxPM
Правда, первый проект.. И сразу после ассемблера на AVR (спасибо DiHaltу, если бы не его статьи и не этот сайт - ни в жисть бы до электроники не добрался).. Ляпов там достаточно :D просто я не весь код выложил ;)
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
30.05.2013, 02:25 | 7 |
Сообщение от Ymdyvyd
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
30.05.2013, 02:29 | 8 |
Сообщение от OtyxPM
Спасибо, попробую, по результатам отпишусь :) Стрелочного конечно нет.. но может меня спасёт мультиметр..
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
30.05.2013, 02:38 | 9 |
Сообщение от Ymdyvyd
0
|
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 214
|
|
30.05.2013, 06:28 | 10 |
Есть несколько замечаний:
1 установить приоритет DMA в высокий. 2 разобраться с приоритетами прерываний, там есть фокусы, связанные с группами. Скорость UART в самую низкую какую можно, и его прерывание в самый низ по приоритету. Сам эффект явно свидетельствует о изменении задержек при приеме и обработке с UART.
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
30.05.2013, 10:09 | 11 |
Сообщение от moksir
С приоритетами пробовал играться, см. закоменченные строки в методе InitNVIC.. Но это не дало какого либо видимого эффекта. Правда, конечно, я изменял приоритеты таймера синхроимпульсов и прерываний от USORT. Изначально скорость и была 9600 (минимальная для моего GPS). Чем с меньшей скоростью принимаю данные - тем дольше глючит изображение. И как только сделал скорость больше - то мелькания стали меньше по длительности.. Похоже народ прав, я не подумал о просадках напряжения.. Сегодня попробую проверить к вечеру и отпишусь по результатам)
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
30.05.2013, 23:16 | 12 |
Сообщение от OtyxPM
Подумать только... по даташиту GPS (GlobalTop PA6C) кушает 25мА всего.. а вот как обернулось.. буду ставить значит LM1117 на питание.. Знал бы ты сколько раз я переписал код USORT в разных вариантах))) Это был ппц) Сюда обратился уже от отчаяния) Думал ну как же так.. аппаратный USORT влияет на таймер o_O!
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
30.05.2013, 23:39 | 13 |
Там остались ещё проблем немного, а так всё вроде ок.. Почему то когда делаю с деинтерлейсингом, то кадры (чётный и нечётный) - такое впечатление что сдвинуты на 1 пиксель прям относительно друг друга.. когда делаю черезстрочно - то всё стоит ровно и красиво.. А из за этого смещения такое впечатление, что изображение потрясывается чуть чуть по горизонтали.. Может будут у кого идеи.. жалко осциллографа нет :)))
0
|
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
|
|
30.05.2013, 23:48 | 14 |
Выложи видео работы этого чуда.
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
31.05.2013, 00:34 | 15 |
Сообщение от PRS
0
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
|
|
31.05.2013, 00:48 | 16 |
Сообщение от OtyxPM
Не только F4 но и остальные дискаверины , при питании от USB помех немерено .
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
31.05.2013, 14:35 | 17 |
А вот и видео :) Вот вертикально трястись перестало это дело, но всётаки при приёме информации от GPS, немного потрясывается картинка по горизонтали (приём информации раз в секунду)..
http://youtu.be/wKbgaGsonPk
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
31.05.2013, 14:57 | 18 |
Сообщение от Ymdyvyd
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
31.05.2013, 16:38 | 19 |
Сообщение от OtyxPM
С номерами строк, где происходит переключение режимов работы ШИМ? или с номерами строк буфера, которые вывожу? И с тем и с другим игрался.. Но не получается как надо.. Там сейчас тайминги настроены вот по этому объяснению стандарта PAL: http://www.retroleum.co.uk/iti... -voltages/
0
|
0 / 0 / 0
Регистрация: 29.03.2011
Сообщений: 25
|
|
31.05.2013, 17:20 | 20 |
Похоже это нормальный эффект (враги называют его flicker), когда начинаешь использовать interlosid картинку.. Это то самое мелькание, избавиться от которого можно некоторым low-pass фильтром (что бы это ни было, честно - не знаю что это такое).. Склоняюсь к тому, чтобы отображать просто черезстрочно.. Потому что тогда картинка стоит вообще замечательно.. Хотя и заметно, что есть только нечётный кадр.. В общем то мне достаточно и черезстрочно отображать.. Единственно - всётаки не хорошо что при приёме данных по USORT изображение потрясывается влево-вправо немного :(
0
|
31.05.2013, 17:20 | |
31.05.2013, 17:20 | |
Помогаю со студенческими работами здесь
20
STM32F4 discovery не отлаживается STM32f4-discovery DDS Осциллограф на STM32F4-Discovery STM32F4-Discovery и CoIDE1.6.0 STM32F4-Discovery + USB CDC Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |