Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с четенето на 16b таймер с avr-gcc и mega128
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=3403
Страница 1 от 1

Автор:  dumfree [ Пон Дек 11, 2006 3:20 pm ]
Заглавие:  Проблем с четенето на 16b таймер с avr-gcc и mega128

В една AtMega128 ползвам TIMER1 за мерене на време, за четене на порта ползвам следния код:
компилатора е avr-gcc
Код:
#define __inw_atomic(port) ({            \
   uint16_t t;                        \
   asm volatile (                     \
      "in __tmp_reg__, __SREG__" "\n\t"   \
      "cli" "\n\t"                  \
      "in %A0, %1" "\n\t"               \
      "in %B0, (%1)+1" "\n\t"            \
      "out __SREG__, __tmp_reg__"         \
      : "=r" (t)                     \
      : "I" (_SFR_IO_ADDR(port))         \
   );                              \
   t;                              \
})

когато го извикам с __inw_atomic(TCNT1) - нямам никави проблеми и си работи, с TCNT2 също нямам проблеми при компилиране, но като го извикам с TCNT3 компилатора пищи с следното.
Код:
file.c:586: warning: asm operand 1 probably doesn't match constraints
file.c:586: error: impossible constraint in `asm'
file.c:586: warning: 't' might be used uninitialized in this function

Не мога да го разбера какъв точно му е проблема. Според мен и оплакването му проблема е заради тези "\n\t" (така наречените constraints), но какво не му харесва не ми е ясно.

Автор:  Реконструктор [ Пон Дек 11, 2006 6:44 pm ]
Заглавие: 

Виж дали компилираш за мега128. По-малките меги са с по 2 таймера.

Автор:  Реконструктор [ Пон Дек 11, 2006 6:46 pm ]
Заглавие: 

Всъщност не, 3 са, но идексите почват от 0.

Автор:  dumfree [ Пон Дек 11, 2006 7:42 pm ]
Заглавие: 

За mega128 го компилирам, видях си грешка в asm-а
за момента реших проблема по грубия начин, ако имам време бих си поиграл да го видя защо е, но ако тръгне едва ли ще се занимавам.

Код:
#define __inw_atomic3(port) ({            \
   uint16_t t;                        \
   asm volatile (                     \
      "in __tmp_reg__, __SREG__" "\n\t"   \
      "cli"  "\n\t"                  \
      "lds %A0, 0x0088" "\n\t"         \
      "lds %B0, 0x0089" "\n\t"         \
      "out __SREG__, __tmp_reg__"         \
      : "=r" (t)                     \
   );                              \
   t;                              \
})

Компилира се, но не съм го пробвал дали работи.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/