работаю с AT90CAN32. В основной программе обнаружил странную ошибку и в процессе выяснения обстоятельств получил вот такой пример, её иллюстрирующий:
CODE
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "twi_master.h"
unsigned char sendbuf[2] = {0b0011011<<1, 0xB4};
int main(void) {
CLKPR = 0x80;
CLKPR = 0x00;
DDRB = 0xFF;
DDRE |= (1<<PE2);
sei();
TWI_Master_Initialise();
TWI_Start_Transceiver_With_Data(sendbuf, 2);
unsigned char cntr=1;
while(1) {
if (fint) {fint = 0; TWI_Start_Transceiver_With_Data(sendbuf, 2); }
//_delay_us(30); если раскомментировать эту строку
//__asm__ __volatile__ ("ldir25, 0x61" :
;
//или если раскомментировать эту строку, то проблема себя не проявляет
volatile unsigned char tvar2876;
tvar2876 = 0x61;
if (tvar2876 != 0x61) {
PORTB = tvar2876;
PORTE|=1<<2;_delay_us(200);PORTE&=~(1<<2);_delay_us(200);
}
}
return 0;
}
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "twi_master.h"
unsigned char sendbuf[2] = {0b0011011<<1, 0xB4};
int main(void) {
CLKPR = 0x80;
CLKPR = 0x00;
DDRB = 0xFF;
DDRE |= (1<<PE2);
sei();
TWI_Master_Initialise();
TWI_Start_Transceiver_With_Data(sendbuf, 2);
unsigned char cntr=1;
while(1) {
if (fint) {fint = 0; TWI_Start_Transceiver_With_Data(sendbuf, 2); }
//_delay_us(30); если раскомментировать эту строку
//__asm__ __volatile__ ("ldir25, 0x61" :

//или если раскомментировать эту строку, то проблема себя не проявляет
volatile unsigned char tvar2876;
tvar2876 = 0x61;
if (tvar2876 != 0x61) {
PORTB = tvar2876;
PORTE|=1<<2;_delay_us(200);PORTE&=~(1<<2);_delay_us(200);
}
}
return 0;
}
Реализация функций работы с TWI взяты из AppNote315 (файлы TWI_Master.h и TWI_Master.c, приложены: Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла).
Проблема заключается в том, что на PORTB выводится число 0х61 - т.е. срабатывает сравнение tvar2876 != 0x61, хотя очевидно, что такого быть не должно. Имя переменной tvar2876 выбрано случайным (специально, чтоб не думалось, что эта переменная где-то объявлена как external в других модулях).
Делаю следующий вывод по asm-листингу: Нажмите для просмотра прикрепленного файла регистр r24, участвующий в операции сравнения меняется где-то в TWI-функциях (побочный эффект).
В чем может быть проблема ? Ранее с таким не сталкивался.
Компилировал AVR Studio 4 (Winavr2010aug), AVR Studio 6. Оптимизации выключены -O0
Спасибо