- Код: Выделить всё • Развернуть
PORTC.1 = 0;
Что она делает, и можно ли каким-то образом передать эту ножку порта аргументом функции?
Технический форум по робототехнике.
PORTC.1 = 0;
=DeaD= писал(а):Т.е., например, PORTC |= 0x02;
addr_ptr.mask
PORTC |= 0x02;
PORTC.2 = 0;
Вообще говоря это не Си++ это некоторая нашлепка на него от CvAVR.
void SetPinTo1(volatile unsigned char *port, unsigned char bit)
{
*port |= (1<<bit);
}
void SetPinTo0(volatile unsigned char *port, unsigned char bit)
{
*port &= ~(1<<bit);
}
void SetPin(volatile unsigned char *port, unsigned char bit, unsigned char val)
{
*port = (*port&~(1<<bit))|((val&1)<<bit);
}
PORTC.2 = 0; => PORTC &= ~(1<<2);
boez писал(а):
- Код: Выделить всё • Развернуть
void SetPinTo1(volatile unsigned char *port, unsigned char bit)
{
*port |= (1<<bit);
}
enum ports_pins { PORTC1, PORTC2, PORTC3, PORTC4, PORTD1, PORTD2, PORTD3, PORTD4 };
void my_func (ports_pins out)
{
switch(out) {
case PORTC1: PORTC.1 = 1; break;
case PORTC2: PORTC.2 = 1; break;
case PORTC3: PORTC.3 = 1; break;
case PORTC4: PORTC.4 = 1; break;
case PORTD1: PORTD.1 = 1; break;
case PORTD2: PORTD.2 = 1; break;
}
}
Vooon писал(а):2 boez: там кажется нужна была дополнительная магия. Ну и через mmap оно тормознее.
Если достаточно #define'а то лучше обойтись им.
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
#define _MMIO_WORD(mem_addr) (*(volatile uint16_t *)(mem_addr))
#define _MMIO_DWORD(mem_addr) (*(volatile uint32_t *)(mem_addr))