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

Andrei_S

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

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
    Участник
  • День рождения 22.09.1974

Контакты

  • Сайт
    Array

Информация

  • Город
    Array

Посетители профиля

834 просмотра профиля
  1. Закончился отпуск. Засел за проект с новыми силами... И все почти сразу заработало. Оказалось банально просто. На шлейфе была маркировка краской первого и последнего(34) вывода. И она оказалась перевернутой. Тема закрыта. p.s. Пришла мелкая партия индикаторов. Маркировки на шлейфе у них уже нет.
  2. Доброго всем дня. Пытаюсь запустить данный индикатор. Пока безрезультатно. При подаче питания кратковременно выводится мусор в виде горизонтальных и вертикальных палок и дальше пусто... Схема подключения - предложенная когда-то Winstar одному из пользователей, код для контроллера ST7565P - оттуда же. Интерфейс - параллельный, 6800. Если бы индикатор был один - можно предположить, что убит контроллер, но у меня их несколько... Ну ткните, пожалуйста, носом, где я накосячил!!! #include "LPC17xx.H" // LPC1768 definitions // Индикатор WO12864C2-TFH // параллельный интерфейс 6800 (P/S=1, C86=1) // Шина индикатора //#define PIN_D0 0x00040000 // Шина данных индикатора P1.18-P1.25 //#define PIN_D7 0x02000000 // #define line_datalcd 18 //шина данных начинается с 18-й линии //Выводы управления WO12864C2-TFH() #define PIN_RST 0x00000001 // 0.0 Сброс #define PIN_CS1 0x00000002 // 0.1 Выбор кристалла #define PIN_A0 0x20000000 // 1.29 #define PIN_WR 0x10000000 // 1.28 #define PIN_RD 0x08000000 // 1.27 #define RESET(X) ((X)? (GPIO0 -> FIOSET = PIN_RST):(GPIO0 -> FIOCLR=PIN_RST)); #define CS1(X) ((X)? (GPIO0 -> FIOSET = PIN_CS1):(GPIO0 -> FIOCLR=PIN_CS1)); #define A0(X) ((X)? (GPIO1 -> FIOSET = PIN_A0):(GPIO1 -> FIOCLR=PIN_A0)); #define WR(X) ((X)? (GPIO1 -> FIOSET = PIN_WR):(GPIO1 -> FIOCLR=PIN_WR)); #define RD(X) ((X)? (GPIO1 -> FIOSET = PIN_RD):(GPIO1 -> FIOCLR=PIN_RD)); #define LCD_COLUM_SET_H 0x10 #define LCD_COLUM_SET_L 0x00 int main (void) //############################################################################# //############################################################################# //############################################################################# { SystemInit(); TargetInit(); Display_Init(); //ST7565P init LCD_Clear(); // Заливка черным экрана while(1) { //...... } } //################################################################################ ##### // Инициализация индикатора //################################################################################ ##### void Display_Init(void) { // параллельный интерфейс 6800 // P/S=1, C86=1 CS1(0) // Разрешаем работу с ST7565 BusOUT(); // Шина на вывод SetBus(0x00); // Выставили нули на шине RESET(0) delay_ms(50); RESET(1) delay_ms(50); RD(1) WR(0) // Power Controller Set (Booster circuit | Voltage regulator circuit | Voltage follower circuit) Write_Command(0x2F); // 00101111 - Все включено(1) // Booster Ratio Select Mode Set // + Register Set - устанавливаем 4x Write_Command(0xF8); // 11111000 Write_Command(0x00);// младшие два нуля - 2x,3x,4x // LCD Bias Set Write_Command(0xA2);//10100010 - 1,9 bias //The Electronic Volume Mode Set Write_Command(0x81); //10000001 // Electronic Volume Register Set Write_Command(0x24); //00100100 - Уровень36 из 64 возможных Write_Command(0x40); // 01000000(0x40) Начинаем с нулевой линии Write_Command(0xAF); // Включаем панель }// End //################################################################################ ##### //################################################################################ ##### // Вывод команды на индикатор //################################################################################ ##### void Write_Command(unsigned char code) { unsigned char SCH=8,tic=0; BusOUT(); // Шина на вывод RD(1) WR(0) A0(0) // Идет команда SetBus(code); // Выставили данные на шине RD(1) // Строб E delay_us(20); RD(0) }//End //################################################################################ ##### //################################################################################ ##### //Вывод данных на индикатор //################################################################################ ##### void Write_Data(unsigned char code) { unsigned char SCH=8,tic=0; BusOUT(); // Шина на вывод RD(1) WR(0) A0(1) // Идут данные SetBus(code); // Выставили данные на шине RD(1) // Строб E delay_us(20); RD(0) }//End //################################################################################ ##### //################################################################################ ##### // Очистка страниц LCD //################################################################################ ##### void LCD_Clear(void) { unsigned char i,j; BusOUT();// Шина на вывод for(i=0; i<9; i++) //clear page 0~8 { Write_Command(0xB0+i); //set page Write_Command(LCD_COLUM_SET_L); //set column Write_Command(LCD_COLUM_SET_H); //set column for(j=0; j<130; j++) //clear all columns upto 130 { Write_Data(0xFF); // Заливаем экран } } } //################################################################################ ##### //################################################################################ ##### void BusOUT(void)// Шина данных индикатора на вывод //################################################################################ ##### { GPIO1 -> FIODIR |= (0xFF << line_datalcd); }//End //################################################################################ ##### //################################################################################ ##### void SetBus(unsigned char _data) //Установка сигналов данных на шине данных индикатора //################################################################################ ##### { unsigned long dta,dta1; // Шина данных начинается с 18-й линии (line_datalcd=18) // Порт шины данных - GPIO1 BusOUT();// Шина на вывод dta = _data; dta1 = _data ^ 255; dta = dta << line_datalcd; dta1 = dta1 << line_datalcd; if(_data & 0x40) dta |= 0x01000000; else dta1 |= 0x01000000; GPIO1 -> FIOSET = dta; GPIO1 -> FIOCLR = dta1; }//End //################################################################################ ##### ______________.pdf WO12864C2.pdf
  3. пины P1.21-P1.25 не задействованы P0.14 пока висит в воздухе... А что за контрольная сумма по адресу 0х14 ?
  4. Проблема с LPC2132-01

    Измучился искать причину следующего: в Keil uVision 3 сделал пробный проект - передача данных последовательному регистру (впрочем, это неважно). Прошил ее с помощью MT-Link (Segger J-Link 3.74) на своем девайсе, а в ответ тишина - процессор не стартует. Прочитал проц и сравнил с оригиналом (HEX из Keil-а) - все совпадает!!! Есть KIT с LPC2148 - шью этот проект в него(правда другие порты) - все стартует после прошивки нормально. Пытаюсь на своей плате запустить отладчик - взвисает, но есть фокус - если из под Keil-а прошиваю(RDI-MT-Link) - процессор оживает и делает все, что я ему сказал. Выключаешь питание - мертвый... Правда изначально недосмотрел - P1.20(Trace Sync) был в нуле, но потом все исправил... J-Link вроде без ошибок стирает, пишет и читает его. НЕ МОГУ ПОНЯТЬ - В ЧЕМ ПРОБЛЕМА, прц чтоли издох или что другое?!!!!!!!!!!
  5. UART3 LPC2368

    Была полная ересь с UART2,3 при использовании KEIL mdk3.03 или 3.05. Принимал порой черте-что, отказывался посылать байты, генерил ошибки и т.п. Это было только с UART2 и 3!!!!!!!! Сначала думал, что глючный камень, посылал запрос на NXP-те сказали что все ОК. Потом вышел новый KEIL (3.11)-все заработало без проблем(и до сих пор). В проекте используются UART0,2,3 - проблем нет. Обработчики прерываний U2,3 переписаны с примера UART0. Единственное - везде убрал использование вложенных прерываний( IENABLE,IDISABLE). PCONP |= (1 << 24); // Питание UART2 и UART3 PCONP |= (1 << 25); UARTInit(0, 38400); // UART0, 38400 b/s UARTInit(2, 9600); // UART2, 9600 b/s UARTInit(3, 9600); // UART3, 9600 b/s /***************************************************************************** Function name: UARTInit *****************************************************************************/ DWORD UARTInit( DWORD PortNum, DWORD baudrate ) { DWORD Fdiv; if ( PortNum == 0 ) { U0LCR = 0x83; // 8 bits, no Parity, 1 Stop bit Fdiv = ( Fpclk / 16 ) / baudrate; //baud rate U0DLM = Fdiv / 256; U0DLL = Fdiv % 256; U0LCR = 0x03; // DLAB = 0 U0FCR = 0x07; // Enable and reset TX and RX FIFO. VICVectAddr6 = (unsigned long)UART0Handler; // UART0 Interrupt -> Vector 6 VICVectCntl6 = 0x05; // UART0 Interrupt -> Priority 5 VICIntEnable = 1 << 6; // Enable UART0 Interrupt U0IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART0 interrupt */ return (TRUE); } else if ( PortNum == 2 ) { U2LCR = 0x83; // 8 bits, no Parity, 1 Stop bit Fdiv = ( Fpclk / 16 ) / baudrate; //baud rate U2DLM = Fdiv / 256; U2DLL = Fdiv % 256; U2LCR = 0x03; // DLAB = 0 U2FCR = 0x07; // Enable and reset TX and RX FIFO. VICVectAddr28 = (unsigned long)UART2Handler; // UART2 Interrupt -> Vector 28 VICVectCntl28 = 0x02; // UART2 Interrupt -> Priority 2 VICIntEnable = 1 << 28; // Enable UART2 Interrupt U2IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART2 interrupt */ return (TRUE); } else if ( PortNum == 3 ) { U3LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ Fdiv = ( Fpclk / 16 ) / baudrate; /*baud rate */ U3DLM = Fdiv / 256; U3DLL = Fdiv % 256; U3LCR = 0x03; /* DLAB = 0 */ U3FCR = 0x07; /* Enable and reset TX and RX FIFO. */ // if ( install_irq( UART3_INT, (void *)UART3Handler, 0x01 ) == FALSE ) // { // return (FALSE); // } VICVectAddr29 = (unsigned long)UART3Handler; // UART3 Interrupt -> Vector 29 VICVectCntl29 = 0x01; // UART3 Interrupt -> Priority 1 VICIntEnable = 1 << 29; // Enable UART3 Interrupt U3IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART0 interrupt */ return (TRUE); } return( FALSE ); } //*************************************************************************** // Function name: UART3Handler //*************************************************************************** void UART3Handler (void) __irq { BYTE IIRValue, LSRValue; volatile BYTE Dummy; //__enable_interrupt(); /* handles nested interrupt */ IIRValue = U3IIR; IIRValue >>= 1; /* skip pending bit in IIR */ IIRValue &= 0x07; /* check bit 1~3, interrupt identification */ if ( IIRValue == IIR_RLS ) /* Receive Line Status */ { LSRValue = U3LSR; /* Receive Line Status */ if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) ) { /* There are errors or break interrupt */ /* Read LSR will clear the interrupt */ UART3Status = LSRValue; Dummy = U3RBR; /* Dummy read on RX to clear interrupt, then bail out */ VICVectAddr = 0; /* Acknowledge Interrupt */ return; } if ( LSRValue & LSR_RDR ) /* Receive Data Ready */ { /* If no error on RLS, normal ready, save into the data buffer. */ /* Note: read RBR will clear the interrupt */ UART3Buffer[UART3Count] = U3RBR; UART3Count++; if ( UART3Count == BUFSIZE ) { UART3Count = 0; /* buffer overflow */ } } } else if ( IIRValue == IIR_RDA ) /* Receive Data Available */ { /* Receive Data Available */ UART3Buffer[UART3Count] = U3RBR; UART3Count++; if ( UART3Count == BUFSIZE ) { UART3Count = 0; /* buffer overflow */ } } else if ( IIRValue == IIR_CTI ) /* Character timeout indicator */ { /* Character Time-out indicator */ UART3Status |= 0x100; /* Bit 9 as the CTI error */ } else if ( IIRValue == IIR_THRE ) /* THRE, transmit holding register empty */ { /* THRE interrupt */ LSRValue = U3LSR; /* Check status in the LSR to see if valid data in U3THR or not */ if ( LSRValue & LSR_THRE ) { UART3TxEmpty = 1; } else { UART3TxEmpty = 0; } } VICVectAddr = 0; /* Acknowledge Interrupt */ }
  6. Проблемка с ulink2

    Был такой зверек. Тогда у меня стоял KEIL 3.05 (ессно с пилюлей), с сайта Keil пришлось скачать на ULINK дрова, только тогда стал реагировать. Но, не проработав и месяца, сдох... Ощущение такое, что слетела прошивка. Отправил его обратно... Взял MT-Link и без горя... Рекомендации: после подключения к USB он должен однозначно опознаться (даже если JTAG не подключен к плате), в Keil'e во вкладке TargetOption->Debug->Ulink должен появится его серийный номер. Если номер появился, то надо поиграться с частотой JTAG(, к сожалению, не помню какую частоту я ставил). Еще, по моему был заскок с выводом RTCK - кажись, обязательно нужен. Проверь, заменены ли файлы s*a*r*m.dll и s*a*r*m*c*m*3.dll на хорошие... попробуй воткнуть вот этот драйверочек(к сожалению, на KEILе давно не был, может быть дрова обновились). p.s. сейчас пользуюсь mdk3.11 +MT-Link(RDI) - проблем нет. Пардон, чего-то не прикрепился файл. Повторяю... Вдогонку... ULINK2 не понравился, встал криво, тормозил, и всего 2 точки останова и стоил до фига... USBDrivers.zip
  7. Кристалл - LPC2368(ранее стоял 2366) Среда Keil uVision3 v3.53 (mdk3.11) Использую порты 2 и 3 как с альтернативными функциями так и GPIO. ПРОБЛЕМ НЕ БЫЛО!!! #define PIN_SA 0x00000004 // P2.2 Вход опроса клавиатуры #define KEY_PRESS (FIO2PIN & PIN_SA) == 0 // Проверка нажатия клавиши ... #define EOC (FIO2PIN & PIN_EOC) == 0 ... #define PIN_RD1 0x02000000 // P3.25 Вход датчика ... // Port Configuration // Порт 0 PINSEL0 = 0x00500050; PINSEL1 = 0x15400022; // Порт 1 PINSEL2 = 0x00; PINSEL3 = 0x00; // все GPIO // Порт 2 PINSEL4 = 0x00000005; PINSEL5 = 0x00; // все GPIO // Порт 3 PINSEL6 = 0x00; PINSEL7 = 0x00; // все - GPIO // Порт 4 PINSEL8 = 0x00; PINSEL9 = 0x0F000000; //Port Direction IODIR0 = 0xFF1AF5F4; // Port 0 IODIR1 = 0x00000302; // Port 1 FIO2DIR = 0x00000003; // Port 2 FIO3DIR = 0x00000000; // Port 3 FIO4DIR = 0x10000000; // Port 4 ... Возможно, у Вас глюк самой IDE, например, у меня были проблемы с UART 2,3 когда стоял Keil 3.03 или 3.05. Сейчас стоит 3.11, проблем нет, обновляться пока не собираюсь.
  8. А не забыта ли строчка в main #include "LCDConf.h" если нет, то вероятнее всего - демо-вермия GUI. В ней отсутствует много чего нужного, например, низкоуровневые драйвера индикатора. На всякий случай брошу папочки с некоторыми драйверами (реально отлажен мной drv для SED1335) Project/Config Project/GUI/LCDDriver Не помню, где я сдирал исходники, но вроде все работает, заморочек не было. Config.zip LCDDriver.zip
  9. Read_EEPROM((u8 *)&config.info_1, MEM_ADDR + offsetof(Config_Type, info_1), sizeof(config.info_1)); Но а все-таки, а как уйти от названия элементов структуры к порядковому номеру элемента этой структуры? Хотелось бы вместо названия поля info_1 писать номер этого поля, например 1 Например, я последовательно вывожу на индикацию эти 100 параметров структуры: N1 120 N2 300 .... и т.д. При нажатии кнопок я могу изменять значения и перезаписывать их в ПЗУ Если я, например, изменил один из параметров, то для записи в ПЗУ я должен сначала сопоставить значение переменной N и название соответствующего поля типа: switsh(N) { case 0: Addr = offsetof(Config_Type, info_1); break; case 1: Addr = offsetof(Config_Type, info_2); break; .... и так все 100 параметров Можно ли это модифицировать?
  10. В принципе, ничего, и ремарки не нужны... Но годится в случае одного типа переменных.
  11. Итак, общими усилиями получилось следующее: имеется некая структура типа setup (все-таки структура а не массив, т.к. типы данных разные ) typedef struct SettingMenu { char Parametr1; char Parametr2; int Parametr3; char Array[10]; float Parametr5; .......... };Setup .......... .......... Setup LocalSetup;// Структура char *sptr; // Указатель sptr = (char*)&LocalSetup;// Получили адрес a=sizeof(Setup);// и размер for (c=0; c<a; c++) { *sptr++ = ReadEprom(StartSetupAdress+c); } Работает отлично, заморочек с чтением/записью разных типов данных нет. Большое спасибо!! Но, допустим, мне необходимо перезаписать всего один элемент структуры - пускай 5 элемент. Мне нужно узнать его адрес и размерность. Указано явно: sptr = (char*)&LocalSetup.Parametr5; a = sizeof(LocalSetup.Parametr5);// Получили размерность, например, он float - 4 байта for (c=0; c<a; c++) { *sptr++ = ReadEprom(StartSetupAdress+N+c);// где N-адрес в ПЗУ Параметра 5 } Такой вопрос: как это сделать не с явным указанием, а по номеру элемента структуры например, ReadSinglePar(LocalSetup,5), где 5 - пятый элемент структуры, т.е. Parametr5 ? Если это делать явно, то модуль установочного меню раздуется весьма ощутимо, и будет проблемка синхронизации при изменении самой структуры(при изменении количества или названия элементов). Можно, конечно, переписать всю структуру, но критично время.
  12. Большое спасибо всем! Буду пробовать...
  13. Вообще-то типы переменных разные, но для упрощения я их привел к одному типу, нехваткой памяти я не жалуюсь... Простите за серость, но адресацию элементов через enum я еще не делал... Pls, не подскажете ли конструкцию???
  14. Имеется большое количество переменных. Я хочу как можно сильней упростить их перезапись (в том числе и в ПЗУ). Например писать: BaudRate = Read_Eprom(10); StopBit = Read_Eprom(11); и так сто раз весьма утомительно. Вариант с адресацией, на мой взгляд, избавит от рутины, к тому же имена переменных будут осмысленны, в отличие от массива. Может есть какие-то отлаженные решения?
×
×
  • Создать...