Jump to content
GUM

Проблема с TWI(I2C)

Recommended Posts

Всем привет! Начал разбираться с протоколом TWI(I2C) на авр, а именно atmega 8. Почитал статьи на изиэлектроник, написал обработку на прерываниях(подсматривая в пример), чтобы вникнуть. Начал тестить в протеус иии... Неизвестная бага не дает мне покоя. Старт производит, адрес слэйва передает(с битом на запись), адрес нужной ячейки передает, а уже при записи пишет ерунду, все время одно и то же, первый 0x00, второй 0xff, потом стоп(стоп запланирован) и какие бы байты я не писал в обработчике, передает 2 одинаковых 00 и ff... Ошибок не выдает, я поставил флаг на ошибки(1 на ноге), в нужное подпрерывание попадает ровно столько раз, сколько надо(тое ставил флаги туда), да и ставил флаги в другие обработчики прерываний(в которые не надо попадать в данном случае), но все норм. Я скину сюда часть кода, эквиваленты, озу нужные, макрос на отправку, и обработчики прерываний, которые используются для отправки байтов. Пишите, если нужна будет доп информация.

Кстати, все прогнал по трассировщику в студии,  просто сделал rcall на нужную последовательность обработчиков

.equ F_CPU = 8000;частота процессора
    
    
    .equ i2c_sarp   = 0b00000000    // Start-Addr_R-Read-Stop                   Это режим простого чтения. Например из слейва или из епрома с текущего адреса
    .equ i2c_sawp   = 0b10000000            // Start-Addr_W-Write-Stop          Это режим простой записи. 

    .equ i2c_sawsawp    = 0b10000001                // Start-Addr_W-WrPageAdr-Write-Stop    Это режим с предварительной записью нужного адреса страницы в 1 байт  а потом запись
    .equ i2c_saw2sawp       = 0b10000011            // Start-Addr_WrPageAdrH-WrPageAdrL-Write-Stop  Это режим с предварительной записью нужного адреса страницы в 2 байт  а потом запись

    .equ i2c_sawsarp        = 0b00000001            // Start-Addr_W-WrPageAdr-rStart-Addr_R-Read-Stop       Это режим с предварительной записью нужного адреса страницы в 1 байт  а потом чтение
    .equ i2c_saw2sarp       = 0b00000011

 

.DSEG
        
        ;"******" - нужно вносить изменения в основном цикле!!!!!!
        I2C_SlaveAdres: .byte 1;регистр с адресом слэйва******************

        I2C_busy: .byte 1; байт флага занятости шины и2с 1-занято! 0-свободно!
        I2C_ERR: .byte 1;байт для ошибок
        
        I2C_DO: .byte 1;задание, читать или записывать, 2 байта адрес или 1?**********

        I2C_LOW_ADRES: .byte 1;младший байт адреса ячейки для чтения/записи(если адрес однобайтовый, то младший единственный)********
        I2C_HIGH_ADRES: .byte 1;старший байт адреса ячейки для чтения/записи***************

        I2C_KOL_BYTE: .byte 1; сколько байт нужно прочесть или записать? писать количетсво!!!!***********

        I2C_BUFER: .byte 5; байты, которые хотим пропихнуть*************

        I2c_ADRES_BUFER_IN: .byte 2;младший и старший байты адреса начала буфера данных для приема!***************

        I2C_ADRES_BUFER_OUT: .byte 2;младший и старший байты адреса начала буфера данных для отправки!****************

        I2C_INDEX_DATA: .byte 1;размер смещения,т.е. сколько байт уже отправлено, вначале отправки должен ранвться 0!

 

TWSI:;перрывание i2c
PUSHF;р16 и sreg в стэк
PUSH R17;в стек
PUSH R18
PUSH R0;в стек
PUSH R30;в стек
PUSH R31;в стек
CLR R0;нужен 0
LDI ZH,HIGH(TWI_TABLE);заносим в индексную пару адрес таблицы причины прерывания и2с
LDI ZL,LOW(TWI_TABLE);и младший байт
UIN R16,TWSR;кода прерывания в р16
LSR R16;сдвиг влево
LSR R16;еще
LSR R16;и еще
ADD ZL,R16;прибавляем значение к адресу таблицы
ICALL;переходим на причину прерывания


