Chyba při definování portů

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Standa33
Příspěvky: 298
Registrován: 07 lis 2009, 00:00

Chyba při definování portů

#1 Příspěvek od Standa33 »

Při použití takto napsaného programu, mi to funguje bez problémů:

Kód: Vybrat vše

//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 to ale nasíšu takto:

Kód: Vybrat vše

//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);
}

tak po zápisu do uProcesoru, program nefunguje. AVR Studio přeloží oba programy bez chyb.
Zajímalo by mě kde je chyba.
Děkuji.
Uživatelský avatar
majsi
Příspěvky: 51
Registrován: 23 led 2010, 00:00

#2 Příspěvek od majsi »

neviem aky prekladac pouzivas ale toto
pPORT--;
#define DS_DDR *pPORT //DDR(x)

by som nerobil. ide o to ze ked v kode niekde pouzijes DS_DDR tak ti tam prekladac este pred prekladom napise *pPORT. cize sa vykasle na tvoje pPORT--. respektive po vykompilovani sa DS_PORT, DS_DDR a DS_PIN budu rovna pPORT - 0x02; Skus pouzit nieco taketo
#define DS_PORT *pPORT;
#define DS_DDR *(pPORT - 0x01);
#define DS_PIN *(pPORT - 0x02);
Uživatelský avatar
majsi
Příspěvky: 51
Registrován: 23 led 2010, 00:00

#3 Příspěvek od majsi »

teraz som si vsimol ze to su definicie v ramci funkcie. To by som nerobil. definicia nieje funkcia ani datovy typ a je pre cely projekt globala a nemenna. daj tam miesto definicii radsej normalne premenne ktore si mozes nazvat rovnako.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“