roboforum.ru

Технический форум по робототехнике.

Удобно ли такое программирование?

Удобно?

Да
3
43%
Нет
3
43%
Мне и без этого хорошо
1
14%
 
Всего голосов : 7

Удобно ли такое программирование?

Сергей » 31 июл 2008, 02:24

Вот небольшой пример для меги8, это удобнее чем работать с регистрами? Разрабатывалось для себя, но если комуто понравица, могу заточить под разные камни всю периферию.
Код: Выделить всёРазвернуть
ISR( TIMER0_OVF_vect )
{
   chip.invert_pin_value( ioPortB, ioPin0 );   
}

ISR( INT0_vect )
{
   chip.timer0_disable();
}

ISR( INT1_vect )
{
   chip.timer0_enable( prescTimer0_256 );
}

int main( void )
{
   chip.set_output( ioPortB, ioPin0, true );
   chip.set_input( ioPortD, ioPin2, true );
   chip.set_input( ioPortD, ioPin3, true );
   
   cli();
   
   chip.timer0_enable( prescTimer0_256 );
   chip.timer0_set_tcnt( 0 );
   chip.timer0_interrupt_enable();
   
   chip.int0_enable( lowLevel );
   chip.int1_enable( lowLevel );
   
   sei();
   
   while(1);
   
   return 0;
}

Re: Удобно ли такое программирование?

=DeaD= » 31 июл 2008, 08:13

считаю что нет, потому как си это си, а ява это ява, не вижу смысла из си делать яву.

Re: Удобно ли такое программирование?

Виталий » 31 июл 2008, 09:27

Неплохо, но непонятно зачем нужно: chip.function();
Помоему достаточно просто: function();
Либо если уже классы пошли, то делать их по периферии:
Код: Выделить всёРазвернуть
class IUartClass 
{
public:
virtual void Initialize();
virtual char GetChar();
virtual bool CharAvailable();
virtual void SendChar(char c);
}

class Mega8Uart : IUartClass
{
//Implementation for mega8
}

//Работа с uart одинаковой будет для всех контроллеров.
IUartClass uart = Mega8Uart();


Ну это конечно просто пример из головы.

Другое дело нужно ли это в контроллере.
Функций вроде не так много, так что наверное нет.

Re: Удобно ли такое программирование?

-= Александр =- » 31 июл 2008, 12:16

Эх, если б при вводе chip. появлялась менюха со списком - вот это было бы круто! А так - не вижу смысла...

Re: Удобно ли такое программирование?

EdGull » 31 июл 2008, 12:21

а в васике появляется... :P

Re: Удобно ли такое программирование?

=DeaD= » 31 июл 2008, 12:28

А в алгоритм билдере вообще всё в картинках и чего?

Re: Удобно ли такое программирование?

Сергей » 31 июл 2008, 13:54

Виталий писал(а):Неплохо, но непонятно зачем нужно: chip.function();
Помоему достаточно просто: function();
Либо если уже классы пошли, то делать их по периферии:
Код: Выделить всёРазвернуть
class IUartClass 
{
public:
virtual void Initialize();
virtual char GetChar();
virtual bool CharAvailable();
virtual void SendChar(char c);
}

class Mega8Uart : IUartClass
{
//Implementation for mega8
}

//Работа с uart одинаковой будет для всех контроллеров.
IUartClass uart = Mega8Uart();


Ну это конечно просто пример из головы.

Другое дело нужно ли это в контроллере.
Функций вроде не так много, так что наверное нет.

Да я просто люблю ковыряца в таких мелочах. Если про классы - лучше сделать один, во-первых меньше места во флеше, во-вторых не так много функций у таких МК. Всегда видно где ты работаешь с периферией а где твои собственные

Добавлено спустя 1 минуту:
-= Александр =- писал(а):Эх, если б при вводе chip. появлялась менюха со списком - вот это было бы круто! А так - не вижу смысла...

ну смотря где кодишь, я в eclipse - там выпадает, удобно.

Добавлено спустя 29 секунд:
=DeaD= писал(а):считаю что нет, потому как си это си, а ява это ява, не вижу смысла из си делать яву.

Это Си++.

Re: Удобно ли такое программирование?

=DeaD= » 31 июл 2008, 16:30

Сергей писал(а):
=DeaD= писал(а):считаю что нет, потому как си это си, а ява это ява, не вижу смысла из си делать яву.

Это Си++.

Мне кажется, что в Си++ классы использую только для заворачивание серьезных блоков кода, а все простые ходы, тем более не имеющие общих внутренних данных делают функциями.

