реклама на сайте
подробности

 
 
10 страниц V  « < 3 4 5 6 7 > »   
Reply to this topicStart new topic
> scmRtos для медных чайников
Chudik
сообщение Oct 13 2012, 04:07
Сообщение #61


Частый гость
**

Группа: Свой
Сообщений: 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 функций. И по-моему в конструкторе класса у меня наверняка есть грубые ошибки в синтаксисе, поскольку пишу по остаткам памяти многолетней давности. rolleyes.gif
Массив init приведён просто для референса. С ним как раз более-менее всё понятно. sm.gif
Да, в качестве основы взят найденный на инете драйвер некоего аналогичного графического дисплея, некоторые комментарии не переведены sm.gif

Код
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();
    }
}
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 13 2012, 05:10
Сообщение #62


фанат дивана
******

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



Я, честно говоря, не совсем понимаю, что я должен там высмотретьsm.gif
В детали реализации я всё равно вникнуть не смогу, это дело разработчика. Про остальное уже сказал - нормально всё.
Единственное замечание: если у вас шаблон
Код
template<typename cs_pin>
class TDisplay
{
...
, то реализация функций должна быть в том же *.h файле, и выглядеть вот так:
Код
template<typename cs_pin>
void TDisplay<cs_pin>::send_command(uint8_t *data, uint16_t count)
{
...


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 13 2012, 18:54
Сообщение #63


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Ну, вот такие замечания и нужны sm.gif Спасибо.
Естественно, я не собираюсь просить смотреть и отлаживать алгоритм. Это я уж сам sm.gif Мне только, чтобы по форме правильно было.

А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр Кроме инлайновских функций, конечно.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 15 2012, 03:26
Сообщение #64


фанат дивана
******

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



Цитата(Chudik @ Oct 14 2012, 00:54) *
А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр

Так устроены шаблоны. Дело в том, что до того, как шаблону будет передан параметр, компилятор не может знать результирующего типа. То есть, из одного шаблона может получиться куча типов (в нашем случае - по типу на каждую ножку CS). И все эти типы никак не могут поместиться в одном объектном файле.
Короче, лучше про это почитать какую-нибудь книжкуsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 17 2012, 23:45
Сообщение #65


Частый гость
**

Группа: Свой
Сообщений: 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 компилируется. В нём такой ошибки, естественно, не возникает.
Пути для своего проекта скопировал из примера. Где я что-то неправильно сделал?

Можно, конечно, взять пример и наложить на него свой проект, но хотелось бы понять... rolleyes.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 18 2012, 03:30
Сообщение #66


фанат дивана
******

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



Я в IAR-е не копенгагенsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 18 2012, 05:54
Сообщение #67


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Chudik @ Oct 18 2012, 02:45) *
identifier "namespace" is undefined
говорит о том, что вы пытаетесть C++ заголовочный файл компилировать в режиме C. А это возможно, если вы какой-то из заголовочных файлов ОС (вероятно scmRTOS.h) прямо или косвенно включили в какой-то из файлов с расширением .c


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 18 2012, 18:40
Сообщение #68


Частый гость
**

Группа: Свой
Сообщений: 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 включён в проект. rolleyes.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 18 2012, 18:52
Сообщение #69


фанат дивана
******

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



А в файле M3_Terminal.h есть строчка
Код
#include "spi.h"

?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 18 2012, 19:36
Сообщение #70


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 18 2012, 19:49
Сообщение #71


фанат дивана
******

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



Хм. Странно.
1. Возможно где-то ещё есть объявление типа spi_t.
2. Я не разбираюсь в ИАР-е, но, по моему разумению, включать *.h файлы в проект не надо.
3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 18 2012, 21:00
Сообщение #72


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Разобрался, мой косяк был - кросс ссылки на файлы .h sm.gif
Цитата(AHTOXA @ Oct 18 2012, 12:49) *
3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа.

в соответствии с http://electronix.ru/forum/index.php?showt...t&p=1099201 wink.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 18 2012, 21:20
Сообщение #73


Гуру
******

Группа: Свой
Сообщений: 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

Кросс ссылки - это что? Не представил...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 19 2012, 04:54
Сообщение #74


фанат дивана
******

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



Цитата(Chudik @ Oct 19 2012, 03:00) *

sm.gif

Цитата(_Артём_ @ Oct 19 2012, 03:20) *
А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать.

Ну это была просто гипотеза. Думал, что раз тип файла определяется не по расширению, а принудительно задан cpp, то, возможно, он компилится как cpp.
Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 19 2012, 20:22
Сообщение #75


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



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

Угу, именно так.
Go to the top of the page
 
+Quote Post

10 страниц V  « < 3 4 5 6 7 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 03:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01651 секунд с 7
ELECTRONIX ©2004-2016