токо при компиляции вылезли ошибки, я в личку отписался
токо при компиляции вылезли ошибки, я в личку отписался
at90usb162 or at90usb82vitalik_1984 писал(а):И какую сигнатуру показывает? если не совпадает с must be: ,то значит не читает.возможно короткое замыкание между ногами мисо моси.
Код: Выделить всё
/
void main(void)
{
// Declare your local variables here
char rxdata=0;
char i;
char j;
char p;
char xor=0;
char len;
char BUFFER_ADR=0;
xyu:
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTB=0x01;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTC=0x00;
DDRC=0x00;
DDRC.0=1;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=In
// State7=P State6=P State5=P State4=1 State3=1 State2=1 State1=1 State0=T
PORTD=0xEE;
DDRD=0x1E;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=
while (1)
{
PORTC.4=0;
PORTD.2=0;
PORTD.3=0;
while (!(PINB & (0x01)))
{
for (j=1;j<4;j++) //3 попытки связи
{
#asm("cli") //запр прерываний
delay_ms(300); //
UCSR0B &= ~(1<<3); //TxD als normalen Port schalten
PORTD.1=0; //TxD aus Low
delay_ms(25); //задержка
PORTD.1=1; //TxD auf High
UCSR0B |= (1<<3); //TxD wieder aktivieren
delay_ms(25);
UCSR0B &= ~(1<<4); // выкл-вкл приема (очистка буфера)
UCSR0B |= (1<<4); //
#asm("sei") //разреш прерываний
for (i=1;i<4;i++) //3 повтора команды
{
PORTD.2=1;
putchar (0xF4); // команда 21
putchar (0x03);
putchar (0x21);
putchar (0x3b);
putchar (0xed);
PORTD.2=0;
PORTD.3=1;
while ((rx_counter0)&&(BUFFER_ADR==0)) //пока счетчик буфера приема не пуст и адрес
{ //буфера команд равен 0
PORTD.3=0;
rxdata = getchar(); //принимаем байты
if (rxdata==0x4f) //если принят ответ
{
rx_buffer[BUFFER_ADR]=rxdata; //сохраняем в буфере команды
xor=rxdata; //начинаем считать ксумму
BUFFER_ADR++; //инкрементируем адрес буфера команд
}
}
if (BUFFER_ADR) break; //если принят ответ покидаем цикл повтора команд
delay_ms(1250); //иначе задежка
}
if (BUFFER_ADR) break; //если принят ответ покидаем цикл повтора попыток уст связи.
}
while (BUFFER_ADR==0) //если ничего не получено
{
for(i=1;i<10;i++)
{
PORTD.2=1; //сигнализируем миганием 0,5сек
delay_ms (250);
PORTD.2=0;
delay_ms (250);
}
goto xyu;
}
rx_buffer[BUFFER_ADR]=getchar(); //принимаем второй байт (длина команды)
len=rx_buffer[BUFFER_ADR]; //сохраняем
xor=xor^rx_buffer[BUFFER_ADR]; //счтаем ксумму
BUFFER_ADR++; //инкрементируем адрес буфера команд
for (p=1;p<len;p++) //принимаем следующие len-1 байт
{
rx_buffer[BUFFER_ADR]=getchar();
xor=xor^rx_buffer[BUFFER_ADR];
BUFFER_ADR++;
}
rx_buffer[BUFFER_ADR]=getchar(); //принимаем байт ксуммы
//if (xor==0xd6){PORTC.0=0;}
if (xor!=rx_buffer[BUFFER_ADR]) //если суммы не совпадают
{
for (j=1;j<20;j++)
{
PORTD.2=1; //сигнализируем миганием 0,1сек
delay_ms (100);
PORTD.2=0;
delay_ms (100);
}
BUFFER_ADR=0;
goto xyu;
}
PORTC.0=1;
while (!(PINB & (0x01)))
{
putchar (0xF4); //пока есть питание
putchar (0x04);
putchar (0x44); //посылаем подтверждения каждые 15сек
putchar (0x21);
putchar (0x00);
putchar (0x95);
//PORTC.2=1;
PORTD.3=1; //сигнализируем миганием 15сек
delay_ms(250);
PORTD.3=0;
delay_ms(2000);
//PORTC.2=0;
while (rx_counter0) rxdata=getchar(); //очищаем буфер приема
}
//отключение
delay_ms(1000);
PORTD.2=1;
putchar (0xF4);
putchar (0x02);
putchar (0x10);
putchar (0xE6);
delay_ms(1000);
while (rx_counter0) rxdata=getchar(); //очищаем буфер приема
PORTD.3=1;
delay_ms(120000);
BUFFER_ADR=0;
PORTC.0=0;
}
}
}Код: Выделить всё
[spoiler][/spoiler]Код: Выделить всё
char xor=0; char len; char BUFFER_ADR=0; xyu: // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_S
Немножко не так. Использоваться они могут где угодно и сколько угодно. Другое дело - как. К примеру, читать их можно до бесконечности, при этом volatile не нужен. А вот если они могут быть модифицированы в прерываниях или при обращении к периферии (портам) - тут уж надо быть осторожным. Квалификатор volatile не позволит компилятору оптимизировать код с этой переменной на свое усмотрение. И не больше.vitalik_1984 писал(а):те глобальные переменные,что используются не в одном месте нужно объявлять как volatile.
Код: Выделить всё
// Reset Source checking
if (MCUCSR & 1) // Power-on Reset
MCUCSR=0;
// Place your code here }
else if (MCUCSR & 2) {
// External Reset
MCUCSR=0;
// Place your code here }
else if (MCUCSR & 4) {
// Brown-Out Reset
MCUCSR=0;
// Place your code here }
else {
// Watchdog Reset
MCUCSR=0;
// Place your code here }подразумевает, что если нет вышестоящих ресетов, то при включении питания стопроцентно выполнится код, вписанный как для сброса по причине сторожевого таймера.. Кто может объяснить, в чем тут смысл?else {
// Watchdog Reset
Каша - это работа код виззарда...а почему программа стопорится при приеме соответствующега байта? где я не углядел?vitalik_1984 писал(а):под спойлер то одно дело не понял,но нафига нам пустая инициализация типа portb=0x00;???
для справки спойлеры добавляются вручную пишемили тут копируем и сохраняем в блокноте.Код: Выделить всё
[spoiler][/spoiler]
а по делу пока заметил,что в коде каша- переменные вперемешку с функциями.
те глобальные переменные,что используются не в одном месте нужно объявлять как volatile.и что это у вас тут за матерные меткиКод: Выделить всё
char xor=0; char len; char BUFFER_ADR=0; xyu: // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_S
Видать потому, что никаких других причин для сброса в МК не существует...R_ura писал(а): Кто может объяснить, в чем тут смысл?
А засунуть на форум эту кашу это ваша работа!idadron писал(а):Каша - это работа код виззарда
например сделать массив и проверять пятый по счету элемент массива.idadron писал(а):Как мне написать чтобы программа отреагировала именно на этот XOR?
Код: Выделить всё
while ((rx_counter0)&&(BUFFER_ADR==0)) //пока счетчик буфера приема не пуст и адрес буфера команд равен 0
{
rxdata = getchar(); //принимаем байты
if (rxdata==0x4f) //если принят ответ
{
rx_buffer[BUFFER_ADR]=rxdata; //сохраняем в буфере команды
xor=rxdata; //начинаем считать ксумму
BUFFER_ADR++; //инкрементируем адрес буфера команд
}
}Код: Выделить всё
rx_buffer[BUFFER_ADR]=getchar(); //принимаем второй байт (длина команды)
len=rx_buffer[BUFFER_ADR]; //сохраняем
xor=xor^rx_buffer[BUFFER_ADR]; //счтаем ксумму
BUFFER_ADR++; //инкрементируем адрес буфера команд
for (p=1;p<len;p++) //принимаем следующие len-1 байт
{
rx_buffer[BUFFER_ADR]=getchar();
xor=xor^rx_buffer[BUFFER_ADR];
BUFFER_ADR++;
}
rx_buffer[BUFFER_ADR]=getchar(); //принимаем байт XOR
if (xor!=0xd6) //если XOR не совпадает с XOR ответа на командуВроде как програмно можно перепрыгнуть на Ресет..vitalik_1984 писал(а):
Видать потому, что никаких других причин для сброса в МК не существует...
Это в одном конкретном случае, а вообще это быдлокод какой то...idadron писал(а):работает
Код: Выделить всё
rx_buffer[BUFFER_ADR]=getchar(); //принимаем байт XOR
if (xor!=0xd6) //если XOR не совпадает с XOR ответа на команду Это никак не нужно обходить.Каждый флаг сброса устанавливается аппаратно и не снимается до отключения питания.R_ura писал(а):Все же не понял, как можно использовать эту, в общем-то полезную фичу, если при каждом включении питания она находит внешний ресет? Как это обойти?
Код: Выделить всё
else if (MCUCSR & 4) {
// Brown-Out Reset
MCUCSR=0; <<<<------------ВОТ ЭТУ СТРОЧКУ
// Place your code here } Код: Выделить всё
BUFFER_ADR=0;
while(rx_buffer[BUFFER_ADR]){rx_buffer[BUFFER_ADR]=0;}
Код: Выделить всё
void USART_Flush()
{
unsigned char dummy;
while ( UCSR0A & (1<<RXC0) ) dummy = UDR0;
} Код: Выделить всё
USART_Flush();K-LINE detectedidadron писал(а):Помогите пожалуйста решить задачу с UART. Посылает то, что нужно. Но когда приходит нужный ответ - все рубится и дальше ничего не происходит...Уже голову сломал, а причина наверняка банальная...Код: Выделить всё
#asm("cli") //запр прерываний delay_ms(300); // UCSR0B &= ~(1<<3); //TxD als normalen Port schalten PORTD.1=0; //TxD aus Low delay_ms(25); //задержка PORTD.1=1; //TxD auf High UCSR0B |= (1<<3); //TxD wieder aktivieren delay_ms(25); }
Правильнее будет определить макрос. Экономия места, стека данных и времени выполнения.Dimon4ir писал(а):Помогите сделать функцию. Есть участок программы ,часто повторяющийся, в котором меняется порт(PORTn), вывод порта, направление порта (т е DDRn) и необходимо считывать состояние порта(PINn), хотелось бы сделать функцию, но как сделать чтоб параметрами функции были регистры PORTn,DDRn и PINn сие большой вопрос есть?