Прямой эфир

0
Здравствуйте, собрал платку под керамику и тоже столкнулся с такой проблемой 560 и прыгает, подскажите чем у вас закончилось с доработкой нашли ли причину?
  • avatar
  • dremov
  • 19 июня 2019, 11:26
0
По большому счету тоансформаторный блок питания не является гарантом полной элнктробезопасности. Б/П с конденсаторным или резистивным токоограничением требует принятия особых мер поредосторожности. Если такой б/п предусмотрен для постоянной работы в составе устройства то тогда без вопросов. Но использовать его в качестве " лабораторного б/п " на мой взгляд это верх безумия.
0
Дело то хозяйское. Опасаетесь, не делайте. Я ведь никому не навязываю.
  • avatar
  • shurup
  • 19 июня 2019, 00:15
0
Но не безопасно!
0
Безопасность у этого решения больно уж… альтернативная)
  • avatar
  • Vga
  • 18 июня 2019, 13:08
0
Куда же еще. Только не забываем про технику безопасности.
У меня разделительный трансформатор всегда под рукой при ремонте. В него и сую.
Я для этих целей использую платку от светодиодной лампы (разобрал дохлую), только конденсатор заменил на 100нФ. В коротыше 7 мА. Зажигает 16 (может и более...) 9-ти вольтовых светодиодов с нормальной яркостью. Греться нечему, хоть сутками подключенным держи.
  • avatar
  • shurup
  • 17 июня 2019, 22:25
0
И прямо в сеть чтоль?
  • avatar
  • Vga
  • 16 июня 2019, 08:59
0
Надо будет попробовать…
0
Токоограничивающий конденсатор + диодный мост + резистор для разряда конденсатора (а ля конденсаторное питание)= дёшево, надёжно, просто :)
  • avatar
  • shurup
  • 16 июня 2019, 01:13
0
А дело тут в том, что автомат сделать достаточно просто, только он каждый раз получается «заточен» под конкретную задачу. Делать же универсал — оверкилл, хотя если вдуматься, вполне возможно.
Тут не соглашусь, как раз таки универсальная библиотечка рулит! В этом и есть сила I2C — всё уже готово аппаратно, немного обвязки и можно с комфортом работать с любым количеством слейвов. Даже мультимастер практически не требует никаких телодвижений.
Другое дело если писать слейв — тут действительно почти каждый случай требует индивидуального подхода.
0
Далее будет состояние 0x28, или 0x30 или 0x38. Если 0x28, то надо сделать повторный старт, а остальное это ошибки — в ответ на них надо сделать STOP
Кстати, 0x30 — это не совсем ошибка. NACK во время передачи может означать просто что данные закончились. Если слейв ждёт пакета фиксированной длины, то он вполне может выставлять NACK при получении последнего байта. Так что лучше при обработке этого состояния проверять остались ли данные для отправки, если нет — то всё ок. Если ещё остались — тогда да, сигнализировать об ошибке.
0x38 — это потеря арбитража. Правильные варианты обработки — либо установить TWSTA (тогда умная межка дождётся освобождения шины и снова сформирует старт), либо ничего не делать (если повторять попытку неохота). TWSTO ставить не нужно.
0
Ну, скорее от 6 до 18 — ещё статус загрузить надо… Ну и я обычно ещё 0x38 на всякий случай обрабатываю, так уже от 6 до 20 выйдет, т.е. 13 в среднем.

; Load event code
    lds        R16,_SFR_MEM_ADDR(TWSR)  ; 2
    lsr        R16                      ; 1
    lsr        R16                      ; 1
    lsr        R16                      ; 1

    ; Jump to table
    ldi        ZL,lo8(pm(twi_jump))     ; 1
    ldi        ZH,hi8(pm(twi_jump))     ; 1
    add        ZL,R16                   ; 1
    adc        ZH,R17 ; =0              ; 1
    ijmp                                ; 2
