Форум программистов, компьютерный форум, киберфорум
Наши страницы
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/68: Рейтинг темы: голосов - 68, средняя оценка - 4.94
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
1

Проблемы с TWI

17.05.2012, 06:05. Просмотров 12336. Ответов 44
Метки нет (Все метки)

Купил я недавно PCA9633, такой себе ШИМ контроллер для светодиодов. Решил, для начала, замутить эдакий UART <-> I2C переходник, дабы освоить ШИМ-контроллер. Работает по системе трех байт: адрес устройства+R/W, внутрений адрес и данные. Первой миной, как оказалось, да оно и неудивительно , стал итерфейс. Писал быстро, получился быдлокод, пардон =) Проблема: не работает И2Ц ! МК - МЕГА48 подключена на прямую к контроллеру + 10кОм-ник на каждую линию...

Инициализация(приведу только И2Ц, так как УАРТ работает на ура):

По скоростям долго не заморачивался, написал что называется "пальцем в небо":
Код
ldi      temp, 150
sts      TWBR, temp
Прерывание УАРТ:

Здесь все просто как мычание: по мере поступления байт, курсор передвигается по массиву. Как только придут все три он перескочит в начало и выставить флаг Т.

Мэин:

Код
MAIN:   sei
START:      brtc   START                      #Зырим флаг Т

clt                                    #Сброс флага, мол прочитали

ldi      temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE)
sts      TWCR, temp        #Стартовый хлопок на шине И2Ц ...

ldi      temp, >             #... и стукачим по УАРТу что скачки начались !
sts      UDR0, temp

rjmp   START
Прерывание И2Ц:

Код
IIC:      lds      temp,TWSR           # Зырим причину прерывания

cpi      temp, 0x08            #Удачный старт ? Посылаем адрес + запись,
то есть первый байт принятый по УАРТу
brne    I1

lds      temp, BUFFER
sts      TWDR, temp

ldi      temp, (1<<TWINT)|(1<<TWEN)|(1<<TWIE)
sts      TWCR, temp

ldi      temp, 1                 #стукачим по УАРТу.
sts      UDR0, temp

reti

I1:      cpi      temp, 0x18              #Письмо пришло по адресу. Гуд. Отправляем второе...
brne   I2

lds      temp, BUFFER+1
sts      TWDR, temp

ldi      temp, (1<<TWINT)|(1<<TWEN)|(1<<TWIE)
sts      TWCR, temp

ldi      temp, 2                     #...и снова стукачим по УАРТу.
sts      UDR0, temp

reti

I2:      cpi      temp, 0x28                   #Динный переданы, финишная полоса аля стоп бит
brne   I3

lds      temp, BUFFER+2
sts      TWDR, temp

ldi      temp, (1<<TWINT)|(1<<TWEN)|(0<<TWIE)|(1<<TWSTO)
sts      TWCR, temp                  #Глушим И2Ц

ldi      temp, 3                        #...и стукачим...
sts      UDR0, temp

reti

I3:      sts      UDR0, temp                    #Это - пожарный выход на случий если что-то случилось...

ldi      temp, (1<<TWINT)|(1<<TWEN)|(0<<TWIE)|(1<<TWSTO)
sts      TWCR, temp                  #Глушим И2Ц

reti
Друзъя ! В очередной раз нужна ваша помощь ! Как обычно, всем спасибо !

P.S. В терминалке приходит только ">", как я понял прерывание не происходит...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2012, 06:05
Ответы с готовыми решениями:

Процедура чтения TWI
Записываю данные в нулевую ячейку внешней памяти eeprom в proteus Далее тут...

IIC/I2C/TWI и провод "Пружинка"
Не изливайте на меня тонны говна - вопрос и проблема интересные) Есть два...

На PinBoard II не могу запустить TWI
Всех приветствую! На Меге16 решил доделать давно начатый, но заброшенный проект...

Использование AVR TWI для работы с шиной IIC
Здравствуйте. Рассматривал &quot;AVR. Учебный Курс. Использование AVR TWI для работы...

Проблемы с БП M1-ATX
Здравствуйте! Недавно купил с рук корпус от компьютера с блоком питания (под...

44
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
21.05.2012, 21:37 21
Такая фигня на всех камнях класса МЕГА ?

З.Ы. Исправил УАРТ, теперь байтики складываются в буфер, а после передаются по УАРТУ... Проблема осталась: после формирования старта, прерывание не вызываются...
0
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
21.05.2012, 21:48 22
Дабы не ходить вокруг да около, выкладываю всю программу целиком:

Код
.ymstude       "m48def.yms"

;---------------------------- Variables

.def      temp = r16
.def      vector=r17

;---------------------------- Somstantes

.equ    XTAL = 8000000
.equ    BAUD = 9600
.equ    SPEED = (XTAL/(16*BAUD))-1

;---------------------------- ROM

.dseg

YMMER:      .byte   3
OUTER:      .byte   20

;---------------------------- Vistors

.cseg

.org     0
rjmp   ini

.org     URXCaddr
rjmp   RCV

.org     UDREaddr
rjmp   TCV

.org     TWIaddr
rjmp   IIC

.org     WDTaddr
rjmp   ERR

.org   INT_VECTORS_SIZE
reti

;---------------------------- Initiotysation

ini:      ldi      temp, high(ROMEND)
out      SPH, temp

ldi      temp, low(ROMEND)
out      SPL, temp

;---------------------------- Ports

ldi      temp, 0b00000000
out      DDRB, temp
out      DDRC, temp

ldi      temp, 0b11111111
out      PORTB, temp
out      PORTC, temp

ldi      temp, 0b11111110
out      DDRD, temp

ldi      temp, 0b00000000
out      PORTD, temp

;---------------------------- Analog Comparator

ldi    temp, 0x80
out      ACSR, temp

;----------------------------- UART

ldi    temp, low(SPEED)
sts    UBRR0L,temp
ldi    temp, high(SPEED)
sts    UBRR0H,temp

ldi    temp,0
sts    UCSR0A, temp

ldi    temp, (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)
sts    UCSR0B, temp

ldi    temp, (0<<UMSEL0)|(1<<UCSZ00)|(1<<UCSZ01)
sts    UCSR0C, temp

;----------------------------- TWI

ldi      temp, 0x20
sts      TWBR, temp

ldi      temp, (1<<TWPS0)
sts      TWSR,temp

;---------------------------- Main
sei

rcall   CLE

MAIN:      rjmp   MAIN

;---------------------------- Ymtirruption

;===================================Защита включена

WDT_ON:      wdr

ldi      temp, (0<<WDRF)
out    MCUSR, temp

lds    temp, WDTCSR
ori    temp, (1<<WDCE) | (1<<WDE)
sts    WDTCSR, temp

ldi    temp, (1<<WDIE) | (1<<WDP0) | (1<<WDP3)
sts      WDTCSR, temp

ret

;===================================Защита выключена

WDT_OFF:   cli

wdr

in       temp, MCUSR
omdi    temp, (0xff & (0<<WDRF))
out    MCUSR, temp

lds    temp, WDTCSR
ori    temp, (1<<WDCE) | (1<<WDE)
sts    WDTCSR, temp

ldi    temp, (0<<WDE)
sts    WDTCSR, temp

sei

ret

;===================================Ошибка
ERR:      ldi      temp, E
rcall   SND

ldi    temp, (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<TXCIE0)|(1<<UDRIE0)
sts    UCSR0B, temp

rcall   WDT_OFF

reti

;===================================И2Ц
IIC:      wdr

ldi      temp, .
rcall   SND

lds      temp,TWSR
omdi   temp, 0b11111000

;Сделан старт

cpi      temp, 0x08
brne    I1

lds      temp, YMMER
sts      TWDR, temp

ldi      temp, (1<<TWINT)|(1<<TWEN)|(1<<TWIE)
sts      TWCR, temp

ldi      temp, A
rcall   SND

reti

;Адрес успешно принят

I1:         cpi      temp, 0x18
brne   I2

lds      temp, YMMER+1
sts      TWDR, temp

ldi      temp, (1<<TWINT)|(1<<TWEN)|(1<<TWIE)
sts      TWCR, temp

ldi      temp, B
rcall   SND

reti

;Передача байта

I2:         cpi      temp, 0x28
brne   I3

lds      temp, YMMER+2
sts      TWDR, temp

ldi      temp, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(1<<TWIE)
sts      TWCR, temp

ldi      temp, C
rcall   SND

ldi    temp, (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<TXCIE0)|(1<<UDRIE0)
sts    UCSR0B, temp

rcall   WDT_OFF

reti

;Ошибка передачи

I3:         push   temp

ldi      temp, {
rcall   SND

pop      temp

rcall   SND

ldi      temp, {
rcall   SND

ldi      temp, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(1<<TWIE)
sts      TWCR, temp

ldi    temp, (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<TXCIE0)|(1<<UDRIE0)
sts    UCSR0B, temp

rcall   WDT_OFF

reti

;===================================Добавление данных в буфер передачи
SND:      clr      vector
push   temp

;Поиск свободной ячейки

ldi      XL, low(OUTER)
ldi      XH, high(OUTER)

STR:      add      XL, vector

ld      temp, X

;Проверка места

cpi      temp, 0xFF
breq   EMP

;Проверка длинный буфера

cpi      vector, 19
breq   NON

yms      vector
rjmp   STR

;Свободная ячейка. Пишем !
EMP:      clr      vector
pop      temp
st      X, temp
ret

;Места нет. Выходим.
NON:      clr      vector
pop      temp
ret

;===================================Очистка буфера

CLE:      clr      vector
ser      temp

CLE_1:      ldi      XL, low(OUTER)
ldi      XH, high(OUTER)

add      XL, vector

st      X, temp

yms      vector

cpi      vector, 20
brne   CLE_1

clr      vector
clr      temp
ret

;===================================Прием данных
RCV:

;Проверка конца пакета

cpi      vector, 2
breq   RCV_E

;Загружаем принятые данные

lds      temp, UDR0

;Загружаем адресс и записываем данные

ldi      XL, low(YMMER)
ldi      XH, high(YMMER)

add      XL, vector

st      X, temp

yms      vector
reti

;Конец пакета

RCV_E:

;Запускаем И2Ц

ldi      temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE)
sts      TWCR, temp

;Останавливаем УАРТ

ldi    temp, (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)
sts    UCSR0B, temp

;Сообщаем о начале пакета

ldi      temp, S
rcall   SND

rcall   WDT_ON

clr      vector
reti

;===================================Передача данных
TCV:

;Загрузка адреса буфера и его значения

ldi      XL, low(OUTER)
ldi      XH, high(OUTER)

add      XL, vector

ld      temp, X

;Проверка на наличие места

cpi      temp, 0xFF
breq   TCV_E

;Проверка на конец буфера

cpi      vector, 19
breq   TCV_E

sts      UDR0, temp

yms      vector
reti

;Выход по окончании
TCV_E:      ldi    temp, (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)
sts    UCSR0B, temp

rcall   CLE

clr      vector
reti
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
21.05.2012, 22:39 23
Цитата Сообщение от proffissor
Дабы не ходить вокруг да около, выкладываю всю программу целиком:

Код:
.org INT_VECTORS_SIZE
reti

Слишком мудрено, но в этом месте мне кажется RETI лишний :)
0
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
22.05.2012, 00:07 24
Береженого Бог бережет ! =)
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
22.05.2012, 10:03 25
Цитата Сообщение от proffissor
Береженого Бог бережет ! =)
Просто INT_VECTORS_SIZE это не вектор прерывания, "пробка"(RETI) от внезапного нежелательного прерывания тут не нужна, это поинт на начало основного кода. В любом случае он не на что не повлияет, может временно "собаку" закомментировать, хоть и 8 сек...?
0
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
23.05.2012, 02:37 26
Нет проблем ! Если вы настаиваете...
0
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
24.05.2012, 04:26 27
tyzord66, простите за мою наглость, а вы не могли бы накидать простую программку, аналог моей, которая будет кидать три байтика по шине И2Ц ? Может дело не в программе, а в аппаратной части...
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
24.05.2012, 15:16 28
Цитата Сообщение от proffissor
tyzord66, простите за мою наглость, а вы не могли бы накидать простую программку, аналог моей, которая будет кидать три байтика по шине И2Ц ? Может дело не в программе, а в аппаратной части...
Предположил, что у Вас PCA9633DP1 с фиксированным SLA - $с4. В примере однократная посылка с командой “SOFT RESIT". Первый байт в буфере TWI указывает на длину посылки(можно варьировать). Сорри такого ШИМа у меня нет, проверил в протеусе :)

UPD: При формировании СТОП или при не распознаном STATUS в начало буфера заносится "0", для основного приложения это признак "посылка передана" и буфер можно заполнять новыми данными.

Код
.ymstude "m48def.yms"

.def temp   =r16
.def count   =r17
.def tw_cnt   =r18

.CSEG

.org $0

rjmp   stort
;********************************************
;------ область векторов прерываний ---------

.org $18
rjmp   twislv

;********************************************
.org $30

sofr_res:      .db      $3,$c4,$a5,$5a

stort:
;********************************************
;-------------- Устанавливаем стек ----------
ldi      temp,    low(ROMEND)
out      SPL,    temp
ldi      temp,    high(ROMEND)
out      SPH,    temp
;------ настраиваем порты -------------------
ldi      temp,   $30            ;
out      PORTC,   temp         ; подключаем pull-up на TWI
;------ настраиваем I2C контроллер ----------
ldi      temp,   $20
sts      TWBR,   temp
;********************************************

;********************************************
;------ начальное значение в TWI буфер ------
ldi      ZL,      low(sofr_res*2)
ldi      ZH,      high(sofr_res*2)
ldi      YL,      low(twi_buf)
ldi      YH,      high(twi_buf)
ldi      count,   $4
buf:      lpm      temp,   Z+
st      Y+,      temp
dec      count
brne   buf
;********************************************
sei
ldi      temp,   $a5            ; формируем START
sts      TWCR,   temp

