Вопрос по TWI

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Сообщение Jeka-starik »

у меня там вообще-то зациклено на twi_r1 если приглядишья. Так что второй раз до INIT не дойдёт. То есть по моим прикидкам он должен гонять по кругу старт,адрес, чтение данных и по прерыванию записывать их в порт D. но что то не работаить... :?
[color=#FF0000]Хачу фсё знать!!![/color]
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

присмотрелся
вообще-то стало еще интересней :))) :))) :)))
1. куда уйдет программа в случае ошибки чтения
2. поскольку "стоп" не формируется никогда, он расположен ниже rjmp twi_r1, до каких пор будут читаться данные?
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Сообщение Jeka-starik »

На первый попрос затрудняюсь ответить. Не подумал об этом. Мне казалось что при несовпадении кода регистра статуса с положенным ему он отправляется на обработчик ошибок и далее выход из программы (но может оно так работать не будет - всех ньюансов я пока не знаю)
А по поводу второго вопроса - в теории - пока не вырубят питание. У меня DS-ка измеряет ёмкость аккумулятора (постоянно) и соответственно с определённого регистра надо периодически считывать данные и останавливать этот процесс не собирались. (ну или стоп сделать до rjmp - но не надо ли будет заново весь гемморой с обращением к этой ячейке повторять. Не легче ли просто повстартом)
Если я не прав и так низя - поятсните в чём.
[color=#FF0000]Хачу фсё знать!!![/color]
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Сообщение Jeka-starik »

Нашёл я кажись ошибку. В регистре TWCR я прерывания разрешил а в купе с флагом I в SREG при установки TWINT чёрте что творится. Но по поводу предыдущего моего поста -таки жду ответа.
[color=#FF0000]Хачу фсё знать!!![/color]
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Маленький совет: в обработчике TIM0_OVF у тебя используется только IN и OUT, которые не затрагивают SREG. Поэтому его сохранять не обязательно, можно только tmp.
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Нда...
чувствуется закоренелая рука мастера :)))
Jeka-starik писал(а): А по поводу второго вопроса - в теории - пока не вырубят питание. У меня DS-ка измеряет ёмкость аккумулятора (постоянно) и соответственно с определённого регистра надо периодически считывать данные и останавливать этот процесс не собирались. (ну или стоп сделать до rjmp - но не надо ли будет заново весь гемморой с обращением к этой ячейке повторять. Не легче ли просто повстартом)
Если я не прав и так низя - поятсните в чём.
т.е. кроме считывания показаний из некоторой ячейки твоя программа вообще больше ничего делать не будет, ни обрабатывать полученные данные, ни отображать(использовать) нигде не будет, она будет до посинения "пока не вырубят питание" считывать данные, иногда отвлекаясь на обработку прерывания по переполнению таймера, чтобы прочитать значение TWDR и отправить его на выход порта Д

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

        in tmp,TWDR
      out PORTD,tmp
все...
на большее программа, в данном варианте, не способна.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Сообщение Jeka-starik »

В общем ты меня правильно понял. Тока в будущем это будет не порт D a какой-нить другой регистр с которого мона будет отображать эти данные на компе, например-через com порт.
Вот и ворос. Хватит того что у меня есть для таких целей или надо что-то переделывать?

PS а по поводу мастера зря. Я в этом не разбираюсь почти. (Честно говоря я других вариантов пока не вижу. Сделал всё довольно прямолинейно и без всяких заковырок) И то пока не работает как надо мне.
[color=#FF0000]Хачу фсё знать!!![/color]
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Сообщение Jeka-starik »

Ну, в общем добился я работы программы. Пришлось немного поправить. Теперь стоп таки формируется и прерывания работают. В общем, выложу прогу, может кому-то в будущем поможет ( :))) Хотя это врядли - больно ламерская она и не многофункциональная) или если я ещё её модернизировать захочу будет на что ссылаться.

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

.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
 ; TWI (I2C) Мастер, приём
