kool 0 28 февраля, 2010 Опубликовано 28 февраля, 2010 · Жалоба А вообще, логично было бы назвать вывод MISO - DI , MOSI - DO у Тини. Чем руководствовались Атмел, не понятно... Возможно, Вы будете удивлены, но они почти так у Атмела и названы (с точностью до наоборот). У тини названия выводов MISO и MOSI никак не связаны с USI. Эти названия касаются только назначения ног в режиме программирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 28 февраля, 2010 Опубликовано 28 февраля, 2010 · Жалоба Вот именно, с точностью до наоборот. Мне, например, удобно связать по интерфейсу SPI Тини с Мегой через разъем для программирования. В случае, если Тини будет Мастером, а Мега - Слейвом, использование аппаратного USI (SPI) через этот же разъем не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 1 марта, 2010 Опубликовано 1 марта, 2010 · Жалоба С USI(SPI) работает, но нужно организовывать протокол передачи байт, либо синхронизировать начало передачи выводом SS. А у Тини у меня уже нет лишних выводов. Вернулся я все-таки к интерфейсу USI->TWI(Slave). Обнаружил у себя одну ошибку настройки портов. Но все-равно драйвер USI->TWI(Slave) avr312 не работает, а вот этот исходник - работает. usiTwiSlave.zip Code_for_Sharing.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 2 марта, 2010 Опубликовано 2 марта, 2010 · Жалоба Чтобы отправить от Slave(Tiny45) длинный байт for(;;) { if(usiTwiSlave.available()) { //usiTwiSlave.receive(); usiTwiSlave.write((unsigned char)(Value >> 24)); usiTwiSlave.write((unsigned char)(Value >> 16)); usiTwiSlave.write((unsigned char)(Value >> 8)); usiTwiSlave.write((unsigned char)(Value >> 0)); } } в Master(Мега) нужно добавить задержки void ReadSensor() { I2c_StartWait(SENSOR_ADDR | W); // slave address, write to capsensor SENSOR_ADDR I2c_Write(TWI_CMD_MASTER_READ); I2c_RepStart(SENSOR_ADDR | R); // slave address + read bit, read capsensor SENSOR_ADDR ValueOfCharge = (unsigned long)I2c_Read(I2C_ACK) << 24; delay_ms(100); ValueOfCharge |= (unsigned long)I2c_Read(I2C_ACK) << 16; delay_ms(100); ValueOfCharge |= (unsigned long)I2c_Read(I2C_ACK) << 8; delay_ms(100); ValueOfCharge |= (unsigned long)I2c_Read(I2C_NACK) << 0; I2c_Stop(); } Тини работает от 8МГц, Мега - на 20 МГц. При меньших задержках - не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nuts_ 0 30 марта, 2010 Опубликовано 30 марта, 2010 · Жалоба Если надо то есть реальный проверенный код на ASM 45я и mega8535 на одной правда тактовой частоте 16 мгц суть что используються констуркции вида cbi DDRB,0 cbi PortB,2 cbi DDRB,2 для ACK =----- тоже откуда то сыскал боле менее готовые исходники в свое время Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stells 9 30 марта, 2010 Опубликовано 30 марта, 2010 · Жалоба Если надо то есть реальный проверенный код на ASM надо, давайте :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nuts_ 0 1 апреля, 2010 Опубликовано 1 апреля, 2010 (изменено) · Жалоба код для принимающего утройтва принимает 6 байт ну еще широковещательный пакет обрабатываеться рабоатет по прерываниям .include "tn45def.inc" .def temp =r16 .def USIcnt =r19 .def USIstate =r20 .org 0 RJMP reset;RESET External Pin, Power-on Reset, Brown-out RJMP reset;INT0 External Interrupt Request 0 RJMP reset;PCINT0 External Interrupt Request 1 RJMP reset;TIMER1 COMPA Timer/Counter1 Compare Match A RJMP reset;TIMER1 OVF Timer/Counter1 Overflow RJMP reset;TIMER0 OVF Timer/Counter0 Overflow RJMP reset;EE_RDY EEPROM Ready RJMP reset;ANA_COMP Analog Comparator RJMP reset;ADC ADC Conversion Complete RJMP reset;TIMER1 COMPB Timer/Counter1 Compare Match B RJMP reset;TIMER0 COMPA Timer/Counter0 Compare Match A RJMP reset;TIMER0 COMPB Timer/Counter0 Compare Match B RJMP reset;WDT RJMP USIstart;USI - start RJMP USIofl;USI - Overflow ;----------------------- USIstart: push temp ldi temp,1 mov USIstate,temp in temp,USICR;(Enable USI Counter overflow interrupt) sbr temp,0b01000000 out USICR,temp rcall ClearACK pop temp reti USIofl: push temp mov temp,USIstate cpi temp,1 breq I2Cadr cpi temp,2 breq I2Cack cpi temp,3 breq I2Cbyte rjmp USIend I2Cadr: in temp,USIDR cpi temp,0b11111110 breq I2Calladr cpi temp,0b00000100 brne I2Cbadadr ; cbi portb,1 ldi xl,low(0x80);Set pointer on the first received byte ldi xh,high(0x80);адрес буфера дл япримеа rcall SetACK ldi temp,2 mov USIstate,temp clr USIcnt rjmp USIend I2Cack: rcall ClearACK inc USIcnt mov temp,USIcnt cpi temp,6; сколько приянть байтов breq I2Call ldi temp,3 mov USIstate,temp rjmp USIend I2Cbyte: in temp,USIDR st X+,temp; прияняли очередной байт rcall SetACK ldi temp,2 mov USIstate,temp rjmp USIend I2Calladr: ; пришел шыроковещательный пакет rjmp I2Cbadadr I2Call: ; sbi portb,1 ; прияны все данные! I2Cbadadr: rcall StopDetected USIend: pop temp reti ;-------- SetACK: sbi DDRB,0 sbi PortB,2 sbi DDRB,2 in temp,USISR cbr temp,0b00000001;(Set counter to 0xE) sbr temp,0b11101110;(Enable new interrupts. Releasing SCL) out USISR,temp ret StopDetected: in temp,USICR;(Disable USI Counter overflow interrupt) cbr temp,0b01000000 out USICR,temp ClearACK: cbi DDRB,0 cbi PortB,2 cbi DDRB,2 in temp,USISR cbr temp,0b00001111;(Clear counter) sbr temp,0b11100000;(Enable new interrupts. Releasing SCL) out USISR,temp ret ;------------------ reset: ldi temp,high(RAMEND);High byte only required if out SPH,temp ;RAM is bigger than 256 Bytes ldi temp,low(RAMEND) out SPL,temp ldi temp,0b00000010 out PORTB,temp ldi temp,0b00000010 out DDRB,temp ldi temp,(1<<USISIE)+(1<<USIWM1)+(1<<USIWM0)+(1<<USICS1) out USICR,temp ldi temp,0xf0 out USISR,temp ldi Zh,HIGH(reset) ldi Zl,LOW(reset) ldi temp, 0b00100000 out MCUCR,temp sei clr USIstate loop: sleep rjmp loop Изменено 1 апреля, 2010 пользователем IgorKossak Неправильное оформление длинного текста Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stells 9 1 апреля, 2010 Опубликовано 1 апреля, 2010 · Жалоба код для принимающего уcтройcтва спасибо! попробовать правда в ближайшее время не получится, но как только результат будет, отпишусь. может свой вариант предложу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cursedsmite 0 24 января, 2013 Опубликовано 24 января, 2013 · Жалоба Скажите, а примера реализации похожей задачи на ассемблере кто-нибудь видел? код для принимающего утройтва А кода для передающего устройства, того же Atiny45 ни у кого нету? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться