Ну этим занимаю не я. Этим занимается другой человек.
Я занимаюсь приемным устройством.
логика такая
клок в 0
ждем
цикл по колву бит
установил данные
ждем
клок в 1
ждем
клок в 0
возврат цикла
Возможно ли использование данного кода
CODE
#include <avr\io.h>
#include <avr\io2313.h>
//Function
void USIinit(void);
ISR (USI_OVERFLOW_vect);
int main(void)
{
USInit();
unsigned char pwm=ISR();
unsigned char pwm_s=ISR();
}
/* F-я Инициализация UPI*/
void USIinit(void)
{
DDRB = (1<<USI_PIN_DO);
PORTB |= (1<<USI_PIN_DI) | (1<<USI_PIN_SCK);
USICR = (1<<USIOIE) | (1<<USIWM0) | (1<<USICS1);
}
/*Прием 1байт данных UPI*/
ISR (USI_OVERFLOW_vect)
{
int usi_in_buf[8];
int gBuf_ind_in=0;
USISR |= (1<<USIOIF);
usi_in_buf[gBuf_ind_in] = USIDR;
gBuf_ind_in++;
return usi_in_buf;
}
И вот то что я нашел еще
как переписать на си.
SPI Slave Operation Example
The following code demonstrates how to use the USI module as a SPI Slave:
CODE
init:
ldi r16,(1<<USIWM0)|(1<<USICS1)
out USICR,r16
...
SlaveSPITransfer:
out USIDR,r16
ldi r16,(1<<USIOIF)
out USISR,r16
SlaveSPITransfer_loop:
sbis USISR,USIOIF
rjmp SlaveSPITransfer_loop
in r16,USIDR
ret
Как переделать это под вывод шим на 2 пина порта D
CODE
#include "iom16.h"
unsigned char pwm = 1;
unsigned char inc = 1; // inc = 0 - уменьшать, inc = 1 - увеличивать яркость
void timer2_init()
{
OCR2 = 1; //ШИМ почти выключена
// Быстрая ШИМ, переключать OC2 (PD7), увеличение таймера каждые 64 такта
TCCR2 |= (1 << WGM20) | ( 1 << WGM21) | (1 << COM21) | (1 << CS22);
}
void timer1_init()
{
OCR1A = 43200; //Прерывание 32 раза в секунду
TCCR1A = 0;
// СТС режим, увеличение таймера каждые 8 тактов
TCCR1B |= (1 << WGM12) | (1 << CS11);
// Прерывание по совпадению А таймера1
TIMSK |= (1 << OCIE1A);
SREG |= (1 << 7); //Разрешить прерывания
}
void io_init() //Инициализация портов ввода-вывода
{
DDRD = (1 << PD7)|(1 << PD6); //додумался пока только до этого
PORTD = 0;
}
void main ()
{
timer2_init();
timer1_init();
io_init();
while(1)
{
}
}
// Заставляет лампу плавно загораться и гаснуть раз в 8 секунд
#pragma vector = TIMER1_COMPA_vect
__interrupt void PWM_change()
{
if (inc == 1)
{
if (pwm < 254)
{
pwm++; // Увеличиваем яркость лампы, пока не достигнем максимума
OCR2 = pwm;
}
else
{
inc = 0;
}
}
else
{
if (pwm > 1)
{
pwm--; // Уменьшаем яркость лампы, пока не остигнем минимума
OCR2 = pwm;
}
else
{
inc = 1;
}
}
}