;результат выводится в порт D
;Подключние файла, объявление имён регистров ATmega8
.equ	TW_START	=	0x08
.equ	TW_RESTART	=	0x10
.equ	MT_SLA_ACK	=	0x18
.equ	MT_DATA_ACK	=	0x28
.equ	MR_SLA_ACK	=	0x40
.equ	MR_DATA_ACK	=	0x50
.equ	MR_DATA_NACK	=	0x58
.equ	SLA_R		=	$69
.equ	SLA_W		=	$68
.def    tmp         =   R17
.def    tmp1        =   R18
.cseg
 ;------------------ Вектора прерываний ---------------------------
.org $00  rjmp INIT
		  nop
		  nop
		  nop
		  nop
		  nop
		  nop
		  nop
.org $09  rjmp TIM0_OVF
;=============
    ;Считывание из регистра xx микросхемы DS2782 данных
;=============
twi_r:
      
	; Сформировать старт
		ldi	tmp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
		out	TWCR,tmp
	; Ждать окончания операции
		rcall	wait
	; Проверка кода ответа 0x10
		cpi	tmp,TW_START
		brne	twi_err
    ; Если ОК - загрузка и передача адреса
	    ldi tmp,SLA_W
		out TWDR,tmp
		ldi tmp,(1<<TWINT)|(1<<TWEN)
		out TWCR,tmp
    ; Ждать окончания операции
	    rcall wait
    ; Проверка кода ответа 0x18
	    cpi tmp,MT_SLA_ACK
		brne twi_err
	; Если ОК - загрузка указателя адреса
       ;=============;
       ;    Адрес для считывания!!!    ;
       ;=============;
		ldi	tmp,$0C
		out	TWDR,tmp
		ldi	tmp,(1<<TWINT)|(1<<TWEN)
		out	TWCR,tmp
	; Ждать окончания операции
		rcall	wait
	; Проверка кода ответа 0x28
		cpi	tmp,MT_DATA_ACK
		brne	twi_err
	; Повторный старт
		ldi	tmp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
		out	TWCR,tmp
	; Ждать окончания операции
		rcall	wait
	; Проверка кода ответа 0x10
		cpi	tmp,TW_RESTART
		brne	twi_err
	; Если ОК - загрузка и передача адреса
	    ldi tmp,SLA_R
		out TWDR,tmp
		ldi tmp,(1<<TWINT)|(1<<TWEN)
		out TWCR,tmp
    ; Ждать окончания операции
	    rcall wait
    ; Проверка кода ответа 0x18
	    cpi tmp,MR_SLA_ACK
		brne twi_err
    ; Приём байта c подтверждением 
	   ldi	tmp,(1<<TWINT)|(0<<TWEA)|(1<<TWEN)
		out	TWCR,tmp
	; Ждать окончания операции
		rcall	wait
	; Проверка кода 0x58
		cpi	tmp,MR_DATA_NACK
		brne	twi_err
	; Данные приняты - считать и сохранить.		
		in	tmp1,TWDR	
	; Сформировать стоп
		ldi	tmp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
        rcall	wait
		out	TWCR,tmp
		rjmp twi_r
		;Начало программы
INIT:                          ;PROG
   ldi  R16,high(RAMEND)
   out  SPH,R16
   ldi  R16,low(RAMEND)
   out  SPL,R16
   ldi  R16,$FF                ;DDRB=$FF
   out  DDRD,R16
;Инициализация TWI,установка частоты SCL
   ldi  R16,$20                ;TWI.SCLfreguency=100K(8Mhz)
   out  TWBR,R16
;Сброс в 0 битов TWPS1:TWPS0 регистра TWSR
   in   R16,TWSR 
   andi R16,$FC
   out  TWSR,R16
   sei                       ; разрешить прерывания
   ldi r16,0b00000101        ; загружаем константу
   out TCCR0,r16             ; делитель таймера CK/1024
 
   ldi r16,$01
   out TIMSK,r16             ; разрешаем прерывание timer0 по переполнению
   ldi r16,$00
   out TCNT0,r16             ;начальное значение счетчика - 0              
   rjmp twi_r                ; возврат в тело  цикла
 ;========================
	; Обработчик ошибок
twi_err:
       	nop	
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		rjmp	twi_end      
;========================
	; Выход из режима работы с TWI
