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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> ATtiny2313 прием по SPI 4 байт
XVR
сообщение Sep 26 2009, 13:45
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(WreWolf @ Sep 25 2009, 20:59) *
Нет у меня всего 2 PWM
1 для управления мотором
2 для управления сервоприводом
А это что было?
Цитата
И вывести PWM на 1 ножку если первые 2 байта больше 127 или на 2 ножку если меньше.
PWM генераторы (за редким исключением) выводят свой PWM на какую то конкретную ножку (одну). Т.е., что бы сделать вывод PWM на 2 ножки понадобытся 2 канала PWM. Плюс 50ти герцовый для управления сервоприводом
Цитата
Т.е. вы имеете в виду сделать прерывание по срабатыванию 1 PWM и програмно дергать 4 ножки вслед за сигналом PWM
Нет, я имею в виду чисто програмный PWM (по прерыванию от таймера)

Цитата
у 2313 есть аппарытный 2-х канальный PWM
а как быть с сигналом управления сервоприводом?
это PWM с частотой 50Гц
Замечательно. Тогда 2 первых канала ложатся на 2 PWM 2313, а 50Hz PWM делается по таймеру (таймер то свободный есть?)
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Sep 28 2009, 09:03
Сообщение #17


Участник
*

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



всего есть 2 таймера если
Прикрепленное изображение

вот там можно делать?

Т.е. я понимаю по срабатыванию будет передано управление на прерывание, где я смогу сделать то что нужно
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Sep 30 2009, 08:08
Сообщение #18


Участник
*

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



CODE
#include <avr/power.h>
#include <avr/eeprom.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define SPI_MOSI PINB5
#define SPI_MISO PINB6
#define SPI_SCK PINB7
#define DDR_SPI DDRB

#define F_CPU 8000000UL // 8 MHz

uint8_t PULSE_WIDTH=0x40;
uint8_t SERVO=0x7F;

void SPI_SlaveInit(void)
{
// Set MOSI, SCK and SS as output, all others input
DDR_SPI |= (1<<SPI_MISO) ;

// Enable USI for SPI, External Clk, SPI mode 0
USICR |= (1<<USIWM0) | (1<<USICS1);
}
uint8_t SPI_SlaveReceive(void)
{
while(!(USISR & (1<<USIOIF)));
return USIDR;
}


void SPI_SlaveTransmit(uint8_t ByteOfData)
{
USIDR = ByteOfData;
while(!(USISR & (1<<USIOIF)));
}

void pwm_io_init() //Инициализация портов ввода-вывода PWM для DC мотора
{
DDRB |= (1 << PINB1)|(1 << PINB2)|(1 << PINB3)|(1 << PINB4);
PORTB = 0;
}

void pwm_start()
{
uint8_t V;
if (PULSE_WIDTH>127) {
V=(PULSE_WIDTH-127)/256;
OCR1AL = V; //Load Pulse width
OCR1AH = 0;
TCCR1A = 0x81; //8-bit, Non-Inverted PWM
TCCR1B = 1; //Start PWM
}else{
V=(127-PULSE_WIDTH)/256;
OCR1BL = V; //Load Pulse width
OCR1BH = 0;
TCCR0A = 0x81; //8-bit, Non-Inverted PWM
TCCR0B = 1; //Start PWM
}
}


int main(void)
{
uint8_t ByteOfData1;
SPI_SlaveInit() ;
_delay_us(10) ;
pwm_io_init();
_delay_us(10) ;

while (1)
{
ByteOfData1 = SPI_SlaveReceive();
PULSE_WIDTH = ByteOfData1;
ByteOfData1 = SPI_SlaveReceive();
SERVO = ByteOfData1;
pwm_start();
}
}



Вот получилось вот так вывод ШИМ на 1 ил 2 ножку
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 30 2009, 09:30
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(WreWolf @ Sep 28 2009, 13:03) *
всего есть 2 таймера если

вот там можно делать?
Если этот таймер не занят под PWM, то можно
Цитата
Т.е. я понимаю по срабатыванию будет передано управление на прерывание, где я смогу сделать то что нужно
Да
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Oct 13 2009, 07:57
Сообщение #20


Участник
*

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



Как в AVR Studio 4 написать обработчик прерываний?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 13 2009, 16:06
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(WreWolf @ Oct 13 2009, 10:57) *
Как в AVR Studio 4 написать обработчик прерываний?

AVR Studio - это просто среда. Там можно набирать любую программу. В том числе и на Си. Поэтому вопрос некоректен. Думаю что вы хотели спросить "как написать обработчик прерывания на ассемблере".
Если это так, то ответ следующий:

1) Обработчик прерывания - это обычная подпрограмма, переход на которую осуществляется по фиксированному вектору. Соответственно, вам надо написать подпрограмму, а в векторе-обработчика разместить переход на неё.
2) Надо учесть, что при переходе к обработке прерывания, автоматически сбрасывается бит разрешения прерывания. Соответственно необходимо разрешить его (если это требуется) при выходе. Обычно для этого используется инструкция reti вместо ret.
3) Надо почитать в даташите на данную микросхему необходимые дополнительные действия, если они есть. Так например иногда используется один общий обработчик для группы прерываний (флагов) или требуется ручной сброс флага прерывания и т.п.
4) Необходимо сохранить sreg а также используемые в прерывании регистры и восстановить их при выходе.

Например так:
Вектора:
Код
    .cseg

    rjmp    init

;****************************************************************
;*                             Прерывания.                            *
;****************************************************************



.if chip == 88
        .org    OC2Aaddr
    rjmp    Tim2Cmp        ; Обработка двигателя
        .org    OVF0addr
.else
        .org    OC2addr
    rjmp    Tim2Cmp        ; Обработка двигателя
        .org    OVF0addr
.endif


Обработчик:
Код
;****************************************************************
;*                Прерывание от таймера 0. (180мkс)                *
;****************************************************************

.equ    PerIzm = 180        ; Период измерения 180 мкс
.equ    FuelCanal = 4-2        ; Канал измерения по частоте

Tim0Ovf:
    in        tmpsreg,sreg    ; Сохранить SREG
............
Tim0OvfEnd:
    out        sreg,    tmpsreg
    reti
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Oct 17 2009, 09:19
Сообщение #22


Участник
*

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



Цитата
1) Обработчик прерывания - это обычная подпрограмма, переход на которую осуществляется по фиксированному вектору. Соответственно, вам надо написать подпрограмму, а в векторе-обработчика разместить переход на неё.

Так понятнее.

Цитата
2) Надо учесть, что при переходе к обработке прерывания, автоматически сбрасывается бит разрешения прерывания. Соответственно необходимо разрешить его (если это требуется) при выходе. Обычно для этого используется инструкция reti вместо ret.

Цитата
3) Надо почитать в даташите на данную микросхему необходимые дополнительные действия, если они есть. Так например иногда используется один общий обработчик для группы прерываний (флагов) или требуется ручной сброс флага прерывания и т.п.


Цитата
4) Необходимо сохранить sreg а также используемые в прерывании регистры и восстановить их при выходе.


Зачем сохранять данные регистров. Если я не буду их трогать.

Можно про реализацию на си
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th August 2025 - 09:50
Рейтинг@Mail.ru


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