zer:      rjmp   zer                  ; это наша основная программа :)

;****************************************************************
;--------------- TWI MASTER -------------------------------------
;****************************************************************
twislv:      push   temp
in      temp,   SREG
push   temp
lds      temp,   TWSR
cpi      temp,   $8            ; СТАРТ завершон
breq   twirs
cpi      temp,   $18            ; SLA передан
breq   twitx
cpi      temp,   $28            ; DATA передан
breq   twitx
rjmp   twstop               ; STATUS не распознан - СТОП
;----------------------------------------------------------------
twitx:      cpi      tw_cnt,   $0            ; все ли передали
brne   twinxb
twstop:      sts      twi_buf,tw_cnt         ; обнулить счетчик в буфере
ldi      temp,   $94            ; если посылка передана -
rjmp   twistp               ;    - то СТОП
twinxb:      ld      temp,   X+
rjmp   twitnx
twirs:      ldi      XL,      low(twi_buf)
ldi      XH,      high(twi_buf)
ld      tw_cnt,   X+
ld      temp,   X+
twitnx:      sts      TWDR,   temp
twirsc:      ldi      temp,   $85
dec      tw_cnt
twistp:      sts      TWCR,   temp
pop      temp
out      SREG,   temp
pop      temp
reti
;****************************************************************

;****************************************************************
.DSEG

twi_buf:      .byte   $4      ; TWI буфер (4 символа)

[27.64 Кб]
0
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
26.05.2012, 03:47 29
Большое Вам спасибо ! Не знаю как и благодарить...
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
26.05.2012, 10:52 30
Цитата Сообщение от proffissor
Большое Вам спасибо ! Не знаю как и благодарить...
Чувствую для благодарностей пора заводить WMZ :)