Кроме того я не понимаю какую задачу мы сейчас решаем - если мы пишем такой объект для минибота - это одно, если для просто МК - совсем другое. В случае минибота я такой ход допускаю, потому что кроме нас никто ничего для минибота не сделал и это будет лучше чем ничего, а вот в случае МК я считаю что умные люди уже много чего придумали и негоже нам за ними переделывать, по крайней мере в рамках робототехники. Есть общепринятые стандарты работы с МК в Си и какой смысл их перекраивать?

Re: Удобно ли такое программирование?

Сергей » 31 июл 2008, 16:45

=DeaD= писал(а):
Сергей писал(а):
=DeaD= писал(а):считаю что нет, потому как си это си, а ява это ява, не вижу смысла из си делать яву.

Это Си++.

Мне кажется, что в Си++ классы использую только для заворачивание серьезных блоков кода, а все простые ходы, тем более не имеющие общих внутренних данных делают функциями.

В данном случае играет роль наглядность. И еще если есть хорошая оболочка компилятора - то вываливаюца все методы при наборе. Я с тобой не спорю, что класс здесь излишен, попробую еще без него, посмотрим.
=DeaD= писал(а):Кроме того я не понимаю какую задачу мы сейчас решаем - если мы пишем такой объект для минибота - это одно, если для просто МК - совсем другое. В случае минибота я такой ход допускаю, потому что кроме нас никто ничего для минибота не сделал и это будет лучше чем ничего, а вот в случае МК я считаю что умные люди уже много чего придумали и негоже нам за ними переделывать, по крайней мере в рамках робототехники. Есть общепринятые стандарты работы с МК в Си и какой смысл их перекраивать?

Да мы ничего не решаем здесь - хотите используйте под минибота, хотите не используйте, я делаю для себя. Знаю я ваши "общепринятые стандарты" и всеравно все пишут через ..опу. Тут я не делаю мега-библиотеку которая решает какиенибудь задачи, я просто увожу программирование МК от прямой работы с регистрами, тк в большинстве случаев косяки программ именно с ними.

Re: Удобно ли такое программирование?

=DeaD= » 31 июл 2008, 17:06

Сергей писал(а):Да мы ничего не решаем здесь - хотите используйте под минибота, хотите не используйте, я делаю для себя. Знаю я ваши "общепринятые стандарты" и всеравно все пишут через ..опу. Тут я не делаю мега-библиотеку которая решает какиенибудь задачи, я просто увожу программирование МК от прямой работы с регистрами, тк в большинстве случаев косяки программ именно с ними.

Я думаю что это не приживется, потому что отлично написанная обертка - это будет существенный кусок кода, который схавает кучу памяти контроллера. Да и производительности пожалуй тоже. А учитывая что мы под МК находимся - это мало кого устроит.

Я просто пробовал пользовать кучу интересных библиотек, которые тоже избавляли меня от работы с регистрами, однако быстро выяснилось, что они хавают столько памяти, что я залез в исходники, надергал там методов и быстренько сам всё прописал. Т.е. пользовался я ею - конечно да, но только как примером.

Да и писать супербиблиотеку под кучу разных контроллеров - дело гиблое, а под один писать - это врядли всех устроит.

PS: И самое главное, чтобы полностью пользоваться этим, надо всё равно хорошо понимать как работает тот или иной механизм в МК, а если это понимаешь полностью - тогда и регистры прописать и отладиться скорее всего - не такая большая проблема.

Re: Удобно ли такое программирование?

Сергей » 31 июл 2008, 21:09

=DeaD= писал(а):
Сергей писал(а):Да мы ничего не решаем здесь - хотите используйте под минибота, хотите не используйте, я делаю для себя. Знаю я ваши "общепринятые стандарты" и всеравно все пишут через ..опу. Тут я не делаю мега-библиотеку которая решает какиенибудь задачи, я просто увожу программирование МК от прямой работы с регистрами, тк в большинстве случаев косяки программ именно с ними.

Я думаю что это не приживется, потому что отлично написанная обертка - это будет существенный кусок кода, который схавает кучу памяти контроллера. Да и производительности пожалуй тоже. А учитывая что мы под МК находимся - это мало кого устроит.
Я понимаю о чем ты. Я закончу с этим МК, выложу хидер и ты посмотришь. Так будет понятнее.

