Jump to content

chert2008

Members
  • Posts

    4
  • Joined

  • Last visited

Информация

  • Город
    Москва

Электроника

  • Стаж в электронике
    3-5 лет
  • Сфера радиоэлектроники
    Микроконтроллеры

chert2008's Achievements

Newbie

Newbie (1/14)

  • Week One Done
  • Dedicated Rare

Recent Badges

0

Reputation

  1. Огромнейшее спасибо за советы. Буду тестить дальше. За две недели мучений это большой прорыв для меня.
  2. Сделал так и потестил. Ошибок больше небыло. Раньше было так.. Когда передача заканчивалась ножка опускалась и сразу же вскакивала обратно (синий канал). Сейчас такого не произошло за час ни разу. Отсюда вопрос как это вообще получается?
  3. Попробую так сделать. Ошибки нет число уже само по себе инвертировано.
  4. ISR(USART_TX_vect) // прерывание по завершению отправки { cli(); if (bufferIndexOut <= 13) { UDR0 = inString[bufferIndexOut]; bufferIndexOut++; // Увеличиваем индекс } else if (bufferIndexOut > 13) // Вывели весь буффер? { PORTD &= ~0b00000100; // Поднимаем ножку направления PD2 по прерыванию начала отправки данных bufferIndexOut = 0; UCSR0B &= ~(1 << TXCIE0); UCSR0B |= (1 << RXCIE0); } sei(); } ISR(USART_RX_vect) // прерыванию по окончанию приема модуля USART { cli(); inchar = UDR0; if (inchar == 0x2A) bufferIndexIn = 0; if (bufferIndexIn < 14) { inString[bufferIndexIn] = inchar; bufferIndexIn++; } if (bufferIndexIn > 13) // весь буффер? { bufferIndexIn = 0; // Сбрасываем индекс массива bufferIndexOut = 0; // Сбрасываем индекс массива UCSR0B &= ~(1 << RXCIE0); UCSR0B |= (1 << TXCIE0); PORTD |= 0b00000100; // Поднимаем ножку направления PD2 по прерыванию начала отправки данных UDR0 = inString[bufferIndexOut]; bufferIndexOut++; } sei(); } int main() { while(1) { out(outs); } } void out(uint16_t x) { PORTD |= 0xC0; // OE1,2 disable DDRB = 0b00001111; // portB out DDRC = 0b00011111; // portC out PORTB = (PORTB & 0xF0) | (uint8_t)(x & 0x000F); // 1nd 4bit write PORTC = (PORTC & 0xF0) | (uint8_t)((x & 0x00F0) >> 4); // 2nd 4bit write PORTD |= 0x10; // CLK1 OUT ENABLE PORTD &= 0xEF; // CLK1 OUT DISABLE PORTB = (PORTB & 0xF0) | (uint8_t)((x & 0x0F00) >> 8); // 3nd 4bit write PORTC = (PORTC & 0xF0) | (uint8_t)((x & 0xF000) >> 12); // 4nd 4bit write PORTD |= 0x20; // CLK2 OUT ENABLE PORTD &= 0xDF; // CLK2 OUT DISABLE DDRB = 0b00000000; // portB IN DDRC = 0b00010000; // portC IN } Контроллер связан с компьютером через rs485. Со связью вроде разобрались все работает. Но как только подключаем функцию out(outs); все рушится. Ножка направления передачи PD2 начинает жить своей жизнью. И здесь мне совсем уж непонятно что не так и какой участок кода дергает ножку.
×
×
  • Create New...