twi_end:
ldi tmp,0b11100011   ; Произвоьная константа, показывающая что произошёл срыв в программе.
out PORTD,tmp
		ret		
;========================
; Процедура ожидания завершения операции
;========================
wait:
		in	tmp,TWCR
		sbrs	tmp,TWINT
	    rjmp	wait
		in	tmp,TWSR
		andi	tmp,0xF8
		ret
;========================
; Обработка прерывания
;========================
TIM0_OVF:
		out PORTD,tmp1
		reti
[color=#FF0000]Хачу фсё знать!!![/color]
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Jeka-starik писал(а):...регистр с которого мона будет отображать эти данные на компе, например-через com порт.
если так, тогда мк тебе вообще ненужен, полно схем и софта для подключения устройств подобного типа к компу, а вот если это будет автономное устройство, которое будет получать данные от датчика, обрабатывать их, отображать и управлять чем-либо, вот тогда мк необходим.
так что для начала определись, что за девайс у тебя будет.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Сообщение Jeka-starik »

В конечном итоге устройство будет автономно (в блоке питания георадиолокационного комплекса будет отслеживать текущую ёмкость аккума и отправлять на какой-нибудь индикатор (с ним как раз ещё не определились)). А пока в качестве тестирования буду выводить на комп. Тока у меня тут однобайтный регистр, а мне бы всё-таки двухбайтный нужен. Лан, завтра с ним поработаю. Домой уже пора.
[color=#FF0000]Хачу фсё знать!!![/color]
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

а вот в таком разе, применяемый тобой подход к программированию просто не применим.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Сообщение Jeka-starik »

Почему?
[color=#FF0000]Хачу фсё знать!!![/color]
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Объясни мне как ты собираешься обрабатывать и выводить на индикацию данные, в каком месте, в бесконечном цикле считывания данных с DS-ки?
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Сообщение Jeka-starik »

Я рассчитывал что это можно организовать всё в том же прерывании, ну или в крайнем случае после первого круга после команды стоп до rjmp в начало цикла. Хотя честно говоря, пока даже не знаю как это организовать ибо не работал ещё с этим. Вполне возможно что ты прав и программу переделывать придётся, хотя не хотелось бы... Стока сил на неё и времени угробил.
[color=#FF0000]Хачу фсё знать!!![/color]
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 387
Зарегистрирован: Пт сен 12, 2008 03:26:14

Сообщение DIHALT »

*facepalm*

Сделай хотя бы простейший флаговый автомат да распараллель задачи.
Изображение
Контактная информация:
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Сообщение Jeka-starik »

Всем снова здравствуйте. Вернулся я к TWI. :)) Возник небольшой вопрос: Программа на TWI вроде бы работает - Регистр TWSR выдаёт нужные результаты (при пошаговой проверке). Проблема в формировании стопа. После него по уму программа отправляется на начало (на формирование старта - ну типа цикл бесконечного считывания с одного и того же регистра) В будущем таймер на прерывания поставлю. Но пока так. Загвоздка в том что после стопа стоит ли вызывать процедуру ожидания (появления флага TWINT)? Или после стопа сразу можно сделать rjmp на начало? У меня просто почему-то дальше прога не работает... Может там камень какой-нить подводный.
P.S. Если требуется - текст программы приведу - он не большой.
[color=#FF0000]Хачу фсё знать!!![/color]
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

Сообщение neoneon »

Здравствуйте. Понадобился аппаратный TWI на меге8, пользуюсь первый раз. Скопировал из даташита пример кода, когда МК - master. Пытался отладить в avrstudio - в четвертой версии регистр состояния TWSR упорно не хочет меняться со значения 0x21, а в шестой - со значения 0xF8. Запустил в протеусе - не работает. Закомментировал проверку регистра TWSR при отправке START (см. третий шаг на скриншоте, в регистре должно быть 0x08) - в протеусе остальная часть заработала :dont_know: То ли косяки студий, то ли я чего-то не догоняю :dont_know: Скриншот из даташита под спойлером, START=0x08, MT_SLA_ACK=0x18, MT_DATA_ACK=0x28.
СпойлерИзображение
Полный чайник.
Ответить

Вернуться в «Теория»