Перейти к содержанию
    

А вообще, логично было бы назвать вывод MISO - DI , MOSI - DO у Тини. Чем руководствовались Атмел, не понятно...

Возможно, Вы будете удивлены, но они почти так у Атмела и названы (с точностью до наоборот). У тини названия выводов MISO и MOSI никак не связаны с USI. Эти названия касаются только назначения ног в режиме программирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот именно, с точностью до наоборот. Мне, например, удобно связать по интерфейсу SPI Тини с Мегой через разъем для программирования. В случае, если Тини будет Мастером, а Мега - Слейвом, использование аппаратного USI (SPI) через этот же разъем не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С USI(SPI) работает, но нужно организовывать протокол передачи байт, либо синхронизировать начало передачи выводом SS. А у Тини у меня уже нет лишних выводов. Вернулся я все-таки к интерфейсу USI->TWI(Slave). Обнаружил у себя одну ошибку настройки портов. Но все-равно драйвер USI->TWI(Slave) avr312 не работает, а вот этот исходник - работает.

usiTwiSlave.zip

Code_for_Sharing.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы отправить от 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 МГц. При меньших задержках - не работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если надо то есть реальный проверенный код на ASM

45я и mega8535 на одной правда тактовой частоте 16 мгц

 

суть что используються констуркции вида

 

cbi DDRB,0

cbi PortB,2

cbi DDRB,2

 

для ACK

 

=-----

тоже откуда то сыскал боле менее готовые исходники в свое время

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если надо то есть реальный проверенный код на ASM

надо, давайте :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

код для принимающего утройтва

принимает 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

Изменено пользователем IgorKossak
Неправильное оформление длинного текста

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

код для принимающего уcтройcтва

спасибо! попробовать правда в ближайшее время не получится, но как только результат будет, отпишусь. может свой вариант предложу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скажите, а примера реализации похожей задачи на ассемблере кто-нибудь видел?

 

код для принимающего утройтва

А кода для передающего устройства, того же Atiny45 ни у кого нету?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...