Страница 1 из 1

Микроконтроллер(mega8) ТУПИТ

Добавлено: Чт фев 05, 2015 16:15:11
KaiTheKat
Устройство в котором задействованы (UART, SPI и таймер (Mode: CTC, OC1A output: Toggle, 38Кгц). USART и SPI работают сами по себе, никому не мешают, но если перед включением МК на ножку OC1A (PB1) подать резистор (см. изображение) МК тупо перестает работать. Если сначала включить МК, потом подключить резистор, то он несколько сек работает и все. Не важно плюс транзистора подключен к питании или нет, также тупит. Так происходит, только если резистор подключить к OC1A (PB1) или OC1B (PB2). При подачи резистора к остальным ножкам все работает нормально. Кто нибудь сталкивался с похожей проблемой?

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Toggle
// 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=(1<<COM1A0);
TCCR1B=(1<<WGM12)|(1<<CS10);
ICR1H=0x00;
ICR1L=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1A=12;
OCR1B=0x00;

//SPE: SPI Enable
//MSTR: Master
//SPR1, SPR0: fclk/128
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 2400
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=25;

DDRD=255;
PORTD=0;

DDRB=0b11111111;
PORTB=0b00000000;

Изображение

Re: Микроконтроллер(mega8) ТУПИТ

Добавлено: Чт фев 05, 2015 16:42:00
dr.doc
Непропай положительной шины питания, высокий уровень нагрузки на порт. У меня было подобное: контроллер шился, получая через диоды на входах паразитное питание, но не работал. До тех пор, пока не пропаял земляной вывод. У Вас, похоже, нет +5 вольт.

Re: Микроконтроллер(mega8) ТУПИТ

Добавлено: Чт фев 05, 2015 16:53:37
KaiTheKat
Не совсем понял. Что значит "пропаял земляной вывод"?
У меня МК работает, если не подключать резистор к OC1A (OC1B). UART, SPI - все передает, принимает. Вот только, когда подключаешь резистор к OC1A (OC1B) МК перестает работать (UART, SPI перестает передавать-принимать).

Re: Микроконтроллер(mega8) ТУПИТ

Добавлено: Чт фев 05, 2015 17:20:35
Morroc
МК может работать с неподключенным к ноге питания собственно питанием, но при этом имеются глюки типа как у вас.

Re: Микроконтроллер(mega8) ТУПИТ

Добавлено: Чт фев 05, 2015 17:29:35
KaiTheKat
У меня ноги питания МК подключены всегда, и при прошивки подключал.

Re: Микроконтроллер(mega8) ТУПИТ

Добавлено: Чт фев 05, 2015 19:15:10
KaiTheKat
Попробовал убрать из кода (инициализацию и работу SPI). При выключенном SPI все прекрасно работает. Подключение резистора к OC1A, не приводит к остановке МК, UART данные передает. Кто-нибудь знает, может одновременная работа SPI и таймера (Mode: CTC, OC1A output: Toggle) запрещена?

Re: Микроконтроллер(mega8) ТУПИТ

Добавлено: Чт фев 05, 2015 19:20:43
Alkul
KaiTheKat писал(а):Кто-нибудь знает, может одновременная работа SPI и таймера (Mode: CTC, OC1A output: Toggle) запрещена?
Такого точно нет. Они работают независимо друг от друга. По-крайней мере, с точки зрения программы это именно так.

Re: Микроконтроллер(mega8) ТУПИТ

Добавлено: Чт фев 05, 2015 22:26:15
KaiTheKat
В общем по экспериментировал я, и вот, что выяснил:
Если просто инициализировать SPI, все работает SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);
МК у меня оказывается всегда работает, только если на OC1A подать резистор он зацикливается тут:
SPDR=120;
while(!(SPSR&(1<<SPIF)));

При подключенном резисторе дальше цикла не идет, при отключенном идет дальше цикла.

Вот полный код:

unsigned char data=0;
while(1) {
_delay_ms(10); //пауза 10 мс
SPDR=120; // передаем 120 по SPI
while(!(SPSR&(1<<SPIF))); // Ожидание окончания передачи SPI
data=SPDR; // в data записываем из SPI
while(!(UCSRA&(1<<UDRE))); // готовность uart
UDR=data; ..передача по uart
}