POP R31;достаем из стека z пару
POP R30;
POP R0;р0 из стека
POP R18
POP R17;р17 из стека
POPF;достаем р16 и sreg
RETI;выход из прерывания

TWI_TABLE:;таблица прерываний
RJMP TWI_0x00;0x00 Bus Fail Автобус сломался… эээ в смысле аппаратная ошибка шины. Например, внезапный старт посреди передачи бита.

RJMP TWI_0x08;0x08 Start Был сделан старт. Теперь мы решаем что делать дальше, например послать адрес ведомого

RJMP TWI_0x10;0x10 ReStart Был обнаружен повторный старт. Можно переключиться с записи на чтение или наоборот. От логики зависит.

RJMP TWI_0x18;0x18 SLA+W+ACK Мы отправили адрес с битом записи, а в ответ получили ACK от ведомого. Значит можно продолжать.

RJMP TWI_0x20;0x20 SLA+W+NACK Мы отправили адрес с битом записи, а нас послали NACK. Обидно, сгенерим ошибку или повторим еще раз.

RJMP TWI_0x28;0x28 Byte+ACK Мы послали байт и получили подтверждение, что ведомый его принял. Продолжаем.

RJMP TWI_0x30;0x30 Byte+NACK Мы послали байт, но подтверждение не получили. Видимо ведомый уже сыт по горло нашими подачками или он захлебнулся в данных. 
;Либо его ВНЕЗАПНО посреди передачи данных украли инопланетяне.

RJMP TWI_0x38;0x38 Collision А у нас тут клановые разборки — пришел другой мастер, 
;по хамски нас перебил, да так, что мы от возмущения аж заткнулись. Ничего I’l be back! До встречи через n тактов!

RJMP TWI_0x40;0x40 SLA+R+ACK Послали адрес с битом на чтение, а ведомый отозвался. Хорошо! Будем читать.

RJMP TWI_0x48;0x48 SLA+R+NACK Крикнули в шину «Эй ты, с адресом ХХХ, почитай нам сказки» А в ответ «Иди NACK!» 
;В смысле на запрос адреса с битом чтения никто не откликнулся. Видимо не хотят или заняты. Также может быть никого нет дома.

RJMP TWI_0x50;0x50 Receive Byte Мы приняли байт. И думаем что бы ответить ведомому. ACK или NACK.

RJMP TWI_0x58;0x58 Receive Byte+NACK Мы приняли байт от ведомого и сказали ему «иди NACK!» И он обиженый ушел, освободив шину.

TWI_0x10: ;повторный старт
TWI_0x08:;произвели старт!
LDS R16,I2C_SlaveAdres;адрес слэйва
LDS R17,I2C_DO;что нужно, запись или чтение?
CPI R17,0
BRNE TWI_0x10_WR
ORI R16,1<<0
TWI_0x10_WR:
OUT TWDR,R16;отправляем адрес слейва по шине и2с
OUTI TWCR,0<<TWEA|0<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE|1<<TWINT ;флаг преывания, блок тви и разрешаем прерывания
;TWINT флаг прерывания
;TWEA 1-ACK, 0-NACK
;TWSTA 1-start, 0-no start
;TWSTO 1-stop
;TWEN блок TWI включен
;TWIE - разрешаем прерывания TWI
RET;выход из подпрерывания

 

TWI_0x18:;подтверждение после посылки байта адреса и бита записи
LDS R16,I2C_DO;загружаем тех задание в регистр
SBRS R16,0;проверяем, нужно ли нам только записать байт? если да, то переход БЕЗ АДРЕСОВ!
RJMP TWI_0x18_sawp;чтение тут невозможно! т.к. на чтении будет другое подпрерывание
SBRC R16,0;проверяем, а не нужно ли нам послать адрес ячейки? в которую хотим писать
RJMP TWI_0x18_sawsawp;если нужно , то переход. Адрес ячейки состоит из одного байта! соответственно младшего
;если ничего не подошло, значит нужно отправить адрес состоящий из двух байт
;передачу начинаем со старшего байта, затем просто в тех задании поправим на пересылку оставшегося младшего байта
LDS R17,I2C_HIGH_ADRES;загружаем старший байт
ANDI R16,~(1<<0);обнуляем первый бит тех задания, тем самым переводим его на отправку еще одного байта адреса(младшего)
STS I2C_DO,R16
OUT TWDR,R17;загружаем старший байт адреса в тви
RET;выход из подпрерывания

  