=DeaD= писал(а):Я просто пробовал пользовать кучу интересных библиотек, которые тоже избавляли меня от работы с регистрами, однако быстро выяснилось, что они хавают столько памяти, что я залез в исходники, надергал там методов и быстренько сам всё прописал. Т.е. пользовался я ею - конечно да, но только как примером.
Аналагична.
=DeaD= писал(а):Да и писать супербиблиотеку под кучу разных контроллеров - дело гиблое, а под один писать - это врядли всех устроит.

Это не супербиблиотека :wink:
=DeaD= писал(а):PS: И самое главное, чтобы полностью пользоваться этим, надо всё равно хорошо понимать как работает тот или иной механизм в МК, а если это понимаешь полностью - тогда и регистры прописать и отладиться скорее всего - не такая большая проблема.

Я хорошо понимаю как работают механизмы в МК, и всеравно после продолжительного кодинга голова кругом идет от битов, байтов, регистров и обязательно гденибудь не то выставлю. :o

Добавлено спустя 3 часа 46 минут 33 секунды:
Ну вот чтото в этом роде:
Код: Выделить всёРазвернуть
#include <stdint.h>
#include <stdbool.h>

typedef enum { sleepMode_idle = 0,
            sleepMode_adc = 1,
            sleepMode_pwrDown = 2,
            sleepMode_pwrSave = 3,
            sleepMode_standby = 6,
            sleepMode_extStandby = 7 } sleepMode;

typedef enum { resetFlag_wd = 4,
             resetFlag_bo = 3,
             resetFlag_ext = 2,
             resetFlag_po = 1 } resetFlag;

typedef enum { lowLevel = 0,
              accueringFront = 2,
              fallingDownFront = 3 } intTerm;

typedef enum { ioPortB = 0x18,
              ioPortC = 0x15,
              ioPortD = 0x12 } ioPort;

typedef enum { ioPin0 = 0,
              ioPin1 = 1,
              ioPin2 = 2,
              ioPin3 = 3,
              ioPin4 = 4,
              ioPin5 = 5,
              ioPin6 = 6,
              ioPin7 = 7} ioPin;

typedef enum { prescTimer_clk = 1,
              prescTimer_8 = 2,
              prescTimer_64 = 3,
              prescTimer_256 = 4,
              prescTimer_1024 = 5 } prescTimer;

typedef enum { outputTimer1_A = 6,
              outputTimer1_B = 4 } outputTimer1;

typedef enum { outputTimer1_disable = 0,
              outputTimer1_invert = 1,
              outputTimer1_down = 2,
              outputTimer1_up = 3 } outputCompareModeTimer1;

typedef enum { modeTimer1_normal = 0,
              modeTimer1_pwm8 = 1,
              modeTimer1_pwm9 = 2,
              modeTimer1_pwm10 = 3,
              modeTimer1_ctc = 4,
              modeTimer1_fpwm8 = 5,
              modeTimer1_fpwm9 = 6,
              modeTimer1_fpwm10 = 7 } modeTimer1;

typedef enum { intTimer1_overflow = 3,
              intTimer1_compareA = 4,
              intTimer1_compareB = 5,
              intTimer1_interception = 6 } intTimer1;

typedef enum { wdtTime_16ms = 0,
            wdtTime_33ms = 1,
            wdtTime_65ms = 2,
            wdtTime_130ms = 3,
            wdtTime_260ms = 4,
            wdtTime_520ms = 5,
            wdtTime_1000ms = 6,
            wdtTime_2100ms = 7 } wdtTime;
            
typedef enum { adcReference_aref = 0,
              adcReference_avcc = 1,
              adcReference_internal = 3 } adcReference;
            
typedef enum { adcChannel_0 = 0,
            adcChannel_1 = 1,
            adcChannel_2 = 2,
            adcChannel_3 = 3,
            adcChannel_4 = 4,
            adcChannel_5 = 5,
            adcChannel_6 = 6,
            adcChannel_7 = 7 } adcChannel;
            
typedef enum { adcPresc_2 = 1,
            adcPresc_4 = 2,
            adcPresc_8 = 3,
            adcPresc_16 = 4,
            adcPresc_32 = 5,
            adcPresc_64 = 6,
            adcPresc_128 = 7 } adcPresc;
            
typedef enum { usartError_fe = -1,
            usartError_ovf = -2,
            usartError_pe = -4} usartError;
         
void chip_eeprom_write( uint16_t address, uint8_t data );
uint8_t chip_eeprom_read( uint16_t address );

void chip_set_sleep_mode( sleepMode mode );
void chip_sleep_enable( void );
void chip_sleep_disable( void );
void chip_sleep( void );

