CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

kotriks писал(а):!(PINB & (1 << 4))==1
это условие никогда не будет истинным, потому что в скобках слева от == будет либо 0, либо 0x10
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: CodeVision AVR в вопросах и ответах

Сообщение Z_h_e »

ARV писал(а):либо 0x10
Этого значения вряд ли будет, ибо есть еще !.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

Z_h_e писал(а):ибо есть еще
ARV писал(а):в скобках слева от == будет либо 0, либо 0x10
:)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: CodeVision AVR в вопросах и ответах

Сообщение Z_h_e »

Ну рассматривать надо не только то что в скобках. Хотя в данном случае без разницы. Конструкция неверная.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

вот ведь не задача, чёж придумать то )))
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: CodeVision AVR в вопросах и ответах

Сообщение Z_h_e »

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

Вас спрашивали про отладку. Пошаговое выполнение своей программы - основной метод отладки. Выполняйте по шагам программу в симуляторе, глядите за состоянием каждой переменной, регистра и пр. на каждом этапе. Добавляйте и убирайте тестовый куски кода и анализируйте. Что Вам мешает, например, вместо функции getchar поставить константу и поглядеть как сработает остальной код.

На счет Вашего if'а. Вы должны понять что false - это нуль, true - это любое значение кроме нуля.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: CodeVision AVR в вопросах и ответах

Сообщение COKPOWEHEU »

Тут не только правила русского языка. Человек похоже просто не понимает что хочет получить, поэтому и не может сформулировать это нам. Еще он совершенно не разбирается в программировании - пытается слепить хоть что-то из имеющихся функций, не понимая принцип их действия. Поэтому же и в отладку / дизассемблер не лезет - "там же все сложно".
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

я смотрю вы тут все понимающие, попросил помочь элементарную функцию отладить, они вместо этого тока умничают, и я написал, что я хочу по русски и со знаками препинания. БЕЗДАРИ :))
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

Re: CodeVision AVR в вопросах и ответах

Сообщение realm »

Даа... Тут любят поумничать.
if ((PINB & (1 << 4)) == 0) для 0 на порте
if ((PINB & (1 << 4)) != 0) для 1 на порте
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: CodeVision AVR в вопросах и ответах

Сообщение Z_h_e »

Наверное вы найдете общий язык друг с другом. Вы, realm, тоже не желали читать,что Вам пишут. Я, для kotriks, сразу указал правильный вариант логического выражения и казалось бы обсуждать его больше ничего, однако...

realm, зачем сравнивать результат логического выражения, самодостаточного для оператора ветвления, на равенство с 0?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

kotriks писал(а):попросил помочь элементарную функцию отладить
Если бы ещё нормально объяснили. что именно хотите получить. Лично я несколько раз перечитывал Ваши сообщения, но так и не понял, чего НУЖНО добиться. И, судя по всему, не я один.