TWI_0x18_sawsawp:;ЭТО КЛОООООН!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Запись только младшего байта адреса
LDS R17,I2C_LOW_ADRES;загружаем младший байт адреса ячейки слейва
DEC R16;первращаем sawsawp/sawsarp в просто в sawp или sarp!!!, т.е. загружаем в задание только запись! нужный байт адреса мы уже отослали! теперь только запись/чтение 
STS I2C_DO,R16 ;закидываем в задания
OUT TWDR,R17;загружаем адрес ячейки в тви для записи
OUTI TWCR,0<<TWEA|0<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE|1<<TWINT; передача младшего байта адреса!
RET;выход из подпрерывания

 

TWI_0x18_sawp:;ЭТО КЛОООООН!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! запись самих байтов

;(сюда я вставлял счетчик, сколько раз здесь бывает процессор, и все сходится)

LDS R16,I2C_KOL_BYTE;считываем, сколько байт нам нужно записать????
LDS R18,I2C_INDEX_DATA;счетчик, сколько байт скинули
CP R16,R18; кончились байты то?
BREQ TWI_0x18_STOP;если да, то переход и СТОП!!!! говорим слейву: хватит братан, но передаем последний байт)
LDS ZL,I2C_ADRES_BUFER_OUT            //младший байт адреса буфера данных озу, откуда брать байты на отправку
LDS ZH,I2C_ADRES_BUFER_OUT+1       //старший байт адреса буфера данных озу, откуда брать байты на отправку
ADD ZL,R18;прибавляем к адресу  количество байт, которые отправили
ADC ZH,R0
INC R18;увеличиваем счетчик на 1
STS I2C_INDEX_DATA,R18;отправляем в озу
LD R17,Z;берем один из.. байтов по адресу индексной пары 

;(сюда я вставлял строчку LDI R17,1    но отправляет в итоге не одни 1, а опять таки 00 и ff)
OUT TWDR,R17;отправляем в регистр для передачи
OUTI TWCR,0<<TWEA|0<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE|1<<TWINT ;передача очередного байта данных!
RET;выход из подпрерывания

 

TWI_0x18_STOP:;СТОПЭ братан слейв,наелся ты байтов, отдохни ЭТО КЛОООН!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
STS I2C_busy,R0;освобождаем линию тви
OUTI TWCR,1<<TWEA|0<<TWSTA|1<<TWSTO|1<<TWEN|1<<TWIE|1<<TWINT ;запись ОКОНЧЕНА!
RET;выход из подпрерывания

TWI_0x28:
LDS R16,I2C_DO;и так, м ыздесь потому что: 1-отправили адрес и нужна запись байтов в ячейки
;2- отправили адрес и нужно чтение и 3 - отправили старший байт памяти, нужно отправить младший.
CPI R16,i2c_sawp;нужна запись?
BREQ TWI_0x18_sawp;переход
SBRC R16,0;нужно записать оставшийся младший байт?
RJMP TWI_0x18_sawsawp;переход!
;а иначе повторный старт!!!!
OUTI TWCR,1<<TWEA|1<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE|1<<TWINT ;повторный старт, т.к. чтение!
RET;выходи из подпрерывания

 

