|
|
  |
scmRtos для медных чайников |
|
|
|
Oct 13 2012, 04:07
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Цитата(AHTOXA @ Oct 11 2012, 20:33)  по ходу дела всегда можно что-то подправить/изменить/добавить. Ну да, что и происходит. Посмотри пожалуйста. Код template<typename cs_pin> class TDisplay { private: spi_base_t& spi; typedef cs_pin LCD_CS; Pin<2, 6, 'H'> LCD_RS; // H for Data, L for Command Pin<1, 4, 'L'> LCD_RST; // Active 0, set to it during CSL uint8_t status; // 1/0 - On/Off. OLED requires to be off when not in use unsigned char *font; uint8_t fontnumber, fontwidth, fontheight; uint8_t x, y; // position on the screen inline void select(void) { spi.lock(); LCD_CS::On(); } inline void deselect(void) { LCD_CS::Off(); spi.unlock(); } inline void send(uint8_t data) { spi << data; } void send_array(uint8_t *data, uint16_t count) { select(); for(uint16_t i=0; i<count; i++) spi << data[i]; deselect(); } void send_command(uint8_t *data, uint16_t count); void send_data(uint8_t *data, uint16_t count); void goto_xy(uint8_t x, uint8_t y); public: TDisplay(uint8_t *init, spi_base_t& spiref): spi(spiref); void Set_contrast(uint8_t data); uint8_t getstatus(void); void On(void); // Because of using OLED display void Off(void); // Because of using OLED display void SetFont(uint8_t num); uint8_t GetFont(void); void ClrLines(unsigned char startline, unsigned char linesnum); // Clear number of text lines void ClrText(unsigned char line, unsigned char xpos, unsigned char length); // Clear part of the line void putchar(unsigned char ch, uint8_t xpos, uint8_t ypos); void putstring(char *string, uint8_t xpos, uint8_t ypos); void ShowFont(unsigned char num); } И несколько начальных функций. Не надо-ли что-то подправить? Хотелось бы понять перед тем, как перейду к описанию public функций. И по-моему в конструкторе класса у меня наверняка есть грубые ошибки в синтаксисе, поскольку пишу по остаткам памяти многолетней давности. Массив init приведён просто для референса. С ним как раз более-менее всё понятно.  Да, в качестве основы взят найденный на инете драйвер некоего аналогичного графического дисплея, некоторые комментарии не переведены  Код const uint8_t init[] = {0x40, //Display start line 0 0xa1, //ADC reverse <<<< Probably need to be changed 0xc0, //Normal COM0...COM63 0xa6, //Display normal 0xa2, //Set Bias 1/9 (Duty 1/65) 0x2f, //Booster, Regulator and Follower On 0xf8, //Set internal Booster to 4x 0x00, 0x27, //Contrast set 0x81, 0x16, 0xac, //Set indicator 0x00, //0x01, 0xAF, //}; //Display on 0xb0, //Page start sddress 0 0x10, //Set Higher Column Start Address 0 0x00 //Set Lower Column Start Address 0 };
/**************** Functions **************************************************/
void TDisplay::send_command(uint8_t *data, uint16_t count) { LCD_RS::Off(); // switch to send command send_array(data, count); // SPI CS controlled inside this function }
void TDisplay::send_data(uint8_t *data, uint16_t count) { LCD_RS::On(); // switch to send data send_array(data, count); // SPI CS controlled inside this function }
// Set symbol position in text mode //Parameter: // x: X - Position on screen (0 - 127) // y: Y - Position on screen (0 - 8) void TDisplay::goto_xy(uint8_t x, uint8_t y); { uint8_t set[] = {0xb0, 0x10, 0x00}; //Control commands array set[0] += y; //Y - Add Y Position to Set Page Start Address set[1] += x >> 4; //High - Nibble auf Steuerbefehl addieren set[2] += x & 0x0f; //Low - Nibble auf Steuerbefehl addieren send_command(set, 3); }
//TDisplay constructor TDisplay::TDisplay(uint8_t *init, spi_base_t& spiref): spi(spiref) { LCD_RST::Off(); // unreset LCD send_command((uint8_t *)init, sizeof(init)); // Initialization
for(uint8_t line=0; line<8; line++) // clear display memory { goto_xy(0, line); spiref.select(); send(0); spiref.deselect(); } }
|
|
|
|
|
Oct 13 2012, 05:10
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Я, честно говоря, не совсем понимаю, что я должен там высмотреть  В детали реализации я всё равно вникнуть не смогу, это дело разработчика. Про остальное уже сказал - нормально всё. Единственное замечание: если у вас шаблон Код template<typename cs_pin> class TDisplay { ... , то реализация функций должна быть в том же *.h файле, и выглядеть вот так: Код template<typename cs_pin> void TDisplay<cs_pin>::send_command(uint8_t *data, uint16_t count) { ...
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 13 2012, 18:54
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Ну, вот такие замечания и нужны  Спасибо. Естественно, я не собираюсь просить смотреть и отлаживать алгоритм. Это я уж сам  Мне только, чтобы по форме правильно было. А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр Кроме инлайновских функций, конечно.
|
|
|
|
|
Oct 15 2012, 03:26
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Chudik @ Oct 14 2012, 00:54)  А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр Так устроены шаблоны. Дело в том, что до того, как шаблону будет передан параметр, компилятор не может знать результирующего типа. То есть, из одного шаблона может получиться куча типов (в нашем случае - по типу на каждую ножку CS). И все эти типы никак не могут поместиться в одном объектном файле. Короче, лучше про это почитать какую-нибудь книжку
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 17 2012, 23:45
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
AHTOXAполучил сообщение в IAR Код Error[Pe020]: identifier "namespace" is undefined D:\Designs\M3\Firmware\M3_Terminal\scmRTOS\Common\usrlib.h 52 Пример Event компилируется. В нём такой ошибки, естественно, не возникает. Пути для своего проекта скопировал из примера. Где я что-то неправильно сделал? Можно, конечно, взять пример и наложить на него свой проект, но хотелось бы понять...
|
|
|
|
|
Oct 18 2012, 18:40
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Посмотрел опции компиляции. Там стоял автоматическкий выбор компилятора в зависимости от расширения. Поставил использование С++ - этот момент прошёл нормально. Теперь пытаюсь понять, почему Код Error[Pe864]: spi_t is not a template D:\Designs\M3\Firmware\M3_Terminal\M3_Terminal.h 19 Error[Pe020]: identifier "SPI1" is undefined D:\Designs\M3\Firmware\M3_Terminal\M3_Terminal.h 19 при том, что spi.h включён в проект.
|
|
|
|
|
Oct 18 2012, 19:36
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Конечно: Код #ifndef M3_TERMINAL_H #define M3_TERMINAL_H
#define CSL_used
#include "Peripheral\pin.h" #include "Peripheral\spi.h"
typedef spi_t<SPI1> TSpi1; extern TSpi1 spi1;
typedef TDisplay < Pin<2, 5, 'L'> > TDisplay; extern TDisplay display;
#endif // M3_TERMINAL_H
|
|
|
|
|
Oct 18 2012, 21:00
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Разобрался, мой косяк был - кросс ссылки на файлы .h  Цитата(AHTOXA @ Oct 18 2012, 12:49)  3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа. в соответствии с http://electronix.ru/forum/index.php?showt...t&p=1099201
|
|
|
|
|
Oct 18 2012, 21:20
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(AHTOXA @ Oct 18 2012, 22:49)  в ИАР-е, но, по моему разумению, включать *.h файлы в проект не надо. А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать. К примеру в Eclipse или Visual Studio хидеры включаются в проект. IAR EW - тоже какбы-IDE. Цитата(Chudik @ Oct 19 2012, 00:00)  Разобрался, мой косяк был - кросс ссылки на файлы .h Кросс ссылки - это что? Не представил...
|
|
|
|
|
Oct 19 2012, 04:54
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Chudik @ Oct 19 2012, 03:00)   Цитата(_Артём_ @ Oct 19 2012, 03:20)  А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать. Ну это была просто гипотеза. Думал, что раз тип файла определяется не по расширению, а принудительно задан cpp, то, возможно, он компилится как cpp. Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 19 2012, 20:22
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Цитата(AHTOXA @ Oct 18 2012, 21:54)  Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно. Угу, именно так.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|