Сформулируйте задачу по-человечески. Для начала, нигде не указано, как подключена кнопка. Обычно, нажатая кнопка - это 0 на пине, как у Вас - неизвестно. Далее, что должно происходить, когда ничего не нажато (if(PINB&(1<<4)), а что - когда нажато (else). Как устроена функция getChar() - программа тупо висит в ней, пока принимается символ по UART, или данные берутся из какого-то буфера.

А то Вы выкладываете кусок кода, к тому же неотформатированного, с пляшущими отступами, с неизвестно что делающими функциями, и, не сказав, что хотите получить, просите с этим разобраться. Неудивительно, что результата ноль.
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

Если это поможет то вот .
Спойлер

Код: Выделить всё


#include "softUart.h"

#define TRUE 1
#define FALSE 0

#define RX_NUM_OF_BITS  10
#define TX_NUM_OF_BITS  10
#define NUM_OF_CYCLES   3

static volatile uint8_t inbuf[SUART_BUF_SIZE];
static volatile uint8_t	qin = 0;
static volatile uint8_t	qout = 0;

static volatile uint8_t 	flag_rx_ready;
static uint8_t 	                flag_rx_waiting_for_stop_bit;
static uint8_t 	                flag_rx_off;
static uint8_t 	                rx_mask;
static uint8_t 	                timer_rx_ctr;
static uint8_t 	                bits_left_in_rx;

static volatile uint8_t 	flag_tx_busy;
static volatile uint8_t 	timer_tx_ctr;
static volatile uint8_t 	bits_left_in_tx;
static volatile uint16_t	internal_tx_buffer;

//________________________
#define get_rx_pin_status() RX_PINX & (1<<RX_PIN)
#define set_tx_pin_high()   TX_PORTX |= (1<<TX_PIN)
#define set_tx_pin_low()    TX_PORTX &= ~(1<<TX_PIN)


#define TIME_VALUE  (F_CPU/(SUART_BAUD_RATE*NUM_OF_CYCLES*SUART_PRESCALER))
#define TIMER_TCNT_VALUE (0xff - (TIME_VALUE - 1))
#define ERROR_VALUE ((F_CPU*100)/(TIME_VALUE*SUART_BAUD_RATE*NUM_OF_CYCLES*SUART_PRESCALER))

#if ((TIME_VALUE > 256)||(TIME_VALUE == 0))
   #error "TIMER_TCNT_VALUE is not correct. Change PRESCALER, BAUD_RATE or F_CPU"
#endif

#if ((ERROR_VALUE > 100)||(ERROR_VALUE < 100))
   #warning "Baud rate error > 1%"
#endif

#if SUART_PRESCALER==1L 
  #define CSXX (0<<CS02)|(0<<CS01)|(1<<CS00)
#elif SUART_PRESCALER==8L 
  #define CSXX (0<<CS02)|(1<<CS01)|(0<<CS00)
#elif SUART_PRESCALER==64L 
  #define CSXX (0<<CS02)|(1<<CS01)|(1<<CS00)
#elif SUART_PRESCALER==256L 
  #define CSXX (1<<CS02)|(0<<CS01)|(0<<CS00)
#elif SUART_PRESCALER==1024L 
  #define CSXX (1<<CS02)|(1<<CS01)|(1<<CS00)
#else 
  #error "prescaller not correct"
#endif

#ifdef __CODEVISIONAVR__
   #define TIM0_OVF_VECTOR   TIM0_OVF
#else 
   #define TIM0_OVF_VECTOR   TIM0_OVF_vect
#endif

ISR(TIM0_OVF_VECTOR)
{
   uint8_t   start_bit, flag_in;
   uint8_t rx_data; 
   static uint16_t  internal_rx_buffer;
   
   TCNT0 += TIMER_TCNT_VALUE;
   
/* Transmitter Section */
   if (flag_tx_busy){
      --timer_tx_ctr;
      if (!timer_tx_ctr){
         if (internal_tx_buffer & 0x01){
            set_tx_pin_high();
         }
         else{
            set_tx_pin_low();
         }
         internal_tx_buffer >>= 1;
         timer_tx_ctr = NUM_OF_CYCLES;
         --bits_left_in_tx;
         if (!bits_left_in_tx){
            flag_tx_busy = FALSE;
            set_tx_pin_high();
         }
      }
   }
/* Receiver Section */
   if (flag_rx_off == FALSE){
      if (flag_rx_waiting_for_stop_bit){
         if ( --timer_rx_ctr == 0 ){
            flag_rx_waiting_for_stop_bit = FALSE;
            flag_rx_ready = FALSE;
            rx_data = (uint8_t)internal_rx_buffer;
            if ( rx_data != 0xC2 ){
               inbuf[qin] = rx_data;
               if ( ++qin >= SUART_BUF_SIZE ){
                  qin = 0;
               }
            }
         }
      }
      else{   // rx_test_busy
         if ( flag_rx_ready == FALSE ){
            start_bit = get_rx_pin_status();
            if ( start_bit == 0 ){
               flag_rx_ready = TRUE;
               internal_rx_buffer = 0;
               timer_rx_ctr = NUM_OF_CYCLES + 1;
               bits_left_in_rx = RX_NUM_OF_BITS;
               rx_mask = 1;
            }
         }
         else{	// rx_busy
            if ( --timer_rx_ctr == 0 ){				
               timer_rx_ctr = NUM_OF_CYCLES;
               flag_in = get_rx_pin_status();
               if ( flag_in ){
                  internal_rx_buffer |= rx_mask;
               }
               rx_mask <<= 1;
               if ( --bits_left_in_rx == 0 ){
                  flag_rx_waiting_for_stop_bit = TRUE;
               }
            }
         }
       }
   }
	
}


void SUART_Init(void)
{
   /*инициализация флагов*/   
   flag_tx_busy = FALSE;
   flag_rx_ready = FALSE;
   flag_rx_waiting_for_stop_bit = FALSE;
   flag_rx_off = FALSE;
   
   /*настройка выводв*/
   RX_DDRX &= ~(1<<RX_PIN);
   RX_PORTX |= (1<<RX_PIN);
   TX_DDRX |= (1<<TX_PIN);
   TX_PORTX |= (1<<TX_PIN);
        
   /*настройка таймера Т0*/
   TCCR0B = CSXX;  
   TCNT0 = TIMER_TCNT_VALUE;
   TIMSK |= (1<<TOIE0);
}

char SUART_GetChar(void)
{
   uint8_t tmp;  
   char ch;
   
   do{
      tmp = qin;  
      while (qout == tmp){
         SUART_Idle();
         tmp = qin;
      }
      ch = inbuf[qout];
      if ( ++qout >= SUART_BUF_SIZE ){
         qout = 0;
      }
   }while ((ch == 0x0A) || (ch == 0xC2));
   
   return ch;
}

void SUART_FlushInBuf(void)
{
   qin = 0;
   qout = 0;
}

char SUART_Kbhit(void)
{
   uint8_t tmp = qout;
   return( qin!=tmp );
}

void SUART_TurnRxOn(void)
{
   flag_rx_off = FALSE;
}

void SUART_TurnRxOff(void)
{
   flag_rx_off = TRUE;
}

void SUART_PutChar(char ch)
{
   while(flag_tx_busy){};
   timer_tx_ctr = NUM_OF_CYCLES;
   bits_left_in_tx = TX_NUM_OF_BITS;
   internal_tx_buffer = ((uint16_t)ch<<1) | 0x200;
   flag_tx_busy = TRUE;
}

void SUART_PutStr(char *str)
{  
   char ch;
   while (*str){
      ch = *str++;
      SUART_PutChar(ch);
   }
}


void SUART_PutStrFl(char __flash  *str)
{
   char ch;   
   ch = read_byte_flash(*str); 
   while (ch) { 
      SUART_PutChar(ch); 
      str++;  
      ch = read_byte_flash(*str);
   }
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

kotriks писал(а):и всётаки дело не в getchar, оставил только выводы без команды просто по нажатию кнопки
добавил после FIG VAM, NO COMMAND сообщение вывод и вот пока нажимаеш кнопку летят оба сообщения хотя должно проскакивать if если не нажата кнопка и выводится постоянно сообщение NO COMMAND не так ли ?
Вы хоть свои и чужие сообщения читаете ?
У Вас вопрос был :
kotriks писал(а):не пропускается пока что либо в юарт не отправить
Отсюда и ответ был, что getchar тупо висит, пока что-либо не придёт ему.

А теперь у Вас уже другая проблема - с условием. else поставьте и не будут лететь оба сообщения.

Добавлено after 4 minutes 10 seconds:
Упс... Тут ещё целую страницу понаписали. Не заметил ... :oops:
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

Re: CodeVision AVR в вопросах и ответах

Сообщение realm »

Вопрос.
Нужно пропустить первые 16 байт в еепроме.
Есть 2 переменные:
eeprom unsigned char EmptyDat[16];
eeprom unsigned int MyVar;
Так MyVar должна попасть в адрес 0x10.
В софте EmptyDat не используется, он только для того, чтоб все остальные переменные расположились начиная с адреса 0x10.
Проблема: После компиляции EmptyDat удаляется, как не используемая. И на ее место переносится MyVar, то есть в адрес 0.
Там надо что-то написать компилятору, чтоб он EmptyDat не трогал, даже если она не используется, но не помню что.
Вопрос - что?
Последний раз редактировалось realm Пн ноя 14, 2016 17:07:23, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

realm писал(а):но не помню что
Для этого есть вспоминалки-напоминалки, под названием "Мануалы" !
Что он (мануал) говорит по этому поводу ?
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

Alex, да по else я знаю и всё получается с этим не летят два сообщения а вот то что висит на Getchar это да.
сделал так

Код: Выделить всё

if (!(PINB | (1 << 4))==1) {

buf = SUART_GetChar();
delay_ms(100);

    if (buf == '1'){
       SUART_PutStr("FIG VAM");   
         }    
 }           
 
теперь пропускает весь код заключённый с правилом под if ,а когда нажата кнопка ждёт комманды жму 1 сообщение не выводится, отжимаеш кнопку тупо перескакивает в бесконечный цикл и всё. Это всё я делаю программный UART так как на тиньке его нет вот и не знаю куда и как реализовать так чтобы комманды выполнялись тока по нажатию кнопки так сказать активировать меню комманд.
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

Re: CodeVision AVR в вопросах и ответах

Сообщение realm »

А вы можете по человечески описать то, что вам надо добиться.

Добавлено after 11 minutes 21 second:
Аlex писал(а): Что он (мануал) говорит по этому поводу ?
Про переменные - ничего.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

realm писал(а):Про переменные - ничего.
Значит создавайте свои функции для работы с EEPROM.
Ну а вообще, не понятно, для чего это нужно. Вас же не волнует где, например, располагаются обычные переменные. Почему в eeprom'е заинтересовали ? :dont_know:

Добавлено after 2 minutes 25 seconds:
kotriks, на самом деле, совершенно не понятно, что Вам нужно. Объясните нормально, человеческим языком.
Скорее всего, Вы сами не знаете что Вам нужно. Отсюда и объяснить нормально не можете.
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

Re: CodeVision AVR в вопросах и ответах

Сообщение realm »

Аlex писал(а):Почему в eeprom'е заинтересовали ? :dont_know:
В старых мегах портится 0-я ячейка еепром. Как там с этим делом обстоят дела сейчас - да без понятия. Проще расположить все данные начиная с адреса 0x10 и забыть об этой проблеме, не вникая.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Ну и располагайте тогда с нулевого адреса, но на 16 байт больше. Ну а первые 16 байт просто не трогайте.
Ответить

Вернуться в «AVR»