Chyba v programu při definici portů-použití pointerů a maker

Řeším problém s částí programu, takto napsaný program je funkční:

//Příkaz reset
void RESET(volatile unsigned char *pPORT,unsigned char DQ)
{

#define DS_PORT *pPORT	//PORT(x)
pPORT--;				
#define DS_DDR *pPORT	//DDR(x)

	DS_PORT&=~(1<<DQ);
	DS_DDR|=1<<DQ;			
	_delay_us(480);	
				
	DS_DDR&=~(1<<DQ);	
	_delay_us(65);

	PRESEN = 0;
//Pokud je připojeno čidlo PRESEN = 1

	pPORT--;
	if((*pPORT&(1<<DQ)) == 0)
		{
			PRESEN = 1;	
		}
	_delay_us(480);
}

Pokud ale zkusím program napsat takto:

//Příkaz reset
void RESET(volatile unsigned char *pPORT,unsigned char DQ)
{
#define DS_PORT *pPORT	//PORT(x)
/*
Snížení adresy pPORT o 1 např: pro PORTD(0x12)
bude po snížení pPORT(0x11) tj. DDRD
*/
pPORT--;				
#define DS_DDR *pPORT	//DDR(x)
/*
Znovu adresy pPORT o 1 tj. pro (0x11)
bude po snížení pPORT(0x10) tj. PIND
*/
pPORT--;				
#define DS_PIN *pPORT	//PIN(x)

	DS_PORT&=~(1<<DQ);
	DS_DDR|=1<<DQ;			
	_delay_us(480);	
				
	DS_DDR&=~(1<<DQ);	
	_delay_us(65);

	PRESEN = 0;
//Pokud je připojeno čidlo PRESEN = 1

	if((DS_PIN&(1<<DQ)) == 0)
		{
			PRESEN = 1;	
		}
	_delay_us(480);
}

při zapsání do uP nefunguje. V obou případech proběhne překlad v AVR Studiu bez chyb.
Zajímalo by mě kde je chyba.
Děkuji.

:arrow_right: administrator: přejmenováno z "Chyba v programu při definici portů"

Chodit by to nemělo ani v jednom případě. Všechny makra jsou totiž při překladu nahrazeny pointerem *pPort a ten má během manipulací s porty stejnou konstantní hodnotu(mimo první případ na konci, tam je změněn).
Místo maker použij zápis *(pPort - 1) |= …

edit: aby to šlo přeložit o něco efektivněji, měl bys mít v pointeru minimum a pouze přičítat. Pak se použije “STD Y+q, Rr” nebo “ST Y+, Rr”. Kdežto kdybys chtěl odečítat, je k dospozici jen “ST -Y, Rr”.
Jinými slovy efektivní budou zápisy:
*(pPort++)… // pPort po operaci inkrementován
*(pPort + q)… // q = <0, 63>, pPort nezměněn
*(–pPort)… // pPort před operací dekrementován
Překladač si poradí i s jinými zápisy, ale bude to trvat o pár taktů více.