Не работает ТWI на Atmega128

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 7
Зарегистрирован: Пн июл 28, 2014 12:26:37

Сообщение Durumka »

Добрый день!
Имею следующую проблему:
К Atmega128 подключена внешняя память 24LC16B (SCL - к 25-й ноге МК, SDA - к 26-й ноге МК - согласно даташиту)
Подтягивающие резисторы 4,7 кОм
Данная память работала в прошлом моем проекте на Мега8535-сейчас адаптирую прогу под Мегу128-столкнулся с проблемой-а именно-я не использую прерываний по TWI-использую стандартные подпрограммы :
Спойлер

Код: Выделить всё

;- Блок подпрограмм работы с памятью 24LC16B:
;---------------Подпрограмма инициализации I2C
i2c_init: //Инициализация и2с

	ldi temp,0x0A;TWBR=10
	sts TWBR,temp
	ldi temp,(0<<TWPS1)|(0<<TWPS0)
	sts TWSR,temp
    ret
;---------------Конец подпрограммы инициализации I2C

;---------------Подпрограмма передачи стартовой посылки
i2c_start: //Передача стартовой посылки
	ldi temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
	sts TWCR, temp
	wait1:
	lds temp,TWCR
	sbrs temp,TWINT;
	rjmp wait1
	ret
;---------------Подпрограмма передачи стартовой посылки

;---------------Подпрограмма передачи стоповой посылки
i2c_stop: //Отправляет стоповую посылку
	ldi temp, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
	sts TWCR, temp
ret
;---------------Конец подпрограммы передачи стоповой посылки

;---------------Подпрограмма считывания первого байта из памяти
i2c_recive: //Считывает байт и записывает его в TEMP 
	ldi temp, (1<<TWINT|1<<TWEN|1<<TWEA)
	sts TWCR, temp
	wait4:
	lds temp,TWCR
	sbrs temp,TWINT;
	rjmp wait4
	lds temp,TWDR
ret
;---------------Конец подпрограммы считывания первого байта из памяти

;---------------Подпрограмма считывания второго байта из памяти
i2c_recive_last: //Считать последний байт и записать в TEMP
	ldi temp, (1<<TWINT|1<<TWEN)
	sts TWCR, temp
	wait3:
	lds temp,TWCR
	sbrs temp,TWINT;
	rjmp wait3
	lds temp,TWDR
ret
;---------------Конец подпрограммы считывания второго байта из памяти

;---------------Подпрограмма отправки байта в память
i2c_send: //Будет передан байт из регистра TEMP
	sts TWDR,temp
	ldi temp, (1<<TWINT)|(1<<TWEN)
	sts TWCR, temp
wait2:
	lds temp,TWCR
	sbrs temp,TWINT;
	rjmp wait2
ret
;---------------Конец подпрограммы отправки байта в память
;- Конец блока подпрограмм работы с памятью
Все это работало на Меге8535 а сейчас идет "зависание" уже в подпрограмме стартовой посылки
Отличие этих подпрограмм от подпрограмм для Меги8535 в том, что команды IN и OUT заменены на LDS и STS-иначе AVRStudio 6 давал ошибку при компиляции
Сигналы проверял осциллографом-идут
Фьюзы-М103 отключен, JTAGEN-что вкл, что выкл-без разницы
*бусь уже долго-если у кого есть идеи-подскажите-плз!
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15615
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Почитай еще разок о соответствующем модуле в 128меге и о навешанных на используемых выводах портов альтернативных функциях. Плюс контроль ВСЕХ подпрограмм и разрешенных прерываний на взаимоперекрытие и корректность вода/выхода со стеком.
(Не все команды для области УВВ отображаемой в пределах ОЗУ равноценны командам работающим непосредственно с ОЗУ!)
Наверняка есть еще отличия в программе, если с 8535 на 128ю спрыгнуть пришлось. 8)
Реклама
Родился
Сообщения: 7
Зарегистрирован: Пн июл 28, 2014 12:26:37

Сообщение Durumka »

Модуль TWI на Меге 128 полностью совпадает модулю TWI на Меге8535 - у них даже тексты даташитов одинаковые, без редакции Все регистры управления и биты в них идентичны-отличие лишь в адресах расположения-соответственно поэтому у Меги128 команды IN и OUT пришлось поменять на LDS и STS соответственно. На ногах Меги128 SDA и SCL закреплены соответственно прерывания INT0 и INT1-но они забанены заглушками RETI в описании таблицы векторов прерываний Сам блок работы с памятью ограничен в начале и конце командами CLI и SEI-то есть во время работы с памятью-все остальное "отдыхает" Вообщем попс какой-то-подумываю уже написать ручной код работы с памятью-без TWI - благо описание протокола есть вот...
Друг Кота
Аватара пользователя
Сообщения: 15615
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Мням.. наворочененько.. дак там даже асмовские подсказки повставлены в даташите... Хоша особо в того монстра не вникал, из-за отсутствия "на поиграться"...
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 7
Зарегистрирован: Пн июл 28, 2014 12:26:37

Сообщение Durumka »

Вообщем засел я за инет и на одном из форумов (forum.vingrad.ru/topic-252894.html) нашел подсказку - все дело в директиве SLEEP - поскольку я использую в своей программе АЦП - то по даташиту-после запуска АЦП рекомендуется переводить его в один из 6-ти спящих режимов-в режим сна понижения шумов АЦП - почему-то после выхода из него TWI не работает хоть ты убейся-даже запись 0 в бит SE регистра MCUCR после выхода из режима сна не помогает Короче выход такой-1. SLEEP на .уй! 2. Замена процедуры SLEEP на процедуру задержки, равной 260 мкс (по даташиту на Атмегу 128 - это максимальное время преобразования АЦП-в принципе можно и меньше-подобрать экспериментально-но я не стал заморачиваться) В моем случае я пошел по этому легкому пути, потому что разницы в показаниях АЦП не заметил а потом в моей новой схеме для наиболее важного измерения я использую внешний АЦП а три канала внутреннего АЦП использую для неответственных измерений, плюс ко всему в новой схеме, для увеличения помехоустойчивости повысил внешний Uref c 2.5 В до 4.096В Если Вам все-таки критично-то при использовании встроенного АЦП придется наверное перейти на программный эмулятор работы TWI.
Вот такие пироги
P/S: При переносе своей проги на другой МК - внимательно отнеситесь к используемым конфигурационным регистрам МК - назначение битов в них может не совпадать-как пример - регистр MCUCR в Атмеге8535 и Атмеге128 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Если у кого обнаружится новое решение проблемы-буду только рад!!!
Реклама
Ответить

Вернуться в «AVR»