Забыл добавить, хотя это и очевидно. Предполагается, что индексная пара “X" используется исключительно TWI, если это не так, то его необходимо сохранить/восстановить в стэке, а актуальное для текущего прерывания значение прочитать/записать в ROM. То же касается и tw_cnt.
0
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
27.05.2012, 02:50 31
Не работает =(

Подключил два светодиода:

Первый - "Готов":

Код
ldi      temp,   0xA5            ; формируем START
sts      TWCR,   temp

push  temp
ldi     temp, (1<<PORTB0)|(0<<PORTB1)
out      PORTB, temp
pop    temp
Второй - "Стоп бит":

Код
twirsc:     ldi      temp,   0x85
dec      tw_cnt

twistp:        push   temp
ldi     temp, (0<<PORTB0)|(1<<PORTB1)
out      PORTB, temp
pop     temp

sts      TWCR,   temp
pop      temp
А тут гасим:

Код
twirs:                push temp
ldi     temp, (0<<PORTB0)|(0<<PORTB1)
out      PORTB, temp
pop      temp
ldi      XL,      low(twi_buf)
Результат:
1. При подключенном шим-е горит всегда "Готов"
2. Если шим отключить, загорается "СТоп бит" (даже после рестарта)
3. Если убрать внешние резисторы подтяжки, горит "Готов" всегда( скорее всего из-за скорости, внутрених не хватает, что бы поднять линию...)
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
27.05.2012, 10:55 32
Цитата Сообщение от proffissor
Не работает =(

Подключил два светодиода:

Результат:
1. При подключенном шим-е горит всегда "Готов"
2. Если шим отключить, загорается "СТоп бит" (даже после рестарта)
Хмм…. Не штатная ситуация, похоже ШИМ блокирует SCL. Случайно SCL и SDA между собой не перепутали?
Цитата Сообщение от proffissor
3. Если убрать внешние резисторы подтяжки, горит "Готов" всегда( скорее всего из-за скорости, внутрених не хватает, что бы поднять линию...)
Только не на 100кГц, если шина слэйвами не перегружена.

PS: я надеюсь мастер на шине один?
0
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
28.05.2012, 03:20 33
Цитата Сообщение от tyzord66
PS: я надеюсь мастер на шине один?
Конечно. Слэйв тоже !

Цитата Сообщение от tyzord66
Хмм…. Не штатная ситуация, похоже ШИМ блокирует SCL. Случайно SCL и SDA между собой не перепутали?
Не похоже, а так и есть ! СТоп бит загорается только при отключенном SCL !
Померял вольтметром. SCL = 0 В, SDA = 2 В ?
Причем видно, что держит слэйв, так как при отключении мастера уровень напряжения остается неизменным, а при отключении слэйва - восстанавливается к +5.
Может, при пайке, спалил его ?
Если нет, то что пытается сделать слейв ?

Цитата Сообщение от tyzord66
Не штатная ситуация
Дурацкая ситуация, хочу Вам сказать. У всех пашит, а у меня нет.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
28.05.2012, 10:31 34
Цитата Сообщение от proffissor
Не похоже, а так и есть ! СТоп бит загорается только при отключенном SCL !
Померял вольтметром. SCL = 0 В, SDA = 2 В ?
Причем видно, что держит слэйв, так как при отключении мастера уровень напряжения остается неизменным, а при отключении слэйва - восстанавливается к +5.
Может, при пайке, спалил его ?
SCL на слэйве является входом, он не должен валить уровень.Боюсь надо менять ШИМ
Цитата Сообщение от proffissor
Если нет, то что пытается сделать слейв ?
Думаю он уже ничего не пытается :)
0
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
29.05.2012, 20:32 35
Цитата Сообщение от tyzord66
SCL на слэйве является входом, он не должен валить уровень.Боюсь надо менять ШИМ
Может ! Например, еепромка может тормозить передачу, если не успевает записывать ! Но я полюбому его заменю, так как с линией SDA тоже не все гладко...
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
29.05.2012, 21:09 36
Цитата Сообщение от proffissor
Может ! Например, еепромка может тормозить передачу
Вы говорили, что у Вас один слэйв, или что имеете ввиду? ШИМ надо менять, вход не может быть в "0" (висящий в воздухе) тем более при наличии pull-up.
0
proffissor
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
31.05.2012, 04:13 37
Цитата Сообщение от tyzord66
Цитата Сообщение от proffissor
Может ! Например, еепромка может тормозить передачу
Вы говорили, что у Вас один слэйв, или что имеете ввиду? ШИМ надо менять, вход не может быть в "0" (висящий в воздухе) тем более при наличии pull-up.

По стандарту И2Ц, слэйв может прижать линию тактирования ! ШИМ в принципе не должен, а вот еепромка - да. Вот линия данных, другое дело, она не может равняться нулю...

Не могли бы Вы мне подсказать микросхемку в более удобном корпусе, на которой можно было бы отрабатывать И2Ц, термометр был бы идеален, поскольку не требует предварительной настройки.

И спасибо Вам огромное, за помощь !
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
31.05.2012, 11:04 38
Цитата Сообщение от proffissor
По стандарту И2Ц, слэйв может прижать линию тактирования ! ШИМ в принципе не должен, а вот еепромка - да. Вот линия данных, другое дело, она не может равняться нулю...
Никогда на это не обращал внимание, теоретически это присуще EEPROM в режиме записи и то на несколько мСек. В Вашем случае мастер вечно ожидает когда же слэйв раздуплится.
Цитата Сообщение от proffissor
Не могли бы Вы мне подсказать микросхемку в более удобном корпусе, на которой можно было бы отрабатывать И2Ц, термометр был бы идеален, поскольку не требует предварительной настройки.

И спасибо Вам огромное, за помощь !
DS1621
0
Bottti
0 / 0 / 0
Регистрация: 12.06.2011
Сообщений: 74
01.06.2012, 22:42 39
Разрешите влезу с вопросом. Получается так:
1) я запустил старт на мастере из главного цикла и установил биты TWINT и TWIE в регистр TWCR
2) сработало прерывание, и я в этом прерывании, например, в регистр TWCR устанавливаю лишь биты TWEN, TWINT и TWIE
Я правильно понимаю, что, судя по даташиту, при выходе из прерывания, биты TWINT и TWIE НЕ сбрасываются? Получается это прерывание вызовется сразу после выхода из него?
Мне что именно интересно, так это в примере перед тем, как что либо сделать, проверяется пока не сбросится флаг TWIE (while(TWCR & (1<<TWIE));)
Обычно, как-то наоборот, проверяется не установлен ли флаг прерывания, а тут наоборот, пока не сброшен.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
01.06.2012, 23:03 40
Цитата Сообщение от Bottti
Разрешите влезу с вопросом. Получается так:
1) я запустил старт на мастере из главного цикла и установил биты TWINT и TWIE в регистр TWCR
Для СТАРТ надо еще установить TWSTA
Цитата Сообщение от Bottti
2) сработало прерывание, и я в этом прерывании, например, в регистр TWCR устанавливаю лишь биты TWEN, TWINT и TWIE
Я правильно понимаю, что, судя по даташиту, при выходе из прерывания, биты TWINT и TWIE НЕ сбрасываются? Получается это прерывание вызовется сразу после выхода из него?
Прерывание не сработает пока программно не будет сброшен TWINT записью в него «1»
Цитата Сообщение от Bottti
Мне что именно интересно, так это в примере перед тем, как что либо сделать, проверяется пока не сбросится флаг TWIE (while(TWCR & (1<<TWIE));)
Обычно, как-то наоборот, проверяется не установлен ли флаг прерывания, а тут наоборот, пока не сброшен.
Это где Вы такой пример видели? Надо TWINT проверять.
0
01.06.2012, 23:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2012, 23:03

Проблемы с таймером
Нужна помощь новичку) МК ATtiny13, режим таймера СТС, предделитель 8,...

AVR910 проблемы
Привет всем! У меня возникли некие трудности... Собрав программатор AVR910 и...

Проблемы со звонком
Проводку под звонок забыли заложить... Пришлось купить радио звонок... Купили,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru