Вы можете написать сейчас и зарегистрироваться позже.
Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.
У меня до саба ещё дело не дошло, только сейчас думаю купить амп на полкиловатта, но так можно, при условии, что на входе будет моно, и будет срез частот
Про флаг Т: если он не используется в основной программе, а у меня он постоянно в деле.
для меня меня отложенная обработка прерывания обычное дело, нужно лишь правильно расставить приоритеты частей программы. И обычное дело: выставляешь частоту задающего генератора побольше, делишь его до получения частоты 1000 Гц каким либо таймером, загоняешь в прерывание с флагом. затем закольцовываешь основную программу с проверкой флага прерывания от таймера 1000Гц. загоняешь программу в Sleep. Получаешь кольцо обработки с образцовым интервалом в 1 мс. После любого прерывания проверяешь флаг от таймера, если он, то сбрасываешь флаг и начинаешь перебирать подпрограммы обработки индикаторов, клавиатуры, и тд. и тп, подпрограммы обработки флагов и др. После окончания обработки всех подпрограмм возвращаешься к Sleep. И так по кольцу. Если происходит прерывание не от таймера, программа выходит из Sleep, проверяется флаг от таймера, если не он (а это не он) обратно к Sleep. В большенстве программ использую этот алгоритм.
@korsaj Сегодня попробовал сделать как ты посоветовал. Получился следующий код.
#define F_CPU 7372800UL
#define BAUND 9600L
#define UBRRL_value (F_CPU/(BAUND*16))-1
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
void init_pin(void);
#define C_PC0 (~PINC&(1<<PC0))
#define C_PC1 (~PINC&(1<<PC1))
#define LED_1_ON() PORTD|=(1<<PD2)
#define LED_1_OFF() PORTD&=~(1<<PD2)
#define LED_2_ON() PORTD|=(1<<PD3)
#define LED_2_OFF() PORTD&=~(1<<PD3)
#define FLAG_END_RX (1<<3)
#define FLAG_ERR_RX (1<<4)
#define BUF_SIZE 20
char rx_buf[BUF_SIZE];
char buf_index = 0;
volatile start=1, flags;
char b;
ISR(USART_RXC_vect)
{
b=UDR;
if(!(flags & FLAG_END_RX))
{
rx_buf[buf_index]=UDR;
if(rx_buf[buf_index] == 0x0D)
{
flags |= FLAG_END_RX;
return;
}
buf_index++;
if(buf_index >= BUF_SIZE)
{
buf_index = 0;
flags |= FLAG_ERR_RX;
}
}
}
void init_UART()
{
UBRRL = UBRRL_value;
UBRRH = UBRRL_value>>8;
UCSRB|=(1<<TXEN);
UCSRB|=(1<<RXEN);
UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1));
UCSRB|=(1<<RXCIE);
sei();
flags = 0;
}
void send_UART(char value)
{
while(!(UCSRA&(1<<UDRE)));
UDR=value;
}
int main(void)
{
init_pin();
init_UART();
while(1)
{
if (start==1)
{
_delay_ms(500);
send_UART('O');
send_UART('K');
send_UART('!');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
start=0;
}
if (b == '0')
{
LED_1_ON();
LED_2_OFF();
send_UART('N');
send_UART('+');
send_UART('0');
send_UART('0');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
b=4;
}
if (b == '1')
{
LED_1_OFF();
LED_2_ON();
send_UART('N');
send_UART('+');
send_UART('0');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
b=4;
}
if (b == '2')
{
LED_1_ON();
LED_2_ON();
send_UART('N');
send_UART('+');
send_UART('0');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
b=4;
}
if (b == '3')
{
LED_1_OFF();
LED_2_OFF();
send_UART('N');
send_UART('+');
send_UART('0');
send_UART('3');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
b=4;
}
if (C_PC0)
{
send_UART('P');
send_UART('C');
send_UART('0');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(250);
}
if (C_PC1)
{
send_UART('P');
send_UART('C');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(250);
}
}
}
void init_pin(void)
{
DDRC = 0b00000000;
PORTC = 0b11111111;
DDRD |= ((1<<2)|(1<<3));
PORTD &=~ ((1<<2)|(1<<3));
}
Ну как сказать всё работает, но вот меня очень интересует приём команд на саму ATMEGA16. Он так и работает только с цифрами. Более ничего корректно принять не получается даже используя таблицу ascii. А мне нужно будет принимать команды и посложней чем просто буквенно - цифровые. Потому как возвращаясь к командам самого плеера там в этих командах хранятся различные данные.
Вот примерно так это всё выглядит.
AT+QM \ r \ n Запрос режима работы [0: Bluetooth], [1: MP3]
AT+M1 \ r \ n Номер текущего файла
AT+M2 \ r \ n Общее количество звуковых файлов
AT+MD \ r \ n Источник музыки USB или SD Card
AT+MT \ r \ n Общее время воспроизведения текущего файла
AT+MK \ r \ n Время воспроизведения текущего файла
AT+MP \ r \ n Текущее состояние плеера [0]Стоп, [1]Воспроизведение, [2]Пауза
К примеру при отправке команды AT+M1 \ r \ n в ответ мы получим M1 + 000002 \ r \ n при этом здесь может быть любое число в hex формате. Мне же нужно каким то образом принять эти данные и обработать их соответствующим образом. Но при этом и нужно учитывать так же что плеер может сам отправить эти данные по началу воспроизведения трека. Вот в этом сейчас и стоит основная задача. Чего я и пытаюсь получить в итоге.
Ну тогда дорога к сименсу в гости - они вам какой-нибудь Desigo CC или даже Siematic предложат, тыщ за 10 долларов. Ну и ещё тыщ 5 надо будет отдать за контроллеры и их конфигурирование.
А если попроще - то можно к отечественным MasterSCADA обратиться, либо к WiredBoard - у них не совсем SCADA система, но нормальные контроллеры, довольно просто настраиваются и можно графическую оболочку рисовать.
тогда вы имеете то, что имеете, и никак от этого не избавиться.
Хоть святой водой окропите. "Или трусы или крестик" (с)
Нагрузки у вас немаленькие. Вы же с нуля переделываете, снова некуда ?
Понятие LowESR очень неконкретное. Сколько вешать в граммах ?
пустая трата времени
Да все это туфта, выеденного яйца не стоит. В общем чушь собачья. На мониторе тему уже сплавили в мусорку, а здесь треп еще будет на 10 страницах. Все камеры, их у него было три, исправные. Записывают отлично. А дальше вся проблема в этом.
Особо интересно - монтажник видео.
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.