Вс окт 20, 2013 16:58:22
Вс окт 20, 2013 17:53:41
#define sbi(port, b) (port) |= (1 << (b))
#define cbi(port, b) (port) &= ~(1 << (b))
#define TOGGLE(x,y) ((x) ^= (1<<(y)))
#define CHECKBIT(x,y) ((x) & (1<<(y)))
#define PortSetPin(port,b,value) if (value) sbi((port),(b)); else cbi((port),(b))
if(TestPinTrue(pin,7)==1) PortSetPin(port, 0, 1);
else PortSetPin(port, 0, 0);
if CHECKBIT( PINA, 7 ) sbi(PORTB, 0); else cbi(PORTB, 0);
Вс окт 20, 2013 18:50:39
будет выглядеть вот так:
- Код:
if CHECKBIT( PINA, 7 ) sbi(PORTB, 0); else cbi(PORTB, 0);
Вс окт 20, 2013 20:35:30
char port = PORTB;
char pin = PINA;
char b = 7;
if CHECKBIT( pin, b ) sbi(port, 1); else cbi(port, 1);
Пн окт 21, 2013 01:55:51
В листинге ассемблера получается целая портянка для реализации этого кода, она по длине в 10 раз больше предыдущего варианта.
char pin = PINB;
Пн окт 21, 2013 08:14:12
sbi( DDRA, 1 );
cbi( PORTA, 1 );
while (1) {
unsigned char * port = ( unsigned char * ) ( 0x1B + 0x20 );
unsigned char * pin = ( unsigned char * ) ( 0x19 + 0x20 );
char b = 1;
if CHECKBIT( * pin, b ) cbi( * port, b ); else sbi( * port, b );
delay_ms(1);
}
Вт окт 22, 2013 01:49:19
Использовать PORTA и PINA напрямую по всей видимости нельзя
Может проще явно работу с ними прописывать?
Задача функции такая. Есть у меня две функции одинаковые они полностью отличаются только они как раз что используют разные PIN и PORT.
первая использует PIND.5 PIND.0 PINB.3 и PORTD.0
вторая использует PIND.0 PIND.5 PINB.4 и PORTD.5
одинаковые PINы используются в разных местах кода.
Так вот для начала я хочу эти две функции объединить в одну, оптимизировать а нужные PINы и PORTы передавать ей в качестве параметров при вызове. или вот думаю можно так реализовать смену PINов в самой функции по команде через параметр
void TestPort(int command)
{
port; // здесь мы объявили переменные для порта и пина, но какой ставить тип переменных ?
pin;
if(command==1)
{
port = PORTB; // здесь мы присваиваем переменным номер порта и пина в зависимости от команды
pin = PINB.5;
}
if(pin)port=0; // работаем с переменными пора и пина
else port=1;
}
вот так тоже делать пришла идея но как?
Вообще это устройство у меня стоит в авто уже года три назад я его сам собрал. его назначение это управление стёклами (стеклоподъёмник) и закрывает он их автоматически при постановке на сигнализацию. У меня там две функции есть одна управляет закрытием водительского окна , другая закрытием пассажирского окна, они одинаковые различаются только работой с разными пинами и портом. Поюзав это собственно ручно собранное замечательное устройство не один год и убедившись в его замечательной надёжности и нужности я решил сделать ему upgrade добавить дополнительно новые функции полезные и подключить его к блютузу.
В частности планируется задействовать в алгоритме ещё и открывание окон (щас только закрыванием онных оно отвечает). Не писать же ещё две такие же функции на открывание
поэтому я и решил написать одну функцию и в параметрах при вызове указывать ей какое окно открывать или закрывать. Вот в чём задумка!!!
Я понимаю некоторые могут подумать и сказать типа пиши четыре функции одинаковых и иди пей пиво светлое, тёмное кому как нравиться на вкус и цвет товарищей нет. Яб мог конечно так сделать еслиб был пивным алкоголиком но я не из них! Мне кажется это логически неправильно так делать. Да и ресурсы у контроллера не безграничные!!! щас стоит ATTINY2313 новую реализацию планирую реализовать на ATMEGA8 а то чёт ног у 2313 не хватает мне чуть чуть
Вт окт 22, 2013 08:03:19
#include <mega16.h>
#include <delay.h>
#define sbi(port, b) (port) |= (1 << (b))
#define cbi(port, b) (port) &= ~(1 << (b))
#define TOGGLE(x,y) ((x) ^= (1<<(y)))
#define CHECKBIT(x,y) ((x) & (1<<(y)))
sbi( DDRA, 1 );
cbi( PORTA, 1 );
while (1) {
unsigned char * port = ( unsigned char * ) ( & PORTA );
unsigned char * pin = ( unsigned char * ) ( & PINA );
char b = 1;
CHECKBIT( * pin, b ) ? (cbi( * port, b )) : (sbi( * port, b ));
delay_ms(1);
}
Вт окт 22, 2013 12:18:56
ZiperRUS писал(а):первая использует PIND.5 PIND.0 PINB.3 и PORTD.0
вторая использует PIND.0 PIND.5 PINB.4 и PORTD.5
одинаковые PINы используются в разных местах кода.
Так вот для начала я хочу эти две функции объединить в одну, оптимизировать а нужные PINы и PORTы передавать ей в качестве параметров при вызове. или вот думаю можно так реалировать смену PINов в самой функции по команде через параметр, вот как то так:
void TestPort(int command)
{
port; // здесь мы объявили переменные для порта и пина, но какой ставить тип переменных ?
pin;
if(command==1)
{
port = PORTB; // здесь мы присваиваем переменным номер порта и пина в зависимости от команды
pin = PINB.5;
}
if(pin)port=0; // работаем с переменными пора и пина
else port=1;
}
вот так тоже делать пришла идея но как?
Вт окт 22, 2013 18:38:04
Чт окт 24, 2013 11:42:20
Вс окт 27, 2013 01:58:11
Пн окт 28, 2013 19:37:46
void main (void)
{
// инициализация
// вставлять сюда
// прочая инициализация
// основной цикл
}
Вт окт 29, 2013 13:04:37
Чт авг 10, 2023 13:11:45
void buzz_n_blink(uint16_t duration, uint8_t quantity, uint16_t pause, uint8_t pin)
{
// аргументы: длительность, количество, пауза (2-я длительность), нога
for (uint8_t i=0; i < quantity; i++) // количество оборотов цикла опеределено в quantity
{
PORTA |=(1<<pin); // поднимаем ногу
loopdelay(duration); // вызываем задержку
PORTA &=~(1<<pin); // опускаем ногу
if (pause >= 1) loopdelay(pause); // если аргумент pause больше или равен единице, то запускаем второй таймер
}
}
void buzz_n_blink(uint16_t duration, uint8_t quantity, uint16_t pause, uint8_t pin)
{
// аргументы: длительность, количество, пауза (2-я длительность), нога
for (uint8_t i=0; i < quantity; i++) // количество оборотов цикла опеределено в quantity
{
if (pin == PORTB) PORTB |=(1<<pin);
else PORTA |=(1<<pin); // поднимаем ногу
loopdelay(duration); // вызываем задержку
if (pin == PORTB) PORTB &=~(1<<pin);
else PORTA &=~(1<<pin); // опускаем ногу
if (pause >= 1) loopdelay(pause); // если аргумент pause больше или равен единице, то запускаем второй таймер
}
}