resetFlag chip_get_reset_flag( void );

void chip_int0_enable( intTerm term );
void chip_int1_enable( intTerm term );

void chip_int0_disable( void );
void chip_int1_disable( void );

void chip_set_input( ioPort port, ioPin pin, bool pullup );   
void chip_set_output( ioPort port, ioPin pin, bool value );

void chip_invert_pin_value( ioPort port, ioPin pin );
void chip_set_pin_value( ioPort port, ioPin pin, bool value );
bool chip_get_pin_value( ioPort port, ioPin pin );

void chip_timer0_enable( prescTimer presc );
void chip_timer0_disable( void );
void chip_timer0_interrupt_enable( void );
void chip_timer0_interrupt_disable( void );
void chip_timer0_set_tcnt( uint8_t tcnt );

void chip_timer1_enable( prescTimer presc, modeTimer1 mode, bool supression_block, bool active_front );
void chip_timer1_set_compare_block( outputTimer1 output, outputCompareModeTimer1 mode );
void chip_timer1_interrupt_enable( intTimer1 ie );
void chip_timer1_interrupt_disable( intTimer1 ie );
void chip_timer1_interrupt_disable_all( void );
void chip_timer1_set_tcnt( uint16_t tcnt );
void chip_timer1_set_ocrA( uint16_t ocr );
void chip_timer1_set_ocrB( uint16_t ocr );
void chip_timer1_set_icr( uint16_t icr );

void chip_wdt_enable( wdtTime time );
void chip_wdt_disable( void );

void chip_adc_enable( adcPresc presc, bool interrupt_enable, bool single_mode );
void chip_adc_disable( void );
void chip_adc_set_channel( adcChannel channel, adcReference ref );
void chip_adc_start( void );
uint16_t chip_adc_process( void );

usartError chip_usart0_get_error( void );
void chip_usart0_enable( uint32_t baudrate, uint32_t f_cpu );
void chip_usart0_rx_int_enable( void );
void chip_usart0_rx_int_disable( void );
void chip_usart0_tx_int_enable( void );
void chip_usart0_tx_int_disable( void );
void chip_usart0_transmit( uint8_t data );
uint8_t chip_usart0_receive( void );

Re: Удобно ли такое программирование?

MiBBiM » 31 июл 2008, 21:18

Я пишу пару деректив препроцессора на снятие, установку бита+при инициализации пишу значения регистров в двоичном формате (+небольшой комментарий). В итоге получается красиво+быстро :)

Re: Удобно ли такое программирование?

Сергей » 31 июл 2008, 22:04

А я не говорю что это быстрее. ( но не слишком медленно, это просто красиво обернутые те же команды ) Приведи пример, будем сравнивать. Ну вот к примеру настройка таймера1 и вывода OC1A
Код: Выделить всёРазвернуть
int main( void )
{
   chip_set_output( ioPortB, ioPin1, false );
   
   cli();
   
   chip_timer1_set_compare_block( outputTimer1_A, outputTimer1_invert );
   chip_timer1_enable( prescTimer_64, modeTimer1_normal, false, false );
   
   chip_timer1_set_tcnt( 20000 );
   
   sei();
   
   while(1);
   
   return 0;
}


Добавлено спустя 1 минуту:
MiBBiM писал(а):Я пишу пару деректив препроцессора на снятие, установку бита+при инициализации пишу значения регистров в двоичном формате (+небольшой комментарий). В итоге получается красиво+быстро :)

Кстати это никто не отменяет, я тоже этим пользуюсь.

Re: Удобно ли такое программирование?

=DeaD= » 31 июл 2008, 22:27

Че-то я сомневаюсь что в строках:
Код: Выделить всёРазвернуть
   chip_timer1_set_compare_block( outputTimer1_A, outputTimer1_invert );
   chip_timer1_enable( prescTimer_64, modeTimer1_normal, false, false );

Прямо так совсем не накосячить, а вот в обычных выставлениях регистров все только и делают что косячат.
Тогда уж визарды надо делать как в одной из сред разработки - чтобы в них инициализировать всё правильно.

Re: Удобно ли такое программирование?

Сергей » 31 июл 2008, 22:42

Накосячить можно где угодно. Но тут наглядно, накосячить с выставлениями битов и значениями уже сложнее, да и через пару месяцев код останеца читабельным

Добавлено спустя 7 минут 59 секунд:
Ну все что я хотел услышать услышал, так что закрываю тему.


Rambler\'s Top100 Mail.ru counter