Прошил без ошибок контроллер ATmega328p - до этого раза он прошивался нормально. Всё отлично работало. Считывалось. В этот раз прошил - программа на контроллере работает, но не считывается. Во время проверки сигнатуры считывается 00 01 02. Если отключить проверку сигнатуры - значения считанных байт представляют собой счётчик.
Программатор AVR ISP. Прорамма - avrdude. Компилятор AVR Studio.
Фьюзы не трогал. Проверил плату под лупой - никаких лишних предметов не обнаружил.
Купил вторую ATmega328p. Прошил той же прошивкой. И та же песня. Попробовал сделать следующее - отпаял RESET от разъёма программатора и припаял к земле. Теперь проявился такой эффект - когда включаю программатор - микросхема даёт один раз себя прочитать. Читает правильно. На второй попытке выдаёт 00 01 02. Схема запитывается от программатора. Если его выключить и включить (т. е. временно обесточить всё это дело), то контроллер снова даёт сделать одну операцию чтения.
Кто знает - что за хрень?
вот код прошивки:
Код: Выделить всё
#include <avr/interrupt.h>
int main()
{
// выключаю предделитель таймера
CLKPR = 0x80; // 1 << 7;
CLKPR = 0;
// настройка портов
DDRC = 0b11111111;
// -
// ^ Reset
// ^ CS (SPI)
// ^ PC4
// ^ PC3
// ^ PC2
// ^ PC1
// ^ ADC0
//
PORTC = 0;
DDRD = 0xFF;
PORTD = 0;
// настройка SPI
DDRB = 0b11101111;
// ^ PB0
// ^ PB1
// ^ PB2
// ^ MOSI
// ^ MISO
// ^ SCK
// ^ PB6
// ^ PB7
PORTB= 0;
SPCR = 0b01010000; // регистр настройки
// ^ включить прерывания SPI
// ^ включить SPI
// ^ порядок бит: 1 - старший бит идёт первым, 0 - младший бит идёт первым
// ^ master/slave (ведущий/ведомый)
// ^ CPOL - полярность SCK (режим SPI, версия) - надо 0
// ^ CPHA - фаза SCK, надо 0
// ^^ младшая часть делителя скорости - надо 00
SPSR = 0b00000001; // регистр состояния
// ^ - старшая часть делителя скорости - надо 1 - это 0,5 часть основной частоты
// ^ флаг прерывания SPIF
// ^ флаг возникновения коллизии
// ШИМ0
TCCR0A = 0;
TCCR0B = 0b00000001; // без делителя
// ^ толи 1 толи 0 - непонятно
TCCR0A = 0b01010000;
OCR0A = 64; // скважность А
OCR0B = 192; // скважность Б
// главный таймер (10 раз в секунду)
TCCR1A = 0b00000000;
TCCR1B = 0b00001100;
TCCR1C = 0;
OCR1A = 3125; // 10Hz
OCR1B = 5*3125; // 2Hz
TIMSK1 = 0b00000110;
// разрешаю прерывания
SREG |= (1 << 7);
while(1)
{
}
}
ISR(TIMER1_COMPA_vect)
{
PORTD ^= 1;
}
ISR(TIMER1_COMPB_vect)
{
PORTD ^= 2;
}