Хм, 11 + джамп по таблице = 13… Ну будем считать что убедил :-[
0
Давйте посчитаем такты. В моём случае 7 сравнений, если ни одно не сработало — 14 тактов. Если сработало последнее сравнение (код 0x58), то 15 тактов. Если сработало первое сравнение — 3 такта.
Резюмируя всё это — имеем от 3х до 15 тактов на работу диспетчера, в зависимости от везения. Хочу посмотреть на ваш вариант кода.
0
Вообще-то 32 команды. 5 бит же в статусе. Плюс команды перехода на таблицу.

Коды мастера и идут подряд.
А это я зря что ли упомянул? Можно и выкинуть коды слейва, проверить простым сравнением. Ну и обычно такты в прерывании куда ценнее памяти.
0
А я о чём говорил? У вас 31 команда, то есть 62 байта памяти, у меня 14, то есть 28 байт.
0
Коды мастера и идут подряд. Да и полная таблица невелика…

twi_jump:
    rjmp    twi_error            ; 0x00 TW_BUS_ERROR

    rjmp    twi_start_done       ; 0x08 TW_START
    rjmp    twi_start_done       ; 0x10 TW_REP_START
    rjmp    twi_xmit_byte        ; 0x18 TW_MT_SLA_ACK
    rjmp    twi_no_reply         ; 0x20 TW_MT_SLA_NACK
    rjmp    twi_xmit_byte        ; 0x28 TW_MT_DATA_ACK
    rjmp    twi_xmit_nak         ; 0x30 TW_MT_DATA_NACK
    rjmp    twi_arb_lost         ; 0x38 TW_MT_ARB_LOST, TW_MR_ARB_LOST    
    rjmp    twi_recv_start       ; 0x40 TW_MR_SLA_ACK
    rjmp    twi_no_reply         ; 0x48 TW_MR_SLA_NACK
    rjmp    twi_recv_byte        ; 0x50 TW_MR_DATA_ACK
    rjmp    twi_recv_last_byte   ; 0x58 TW_MR_DATA_NACK

    rjmp    twi_error            ; 0x60 TW_SR_SLA_ACK
    rjmp    twi_error            ; 0x68 TW_SR_ARB_LOST_SLA_ACK
    rjmp    twi_error            ; 0x70 TW_SR_GCALL_ACK
    rjmp    twi_error            ; 0x78 TW_SR_ARB_LOST_GCALL_ACK
    rjmp    twi_error            ; 0x80 TW_SR_DATA_ACK
    rjmp    twi_error            ; 0x88 TW_SR_DATA_NACK
    rjmp    twi_error            ; 0x90 TW_SR_GCALL_DATA_ACK
    rjmp    twi_error            ; 0x98 TW_SR_GCALL_DATA_NACK
    rjmp    twi_error            ; 0xA0 TW_SR_STOP
    rjmp    twi_error            ; 0xA8 TW_ST_SLA_ACK
    rjmp    twi_error            ; 0xB0 TW_ST_ARB_LOST_SLA_ACK
    rjmp    twi_error            ; 0xB8 TW_ST_DATA_ACK
    rjmp    twi_error            ; 0xC0 TW_ST_DATA_NACK
    rjmp    twi_error            ; 0xC8 TW_ST_LAST_DATA

    rjmp    twi_error            ; 0xD0
    rjmp    twi_error            ; 0xD8
    rjmp    twi_error            ; 0xE0
    rjmp    twi_error            ; 0xE8 
    rjmp    twi_error            ; 0xF0
    rjmp    twi_error            ; 0xF8 TW_NO_INFO
0
Возможно и так. Но переход по таблице (в случае AVR) становится выгоден только при определённых условиях.
Одно из этих условий — последовательность и непрерывность индекса к таблице переходов. Грубо говоря, если это значения типа 45,46,47 и соответствующие им ветви.
А когда выбор идёт из значений 18, 28, 10, 50 — надо городить две таблицы — одну со значениями, вторую с адресами процедур. И тогда внезапно выясняется, что по объёму кода и по быстродействию — пяток сравнений и условных переходов становятся абсолютно вне конкуренции. Кривой и неуклюжий перебор «в лоб» рвёт как тузик грелку красивые и правильные алгоритмы.
+1
Прошу, конечно, пардона, но вместо цепочки сравнений здесь напрашивается нечто другое.
Вот как было в 51 от филипса (собственно, автора I2C):
i2c_irq:		push    acc
      		  	push    b
      		  	push    dph
      		  	push    dpl
      		  	push    PSW
       		 	mov     PSW,#008H; переключаю банк регистров
				mov a, I2STAT
				rr a
				rr a
				mov dptr, #I2Cvectortable
				jmp @a+dptr
                                ;......................
				
I2Cvectortable:	;________коды статуса, общие для режимов передачи и приёма__________
		;00h->00h
				ajmp i2c_error
		;08h->02h - передан start
				ajmp i2c_putaddress
				;10h->04h - передан повторный старт
				ajmp i2c_putaddress

                                ;.......

Собственно, из кода статуса I2C получается адрес перехода. В случае с AVR это кажись через ijmp делается.
  • avatar
  • Katz
  • 13 июня 2019, 20:43
+1
Ну не знаю, обработчик событий я бы не стал называть автоматом.
  • avatar
  • Vga
  • 11 июня 2019, 18:13
+1
Только как по мне — автомат спрятан в самом контроллере. Здесь только обработчик его состояний.
  • avatar
  • Vga
  • 11 июня 2019, 18:13