Чт апр 20, 2017 21:45:31
Чт апр 20, 2017 22:00:24
Чт апр 20, 2017 22:02:40
Чт апр 20, 2017 22:15:14
Чт апр 20, 2017 22:15:27
Чт апр 20, 2017 22:20:28
Аlex писал(а):4 буквы написать, остальное даже сам поисковик за тебя додумывает :
Чт апр 20, 2017 22:29:56
как говорите, так и записываете,mixon46 писал(а):надо взять значение порта и присвоить ему значение но с маской на младший бит. как блин это сделать
#define MASK 0x01
unsigned char data;
PORTB = (PORTB & MASK) | (data & ~MASK);
Чт апр 20, 2017 22:37:56
Этого можно не делать, если исходные данные не затрут "ненужный" бит.ARV писал(а):& ~MASK
Пт апр 21, 2017 11:42:41
volatile bit s1; //
char function (char a, char b) {
if (a == b) return 0;
}
Пт апр 21, 2017 12:09:54
глобальные переменные доступны ни же по коду в теле любых функций напрямую:jeka79 писал(а):Допустим я хочу внутри функции иметь доступ к s1, как ее передать туда и изменить там ума не приложу
volatile bit s1; //
char function (char a, char b) {
s1 = 1; // вот так
if (a == b) return 0;
}
уже как бы намекают вам, что bit - это костыль, в стандарте Си нет такого типа. и зря вы им пользуетесь - уже сейчас у вас проблемы, а что потом будет? пользуйтесь только стандартными типами Си - будет вам счастье.jeka79 писал(а):объявления типа bit в теле функций не работает, на char ругается, что это не char
Пт апр 21, 2017 12:22:29
Пт апр 21, 2017 12:30:25
Глобальные переменные на то и глобальные, что их область видимости расширенная. Их не нужно никуда передавать, они видятся везде.jeka79 писал(а):Допустим я хочу внутри функции иметь доступ к s1, как ее передать туда и изменить там ума не приложу
Естественно. Под локальные переменные выделяется область в стеке, при входе в функцию, а как компилятору выделить 1 бит ?jeka79 писал(а):объявления типа bit в теле функций не работает
Пт апр 21, 2017 12:34:27
Пт апр 21, 2017 12:35:53
А тут не совсем верно. Побитное хранение нескольких (до восьми штук в одном байте) флагов требует большего количества (читай, размера)кода, чем для каждой своей переменной. Хотя ОЗУ экономится, это да.jeka79 писал(а):если у меня булевые данные зачем мне использовать для их хранения обычные переменные, с каждой новой переменной код пухнет, а для меня крайне критична минимизация
Пт апр 21, 2017 12:40:56
Решение давно уже было дано :mixon46 писал(а):Только я упростил. Так как в data младший бит уже равен 0 то можно проще
PORTB=data|(PORTB&0b00000001)
Решение нашлось. Спасибо))
Аlex писал(а):Этого можно не делать, если исходные данные не затрут "ненужный" бит.ARV писал(а):& ~MASK
Получится 2 операции - & с маской и "|" с исходными данными.
Пт апр 21, 2017 12:45:37
Набросал и маленький простенький пример.WiseLord писал(а):Побитное хранение нескольких (до восьми штук в одном байте) флагов требует большего количества (читай, размера)кода, чем для каждой своей переменной
#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;
}
Пт апр 21, 2017 12:55:20
так там у вас аж целых 4 байта ОЗУ израсходовано!!!WiseLord писал(а):А это - в 154 байта:
Пт апр 21, 2017 13:10:41
Пт апр 21, 2017 14:32:38
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);
Пт апр 21, 2017 14:35:04
if (flag) flag = 1;
if (((t_buf) & (1<<0))) t_buf |= (1<<0);