это условие никогда не будет истинным, потому что в скобках слева от == будет либо 0, либо 0x10kotriks писал(а):!(PINB & (1 << 4))==1
CodeVision AVR в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: CodeVision AVR в вопросах и ответах
Этого значения вряд ли будет, ибо есть еще !.ARV писал(а):либо 0x10
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Z_h_e писал(а):ибо есть еще
ARV писал(а):в скобках слева от == будет либо 0, либо 0x10
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: CodeVision AVR в вопросах и ответах
Ну рассматривать надо не только то что в скобках. Хотя в данном случае без разницы. Конструкция неверная.
Re: CodeVision AVR в вопросах и ответах
вот ведь не задача, чёж придумать то )))
- Реклама
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: CodeVision AVR в вопросах и ответах
Для начала, постарайтесь соблюдать правила русского языка. Мы тут все не филологи, я думаю, но текст в стиле первоклассника - это неуважение к другим.
Вас спрашивали про отладку. Пошаговое выполнение своей программы - основной метод отладки. Выполняйте по шагам программу в симуляторе, глядите за состоянием каждой переменной, регистра и пр. на каждом этапе. Добавляйте и убирайте тестовый куски кода и анализируйте. Что Вам мешает, например, вместо функции getchar поставить константу и поглядеть как сработает остальной код.
На счет Вашего if'а. Вы должны понять что false - это нуль, true - это любое значение кроме нуля.
Вас спрашивали про отладку. Пошаговое выполнение своей программы - основной метод отладки. Выполняйте по шагам программу в симуляторе, глядите за состоянием каждой переменной, регистра и пр. на каждом этапе. Добавляйте и убирайте тестовый куски кода и анализируйте. Что Вам мешает, например, вместо функции getchar поставить константу и поглядеть как сработает остальной код.
На счет Вашего if'а. Вы должны понять что false - это нуль, true - это любое значение кроме нуля.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
Тут не только правила русского языка. Человек похоже просто не понимает что хочет получить, поэтому и не может сформулировать это нам. Еще он совершенно не разбирается в программировании - пытается слепить хоть что-то из имеющихся функций, не понимая принцип их действия. Поэтому же и в отладку / дизассемблер не лезет - "там же все сложно".
Re: CodeVision AVR в вопросах и ответах
я смотрю вы тут все понимающие, попросил помочь элементарную функцию отладить, они вместо этого тока умничают, и я написал, что я хочу по русски и со знаками препинания. БЕЗДАРИ 
Re: CodeVision AVR в вопросах и ответах
Даа... Тут любят поумничать.
if ((PINB & (1 << 4)) == 0) для 0 на порте
if ((PINB & (1 << 4)) != 0) для 1 на порте
if ((PINB & (1 << 4)) == 0) для 0 на порте
if ((PINB & (1 << 4)) != 0) для 1 на порте
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: CodeVision AVR в вопросах и ответах
Наверное вы найдете общий язык друг с другом. Вы, realm, тоже не желали читать,что Вам пишут. Я, для kotriks, сразу указал правильный вариант логического выражения и казалось бы обсуждать его больше ничего, однако...
realm, зачем сравнивать результат логического выражения, самодостаточного для оператора ветвления, на равенство с 0?
realm, зачем сравнивать результат логического выражения, самодостаточного для оператора ветвления, на равенство с 0?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Если бы ещё нормально объяснили. что именно хотите получить. Лично я несколько раз перечитывал Ваши сообщения, но так и не понял, чего НУЖНО добиться. И, судя по всему, не я один.kotriks писал(а):попросил помочь элементарную функцию отладить
Сформулируйте задачу по-человечески. Для начала, нигде не указано, как подключена кнопка. Обычно, нажатая кнопка - это 0 на пине, как у Вас - неизвестно. Далее, что должно происходить, когда ничего не нажато (if(PINB&(1<<4)), а что - когда нажато (else). Как устроена функция getChar() - программа тупо висит в ней, пока принимается символ по UART, или данные берутся из какого-то буфера.
А то Вы выкладываете кусок кода, к тому же неотформатированного, с пляшущими отступами, с неизвестно что делающими функциями, и, не сказав, что хотите получить, просите с этим разобраться. Неудивительно, что результата ноль.
Re: CodeVision AVR в вопросах и ответах
Если это поможет то вот .
Спойлер
Код: Выделить всё
#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 в вопросах и ответах
Вы хоть свои и чужие сообщения читаете ?kotriks писал(а):и всётаки дело не в getchar, оставил только выводы без команды просто по нажатию кнопки
добавил после FIG VAM, NO COMMAND сообщение вывод и вот пока нажимаеш кнопку летят оба сообщения хотя должно проскакивать if если не нажата кнопка и выводится постоянно сообщение NO COMMAND не так ли ?
У Вас вопрос был :
Отсюда и ответ был, что getchar тупо висит, пока что-либо не придёт ему.kotriks писал(а):не пропускается пока что либо в юарт не отправить
А теперь у Вас уже другая проблема - с условием. else поставьте и не будут лететь оба сообщения.
Добавлено after 4 minutes 10 seconds:
Упс... Тут ещё целую страницу понаписали. Не заметил ...
Re: CodeVision AVR в вопросах и ответах
Вопрос.
Нужно пропустить первые 16 байт в еепроме.
Есть 2 переменные:
eeprom unsigned char EmptyDat[16];
eeprom unsigned int MyVar;
Так MyVar должна попасть в адрес 0x10.
В софте EmptyDat не используется, он только для того, чтоб все остальные переменные расположились начиная с адреса 0x10.
Проблема: После компиляции EmptyDat удаляется, как не используемая. И на ее место переносится MyVar, то есть в адрес 0.
Там надо что-то написать компилятору, чтоб он EmptyDat не трогал, даже если она не используется, но не помню что.
Вопрос - что?
Нужно пропустить первые 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 в вопросах и ответах
Для этого есть вспоминалки-напоминалки, под названием "Мануалы" !realm писал(а):но не помню что
Что он (мануал) говорит по этому поводу ?
Re: CodeVision AVR в вопросах и ответах
Alex, да по else я знаю и всё получается с этим не летят два сообщения а вот то что висит на Getchar это да.
сделал так
теперь пропускает весь код заключённый с правилом под if ,а когда нажата кнопка ждёт комманды жму 1 сообщение не выводится, отжимаеш кнопку тупо перескакивает в бесконечный цикл и всё. Это всё я делаю программный UART так как на тиньке его нет вот и не знаю куда и как реализовать так чтобы комманды выполнялись тока по нажатию кнопки так сказать активировать меню комманд.
сделал так
Код: Выделить всё
if (!(PINB | (1 << 4))==1) {
buf = SUART_GetChar();
delay_ms(100);
if (buf == '1'){
SUART_PutStr("FIG VAM");
}
}
Re: CodeVision AVR в вопросах и ответах
А вы можете по человечески описать то, что вам надо добиться.
Добавлено after 11 minutes 21 second:
Добавлено after 11 minutes 21 second:
Про переменные - ничего.Аlex писал(а): Что он (мануал) говорит по этому поводу ?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Значит создавайте свои функции для работы с EEPROM.realm писал(а):Про переменные - ничего.
Ну а вообще, не понятно, для чего это нужно. Вас же не волнует где, например, располагаются обычные переменные. Почему в eeprom'е заинтересовали ?
Добавлено after 2 minutes 25 seconds:
kotriks, на самом деле, совершенно не понятно, что Вам нужно. Объясните нормально, человеческим языком.
Скорее всего, Вы сами не знаете что Вам нужно. Отсюда и объяснить нормально не можете.
Re: CodeVision AVR в вопросах и ответах
В старых мегах портится 0-я ячейка еепром. Как там с этим делом обстоят дела сейчас - да без понятия. Проще расположить все данные начиная с адреса 0x10 и забыть об этой проблеме, не вникая.Аlex писал(а):Почему в eeprom'е заинтересовали ?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ну и располагайте тогда с нулевого адреса, но на 16 байт больше. Ну а первые 16 байт просто не трогайте.



