Вопрос по TWI

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

Re: Вопрос по TWI

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

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

Re: Вопрос по TWI

Сообщение GP1 »

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

Re: Вопрос по TWI

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

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

Re: Вопрос по TWI

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

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

Re: Вопрос по TWI

Сообщение ploop »

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

Re: Вопрос по TWI

Сообщение GP1 »

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

т.е. кроме считывания показаний из некоторой ячейки твоя программа вообще больше ничего делать не будет, ни обрабатывать полученные данные, ни отображать(использовать) нигде не будет, она будет до посинения "пока не вырубят питание" считывать данные, иногда отвлекаясь на обработку прерывания по переполнению таймера, чтобы прочитать значение TWDR и отправить его на выход порта Д

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

        in tmp,TWDR
      out PORTD,tmp

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

Re: Вопрос по TWI

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

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

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

Re: Вопрос по TWI

Сообщение 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
Откуда: Россия, Волгоград
Контактная информация:

Re: Вопрос по TWI

Сообщение GP1 »

Jeka-starik писал(а):...регистр с которого мона будет отображать эти данные на компе, например-через com порт.

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

Re: Вопрос по TWI

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

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

Re: Вопрос по TWI

Сообщение GP1 »

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

Re: Вопрос по TWI

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

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

Re: Вопрос по TWI

Сообщение GP1 »

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

Re: Вопрос по TWI

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

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

Re: Вопрос по TWI

Сообщение DIHALT »

*facepalm*

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

Re: Вопрос по TWI

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

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

Re: Вопрос по TWI

Сообщение 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.
СпойлерИзображение
Полный чайник.
Ответить

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