контроллер я использую мегу168, могу выложить свой проект в KiCad'e, там схема и разводка.
в предыдущем сообщении где выкладывал скейч, вот он у меня все работает но только нет смещения бита, то есть данные шлются в q0...q6, а мне надо что бы данные шли в q1...q7
после исправления обработчика таймера:
Код:
SIGNAL(TIMER2_OVF_vect)
{
uint8_t PWM_Counter_v=PWM_Counter; // поскольку PWM_Counter объявлена как valotile, обращение к ней - всегда обращение в память. Поэтому создаем локальную копию, она бeдет храниться в регистре.
TCNT2 = TCNT2_Const;
uint8_t byte_shift;
uint8_t * CBright;
uint8_t nbit;
CBright = (uint8_t *)&Brightness[0];
uint8_t j=0;
for (j=6;j>0;j--)
{
PORTB |= (1<<PIN2); //формируем положительный импульс защелки
PORTB |= (1<<PIN2);
PORTB &= ~(1<<PIN2);
byte_shift = 0;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
while(!(SPSR & (1<<SPIF))); // Ожидание завершения передачи данных
SPDR = byte_shift; //отправляем в шину SPI
}
PWM_Counter++;
}
получил что на последнем 595-ом есть напряжения на всех выходах, а так же на передпоследнем 596-ом есть напряжение тока на q0 тоесть на 15 ножке