.MACRO I2C_OUT;НУЖНО ПРЕДВАРИТЕЛЬНО ЗАКИНУТЬ ОТПРАВЛЯЕМЫЕ ДАННЫЕ В И2С БУФЕР!!!
    ;0-адрес слейва, младший байт = 0!!!
    ; 1-запись или чтение? если с адресом, то сколькибитный?
    ;2-младший байт адреса регистра слэйва
    ;3-старший байт адреса регистра слейва(если не нужен, то 0)
    ;4-сколько байт нужно записать, прочитать?
    ;5-какая скорость передачи нужна?
    ;6-откуда брать байты?
    CLR R16
    STS I2C_INDEX_DATA,R16
    LDI R16,1
    STS I2C_BUSY,R16
    OuTI I2C_SlaveAdres,@0
    //OUTI TWAR,@0;заружаем адрес слэйва
    
    LDI R16,@1;загружаем задание
    STS I2C_DO,R16
    
    .if @3>0x00
    LDI ZL,LOW(@2);адрес регистра слэйва для приема/передачи
    LDI ZH,HIGH(@3)
    STS I2C_LOW_ADRES,ZL
    STS I2C_HIGH_ADRES,ZH
    .else
    LDI ZL,LOW(@2)
    STS I2C_LOW_ADRES,ZL
    .endif


    LDI R16,@4;загружаем значение количества байт для приема/передачи
    STS I2C_KOL_BYTE,R16
    
    OUTI TWSR,0<<TWPS1|0<<TWPS0;предделитель 1

    LDI R16,((F_CPU/@5)-16)/2;расчетскорости приема/передачи данных
    UOUT TWBR,R16

    LDI ZL,LOW(@6)
    LDI ZH,HIGH(@6)
    STS I2C_ADRES_BUFER_OUT,ZL
    STS I2C_ADRES_BUFER_OUT+1,ZH

    OUTI TWCR,1<<TWINT|1<<TWEA|1<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE;запуск! отправляем старт! 
;TWINT флаг прерывания
;TWEA 1-ACK, 0-NACK
;TWSTA 1-start, 0-no start
;TWSTO 1-stop
;TWEN блок TWI включен
;TWIE - разрешаем прерывания TWI
   .ENDM

Тело:

OUTI I2C_BUFER,1
OUTI I2C_BUFER+1,2

I2C_OUT 0xA2,i2c_sawsawp,0x03,0,2,200,I2C_BUFER - сюда больше не вернется

Main:

зацикливание

Rjmp main

П.С. вот что пишет i2c debuger в протеусе: S A2 A 03 A 00 A FF A P

Edited by GUM
Дополнение

Share this post


Link to post
Share on other sites

Новая информация! Запустил отладчик в протеусе конкретно TWI, ошибка следующая, При отправке любого байта сначала пишется строчка [AVR TWI] Initiating data write 0xA2 [U3](я так понял это то, что я отправил в регистр TWDR), затем идет строчка [AVR TWI] Actual data read written 0xA2 [U3] (это то, что отправили слейву в данном случае). После отправки адреса ячейки для записи у меня одна песня играет, сначала идет строчка PC=0x00F2. [AVR TWI] Initiating data write 0x01 [U3], затем PC=0x0210. [AVR TWI] Actual data read written 0x00 [U3] (так записывает первый байт) последующие отправляет одинаково но по другому в отличие только от первого: PC=0x00F2. [AVR TWI] Initiating data write 0x01 [U3], PC=0x0210. [AVR TWI] Actual data read written 0xFF [U3] -второй байт(должен быть 0x01), PC=0x00F2. [AVR TWI] Initiating data write 0x01 [U3], PC=0x0210. [AVR TWI] Actual data read written 0xFF [U3] - третий, такой же четвертый и тд. То есть в регистр записываются нормальные значения, а по итогу отправляет совсем не те байты! Моет кому помогло понять, в чем ошибка... А то уже всю голову сломал! Брал тупо код обработчика прерываний на асме с сайта изиэлектроник, заменив там только макросы, ошибка идентичная! оставил там только свой макрос на отправку.
 

Share this post


Link to post
Share on other sites

И так друзья) спасибо всем откликнувшимся :-D спустя 2 недели мучений, ковыряний протеуса, осмотра всех режимов отладки, все пошаговые и не пошаговые, я следил за состоянием всех регистров, как TWI , так и РОН,  снижал частоту процессора, что только не делал. Заметил, что пока PC крутиться в главном цикле, который зациклен на main, rjmp main, т.е. он ничего не делает, регистр TWDR самостоятельно меняется на 00, а при передаче второго, третьего и тд байтов на FF не заходя в прерывание, и понял, что что-то тут не так! Уже хотел писать код без прерываний, так сказать быдло код, но решил проверить на микросхеме eeprom, о чудо, все работает, передает нужные байты. Тут надо сказать: Братан, а чего ты раньше не пробовал другие микрухи, а яв от пробовал! Т.к. схема связана с часами, то решил заменить на аналог DSхххх не помню точное название и там была та же самая хрень, только вместо первого байта 00 и последующий ff, он передавал немного другие, например первый 0x02, второй и последующие 0x55 , а я программировал на передачу только 0x01. Ясно, микруха фигово реализована в протеусе. Но все же она мне нужна, моя заказанная еще не пришла, стал копать , что же не так? Пробежался по даташиту, не нашел ничего специфического. Решил передавать байты в разные ячейки, скажем 10 раз по 3 байта каждый раз и того 30 ячеек проверю. И наконец-то обнаружил суть проблемы, по неизвестным причинам при первой отправке байта(ов), не важно, отправлять 1 байт или 1000000, возникает моя проблема , первый байт всегда 0х00, а второй и последующие(хоть миллион байтов) 0хff. А при последующей отправке во второй, третий и тд, все работает, как "часы".  Может кто столкнулся с такой проблемой, надеюсь помогу кому в будущем) Тему можно закрывать!

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Новинки и уникальные решения Molex. На что обратить внимание и почему»

15 апреля приглашаем на вебинар, который будет интересен разработчикам и инженерам-схемотехникам, интересующимся тенденциями рынка, новыми перспективными решениями для соединений «провод-провод», «провод-плата», «плата-плата». Для инженеров КИПиА и IT будут освещены уникальные решения Molex для «удлинения» интерфейсов HDMI, DisplayPort и USB даже в условиях сильного зашумления, а также семейство бесконтактных датчиков Contrinex. Помимо этого, будет уделено внимание дальнейшему развитию направления антенн, где Molex имеет ряд интересных и уникальных решений.

Подробнее

Клёво!:rolleyes: по ходу большинство пользователей не пишут на ассемблере. Для вас принципиально использовать асм. 

Share this post


Link to post
Share on other sites

Пишут, еще как пишут. Но... не так коряво. Сколько времени надо потратить, чтобы хоть как-то разобраться в этой портянке.:)

Share this post


Link to post
Share on other sites
                     

Выбираем преобразователь для портативных устройств

Портативные устройства могут различаться по типам элементов питания, а также по разным функциям. В статье на примере 3-х устройств демонстрируется, как многоканальные SIMO-преобразователи помогают эффективно реализовывать потенциал системы питания и первичного элемента, а также гибко подстраиваться под требуемый функционал.

Читать статью

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • Guest Роман
      By Guest Роман
      Добрый день, форумчане. Такая задача. Хочу создать несколько устройств на светодиодах. Задача каждого в том, чтобы от движения (датчик вибрации, наклона) светодиод начинал моргать, переливаться и т.д. Подпитывается всё от батарейки, конечно же как можно меньших размеров (таблетка).
      Собственно я уже реализовал такое пробное устройство на ATtiny13, вибродатчике 18015 и батарейке CR1220. Всё работает, но хотелось бы это дело и удешевить и уменьшить в размерах, если это конечно же возможно. Особо в параметрах МК я не разбираюсь, но могу сказать что мне от неё точно нужно:
      1) Маленький размер
      2) Как минимум 1 канал ШИМ (а лучше 3, для переливания трёх светодиодов RGB)
      3) Память на 1Кб (программу для одного такого устройства приложу ниже, может её можно и сократить, но не факт что такую же, но на три диода получится ужать)
      4) Низкое потребление или возможность подключения режимов с низким потреблением.
      5) Работа от 3В. (от таблетки)
      6) Возможность программирования через Arduino UNO (но другие варианты тоже рассматриваю, просто Arduino уже есть)

      Повторюсь пока что нашел и использовал только ATtiny13, который меня вполне устроил, но он достаточно дорогой и в корпусе SOIC его найти достаточно проблематично. К тому же как мне показалось, он слишком хорош для такого проекта. Повторюсь, я чайник, и может есть какие-то более дешевые аналоги.

      Очень надеюсь на Вашу помощь. Заранее большое Вам спасибо!
      Прикладываю обещанный мною код:
      int vib = 4; int led = 0; long loopTime = 5000; void setup() { pinMode(led, OUTPUT); pinMode(vib, INPUT); } void loop() { if (digitalRead(vib)){ unsigned long currentMillis = millis(); while(millis()-currentMillis<=loopTime) { for(int fadeValue = 0; fadeValue <=255; fadeValue+=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 255; fadeValue >=0; fadeValue-=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 0; fadeValue <=255; fadeValue+=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 255; fadeValue >=0; fadeValue-=5){ analogWrite(led,fadeValue); delay(2); } digitalWrite(led, LOW); delay(600); } } }  
    • By Evgeniy90
      Здравствуйте! Столкнулся со следующей проблемой: при сборке МД "Шанс" дошел до этапа прошивки МК, в итоге запорол 3 атмеги. Прошивал 3 способами:
      1. Через Arduino UNO(As ISP) просто МК
      2. Через Arduino UNO(As ISP) МК внутрисхемно(соответственно с обвязкой)
      3. Через USB ASP внутрисхемно(с обвязкой соответственно).
      Вышло так, что в наличии кварца 11.0592 МГц не было, и я временно впаял 12 МГц. Прошил трижды всё правильно(фьюзы , контакты и т.д). После прошивки просто не видит МК (ну и плата не работает без МК.да и Бог с ней, но МК всеравно не могу считать). В чем причина понять не могу. Одно думаю, что это разница между 11.0592 и 12 МГц. Посоветуйте как решить проблему.
      Коды ошибок после прошивки во всех трёх случаях одинаковые:
      Sinaprog -invalid device signature
      Averdude -avrdude: warning: cannot set sck period, please check for usbasp firmware update
      target don't answer
    • By Engineerr
      Кто использует microPascal for AVR? 
      Полезные ссылки, программы, примеры.
    • By Sova
      Добрый день. Опять ATMega, опять таймер 1, вопрос рутинный, но я за сегодня уже извёлся. Что я хотел сделать: МК должен рассчитывать положения моторов (SG90, регулируются временем импульса), включать их все вместе по совпадению таймера 2, затем рассчитывать, когда какой мотор надо отключить, получившийся список сортировать и ставить таймер 1. Таймер 1 сработал - выключили мотор, переставили таймер 1 на подальше. Снова сработал - снова что-то там сделали, увеличили OCR1A и так далее. Конечно же с первого раза не заработало и я начал упрощать и локализировать проблему.
      Получилось вот что: при срабатывании прерывания на совпадение таймера 1 с OCR1A я смотрю в отладчик - а там во-первых TIFR = OCF1A + OCF1B + TOV1, а TCNT1 равен чему угодно, но не OCR1A. Таймер как будто срабатывает не тогда. А когда я ставлю значение поменьше, допустим, OCR1A = 1000 и перехожу в пустой цикл while(1){}, то при наступлении OCR1A == 1000 просто ничего не происходит, прерывание не срабатывает. В целом так. Сейчас очень упрощённый, минимально не работающий код выглядит так:
      #define SET(_REGISTER, _BIT) _REGISTER |= 1 << _BIT #define UNSET(_REGISTER, _BIT) _REGISTER &= ~(1 << _BIT) void local_timer_setup(void) { SET(TCCR1B, CS10); //Setting timer 1 to x1 mode }; void local_timer_start(void) { TCNT1 = 0; SET(TIMSK, OCIE1A); //Allow timer 1 match A interruption }; void local_timer_off(void) { UNSET(TIMSK, OCIE1A); //Prohibit timer 1 match A interruption }; ISR(TIMER1_COMPA_vect) { PORTD = 0xFF; local_timer_off(); }; ISR(TIMER2_COMP_vect) { if (global_timer_count == 2) { global_timer_count = 0; TIFR = 0; PORTD = 0; if (current_step < 10) OCR1A = 0xFFF; else OCR1A = 0xFFFF; if (current_step == 20) current_step = 0; else current_step++; local_timer_start(); } else global_timer_count++; }; Полный код в файле. sei() не забыл. Кстати, таймер нормально выключать/включать через TIMSK, как у меня? Заранее спасибо. 
      Scarecrow_embeded.rar
    • By dron92
      Подскажите как вернуть к жизни контролер или в утиль!
      Решил собрать программатор AVRISP mkII купил микросхему собрал подключил а устройств нет в диспетчере и  Flip не видит его!
      Начал искать косяки в сборке не нашел решил спаять Отладочная плату
      тот же результат, попробовал подключить через ISP не отвечает !
      Решил пойти на крайние меры  подключил через FuseDoctor сигнатуру он не видел вел 1e9482 вроде увидел но результата сбросить не проучилось но теперь он начал видится в таком формате фото внизу




  • Сообщения

    • Где то читал.нужно на дорожке вокруг вывода детали сделать типа насечки тонким шилом.медь в этих местах будет держаться за гетинакс.сам не пробовал.
    • Вчера посмотрел по каналу "История" кусок китайского фильма про вирус в Ухани. Насколько я понял из фильма,  коронавирус диагностируется обычным КТ,  причем гораздо лучше любых тестов. 
    • Эти кнопки, поди, разрабатывали инженеры "с тремя вышками", с расчётом на 25 лет непрерывной эксплуатации в диапазоне от - 50 до +70 градусов, при давлении 100 атмосфер. Или просто сняли с военки по программе конверсии. Вспомните первые "ZX - Spectrum" фабричного отечественного производства - какие там были клавиатуры и качество сборки.
    • Вы уж определитесь - то ли вы до***ваетесь ко всем фильмам подряд, ищете в сюжетах логические, фактические несостыковки и прочие огрехи, либо же рассматриваете любой фильм, как субъективную интерпретацию событий творческой личностью режиссёра (он художник - он так видит) и тогда прощаем всё и молча наслаждаемся. А то получается  - тарантине в фантастическом фильме шаг вправо, шаг влево - расстрел, однако журналист может нести с экрана любую ахинею и это нормально. Ну а то, что у нас не сняли ничего подобного "Неизвестной войне" (и до сих пор не сняли) - это печально, конечно. Хотя, на "Звезде" пытаются что-то делать в этом направлении.
    • Да, но Вы-то её совсем не знаете!  И, самое печальное в том, что Вы её и не желаете знать, предпочитая пропагандисткие штампы.  ------------------------------------------- ЗЫ. На основе своего опыта общения с ватниками я пришел к неожиданному выводу, что ватники подобны наркоманам,  только дозой для них является не химическое вещество, а информация. То бишь если ватнику регулярно не подбрасывать материал о том, как мы живем хорошо и\или  о том, как они живут плохо, у него начинается самая настоящая ломка. Да-да, на физическом уровне.  Получается, что совриновости сейчас врут не потому, что хотят врать, а потому, что посадив однажды ватника на иглу, теперь вынуждены это делать из страха, что подсаженный ими ватник их же и угандошит.
    • Некоторые молексы изготовлены с такими допусками по размерам, что качком быть совсем необязательно.
    • А где можно почитать текст этой резолюции?  Ссылочкой поделитесь плиз.  Это не так. В США на каждом шагу памятники всем подряд и всему подряд, по поводу и без повода. Оно и понятно - как в народе культивировать патриотизм без героической истории?  А Рюриковичи из варяг. @K155TM2  должен считать скандинавов дураками за то, что они до сих пор не открымздили всю исконно их территорию.  И кто со мной спорил, что это говорит не советский человек?   Категорически не согласен, что рохля. Он новатор в мире политического бизнеса. 
×
×
  • Create New...