реклама на сайте
подробности

 
 
> ATtiny2313 прием по SPI 4 байт
WreWolf
сообщение Sep 19 2009, 10:15
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



на ATtiny2313
Необходимо принять 4 байта
обьединить по 2
PWM_S = первые 2 байта
Serv_S= вторые 2 байта

И вывести PWM на 1 ножку если первые 2 байта больше 127 или на 2 ножку если меньше.
ширина PWM пропорциональна значеию |X-127|.

Код
        If PWM_S >= 127 Then
            PWM1 = Math.Abs(TextBox1.Text - 127)
            PWM2 = Disable
        Else
            PWM2= Math.Abs(TextBox1.Text - 127)
            PWM1 = Disable
        End If
        //PWM1 и PWM2 соответственно ширина 1 и 2 PWM


а вторые 2 байта нужны для выдачи на 3 ножку сигнала(управление сервоприводом)
частота 50Гц
ширина импульса от 0.9мкс до 2.1 пропорционально полученному значению

п.с.
можно ли это реализовать на ATtiny26
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
WreWolf
сообщение Sep 24 2009, 10:17
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



Ну этим занимаю не я. Этим занимается другой человек.
Я занимаюсь приемным устройством.
логика такая

клок в 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;
}
}
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- WreWolf   ATtiny2313 прием по SPI 4 байт   Sep 19 2009, 10:15
- - Ledmaster   Вопрос навстречу, а зачем принимать по два байта, ...   Sep 19 2009, 14:00
- - WreWolf   Т.е. нужно принимать 2 слова. А мне необходимо при...   Sep 21 2009, 07:28
|- - Ledmaster   Цитата(WreWolf @ Sep 21 2009, 13:28) Т.е....   Sep 22 2009, 03:41
- - WreWolf   принять 4 байта например: 0xAC7F PWM_S = 0xAC Serv...   Sep 22 2009, 10:51
|- - zltigo   Цитата(WreWolf @ Sep 22 2009, 12:51) прин...   Sep 22 2009, 11:26
- - WreWolf   действительно ( но в принципе суть в том что бы та...   Sep 23 2009, 05:16
|- - Ledmaster   Цитата(WreWolf @ Sep 23 2009, 11:16) суть...   Sep 23 2009, 14:30
- - WreWolf   Ну не совсем так. Пишется программа которая через ...   Sep 23 2009, 17:07
|- - Ledmaster   Цитата(WreWolf @ Sep 23 2009, 23:07) Пише...   Sep 24 2009, 03:18
- - XVR   Совет первый - выкинуть обрывки кода, найденные не...   Sep 25 2009, 07:05
- - WreWolf   1) Обрывки кода выкинуты 2) Даташит прочитан. 3) В...   Sep 25 2009, 11:17
- - XVR   Выглядит нормально. Теперь по поводу PWM (я так по...   Sep 25 2009, 13:17
- - WreWolf   Нет у меня всего 2 PWM 1 для управления мотором 2 ...   Sep 25 2009, 16:59
|- - XVR   Цитата(WreWolf @ Sep 25 2009, 20:59) Нет ...   Sep 26 2009, 13:45
- - WreWolf   всего есть 2 таймера если вот там можно делать? ...   Sep 28 2009, 09:03
|- - XVR   Цитата(WreWolf @ Sep 28 2009, 13:03) всег...   Sep 30 2009, 09:30
- - WreWolf   CODE#include <avr/power.h> #include <avr/...   Sep 30 2009, 08:08
- - WreWolf   Как в AVR Studio 4 написать обработчик прерываний?   Oct 13 2009, 07:57
|- - SasaVitebsk   Цитата(WreWolf @ Oct 13 2009, 10:57) Как ...   Oct 13 2009, 16:06
- - WreWolf   Цитата1) Обработчик прерывания - это обычная подпр...   Oct 17 2009, 09:19


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016