CodeVision AVR в вопросах и ответах
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
блин как это понять. никак не переварю
как бы объяснить.
interrupt [бла бла бла] бла бла бла
{PORTB.0=~PORTB.0;}
void main (void)
бла бла бла
бла бла бла
while (1)
{
PORTB=digits[discharge[1]];
}
вот так присваиваю семисигменту нужную цифру. но нужно не изменять младший бит. он должен изменятся только в прерывании
как бы объяснить.
interrupt [бла бла бла] бла бла бла
{PORTB.0=~PORTB.0;}
void main (void)
бла бла бла
бла бла бла
while (1)
{
PORTB=digits[discharge[1]];
}
вот так присваиваю семисигменту нужную цифру. но нужно не изменять младший бит. он должен изменятся только в прерывании
Последний раз редактировалось mixon46 Чт апр 20, 2017 22:00:29, всего редактировалось 1 раз.
- Реклама
- НАПАЛМ
- Это не хвост, это антенна
- Сообщения: 1314
- Зарегистрирован: Пт ноя 27, 2009 19:47:13
- Откуда: Казань
Re: CodeVision AVR в вопросах и ответах
Можно скопировать состояние вашего бита, который вы не хотите менять, и включить его в переменную, которую вы хотите в порт вывести. Так же у AVR есть ассемблерные команды работы с каждым битом порта в отдельности, но это будет дольше работать)
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
я понимаю что можно. только не понимаю как. давно не занимался с codevision
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
4 буквы написать, остальное даже сам поисковик за тебя додумывает :

Неужели проще сидеть и ждать, пока кто-нибудь догадается, что конкретно Вам нужно ?
Неужели проще сидеть и ждать, пока кто-нибудь догадается, что конкретно Вам нужно ?
- Вложения
-
- 2017-04-20_23-20-42.png
- (25.72 КБ) 815 скачиваний
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
&= и |= в помощь
- Реклама
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
так вот и ищу же как решить эту проблему. только понять не могуАlex писал(а):4 буквы написать, остальное даже сам поисковик за тебя додумывает :
как я понимаю надо взять значение порта и присвоить ему значение но с маской на младший бит. как блин это сделать
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
как говорите, так и записываете,mixon46 писал(а):надо взять значение порта и присвоить ему значение но с маской на младший бит. как блин это сделать
только не на русском языке, а на языке Си:
Код: Выделить всё
#define MASK 0x01
unsigned char data;
PORTB = (PORTB & MASK) | (data & ~MASK);если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Вам нужно сделать 2 операции.
1. Сброс всех битов, которые будут модифицироваться, с помощью "&" и маской.
2. Установка необходимых битов с помощью "|", маской будет являться само устанавливаемое значение.
Добавлено after 6 minutes 55 seconds:
Получится 2 операции - & с маской и "|" с исходными данными.
PS: Это не для ARV'а, а для ТС'а
1. Сброс всех битов, которые будут модифицироваться, с помощью "&" и маской.
2. Установка необходимых битов с помощью "|", маской будет являться само устанавливаемое значение.
Добавлено after 6 minutes 55 seconds:
Этого можно не делать, если исходные данные не затрут "ненужный" бит.ARV писал(а):& ~MASK
Получится 2 операции - & с маской и "|" с исходными данными.
PS: Это не для ARV'а, а для ТС'а
Re: CodeVision AVR в вопросах и ответах
Что-то я совсем потерялся, как получить доступ к глобальной переменной из функции.
пример
Допустим я хочу внутри функции иметь доступ к s1, как ее передать туда и изменить там ума не приложу.
объявления типа bit в теле функций не работает, на char ругается, что это не char.
Создавать промежуточные переменные я не хочу, ибо bit это 1 бит, и в один байт в регистре можно 8 переменных пихнуть, а любая переменная это минимум 8 бит минимум и вся экономия коту под хвост.
пример
Код: Выделить всё
volatile bit s1; //
char function (char a, char b) {
if (a == b) return 0;
}
объявления типа bit в теле функций не работает, на char ругается, что это не char.
Создавать промежуточные переменные я не хочу, ибо bit это 1 бит, и в один байт в регистре можно 8 переменных пихнуть, а любая переменная это минимум 8 бит минимум и вся экономия коту под хвост.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
глобальные переменные доступны ни же по коду в теле любых функций напрямую:jeka79 писал(а):Допустим я хочу внутри функции иметь доступ к s1, как ее передать туда и изменить там ума не приложу
Код: Выделить всё
volatile bit s1; //
char function (char a, char b) {
s1 = 1; // вот так
if (a == b) return 0;
}уже как бы намекают вам, что bit - это костыль, в стандарте Си нет такого типа. и зря вы им пользуетесь - уже сейчас у вас проблемы, а что потом будет? пользуйтесь только стандартными типами Си - будет вам счастье.jeka79 писал(а):объявления типа bit в теле функций не работает, на char ругается, что это не char
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Прочитал в факе кодвижн bit это заюз младших регистров, если у меня булевые данные зачем мне использовать для их хранения обычные переменные, с каждой новой переменной код пухнет, а для меня крайне критична минимизация, поэтому в глобальной переменной типа bit удобно хранить такие данные, можно конечно и обычные переменные заюзать и побитно с ними работать, но это не очень удобно, с типом бит проще, с отдельным битом как с обычной переменной.
спс понял, что объявлять не надо, все заработало.
спс понял, что объявлять не надо, все заработало.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Глобальные переменные на то и глобальные, что их область видимости расширенная. Их не нужно никуда передавать, они видятся везде.jeka79 писал(а):Допустим я хочу внутри функции иметь доступ к s1, как ее передать туда и изменить там ума не приложу
Естественно. Под локальные переменные выделяется область в стеке, при входе в функцию, а как компилятору выделить 1 бит ?jeka79 писал(а):объявления типа bit в теле функций не работает
По этому, если компиляторы поддерживают битовый тип, то они могут быть только глобальными или статическими, чтобы линкер на этапе компиляции, заранее, выделил под них место.
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
AVR, я подумал и ваше решение подошло. Только я упростил. Так как в data младший бит уже равен 0 то можно проще
PORTB=data|(PORTB&0b00000001)
Решение нашлось. Спасибо))
PORTB=data|(PORTB&0b00000001)
Решение нашлось. Спасибо))
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
А тут не совсем верно. Побитное хранение нескольких (до восьми штук в одном байте) флагов требует большего количества (читай, размера)кода, чем для каждой своей переменной. Хотя ОЗУ экономится, это да.jeka79 писал(а):если у меня булевые данные зачем мне использовать для их хранения обычные переменные, с каждой новой переменной код пухнет, а для меня крайне критична минимизация
По крайней мере, для AVR это так.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Решение давно уже было дано :mixon46 писал(а):Только я упростил. Так как в data младший бит уже равен 0 то можно проще
PORTB=data|(PORTB&0b00000001)
Решение нашлось. Спасибо))
Аlex писал(а):Этого можно не делать, если исходные данные не затрут "ненужный" бит.ARV писал(а):& ~MASK
Получится 2 операции - & с маской и "|" с исходными данными.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Набросал и маленький простенький пример.WiseLord писал(а):Побитное хранение нескольких (до восьми штук в одном байте) флагов требует большего количества (читай, размера)кода, чем для каждой своей переменной
Это компилируется в 206 байтов:
Спойлер
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
#include "pins.h"
typedef struct
{
uint8_t a:1;
uint8_t b:1;
uint8_t c:1;
uint8_t d:1;
} MyFlags;
int main(void)
{
volatile MyFlags flags;
flags.a = 0;
flags.b = 1;
flags.c = 0;
flags.d = 0;
while (1) {
uint8_t x = flags.a;
flags.a = flags.b;
flags.b = flags.c;
flags.c = flags.d;
flags.d = x;
}
return 0;
}Спойлер
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
#include "pins.h"
typedef struct
{
uint8_t a;
uint8_t b;
uint8_t c;
uint8_t d;
} MyFlags;
int main(void)
{
volatile MyFlags flags;
flags.a = 0;
flags.b = 1;
flags.c = 0;
flags.d = 0;
while (1) {
uint8_t x = flags.a;
flags.a = flags.b;
flags.b = flags.c;
flags.c = flags.d;
flags.d = x;
}
return 0;
}- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
так там у вас аж целых 4 байта ОЗУ израсходовано!!!WiseLord писал(а):А это - в 154 байта:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
На самом деле нет - видимо в таком простом примере компилятор это прямо в РОН крутил.
Re: CodeVision AVR в вопросах и ответах
В общем bit рулит, не знаю почему, но только что переписал код на хранение 8 битов в переменной и в типе бит.
разница в 200 байт, при компиляции, для кода из 1 функции и проверки, 6 переменных.
выделил в регистре переменную:
либо просто
в функции с флагами делаю все просто
c переменной:
При чем в асме при работе с bit всегда простые команды SBIS, CBI, а с переменной генерит кучу переходов.
разница в 200 байт, при компиляции, для кода из 1 функции и проверки, 6 переменных.
выделил в регистре переменную:
Код: Выделить всё
register unsigned char t_buf = 0x00;
Код: Выделить всё
bit flag1 = 0;
bit flag2 = 1;
.........
Код: Выделить всё
if (flag) flag = 1;
Код: Выделить всё
if (((t_buf) & (1<<0))) t_buf |= (1<<0);
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Такую фигню :даже самый глупый компилятор должен вырезать не глядя.
Ровно как и такую :

Код: Выделить всё
if (flag) flag = 1;
Ровно как и такую :
Код: Выделить всё
if (((t_buf) & (1<<0))) t_buf |= (1<<0);

