это желтеньким чего такое?
Если я правильно понял - то это кажись резюки...?
И ещё... каким программатором шили?
Спасибо.

теперь перебираем значения в нашем массиве яркостей
Навскидку - тактовая 8 МГц, таймер 8 бит, итого, при предделителе =1 он переполнится 8000000/256=31250 раз в секунду. Многовато.
Ставим делитель 8. 8000000/(8*256) = 3906 раз в секунду. Почти то , что надо. На этом и остановимся.
Код: Выделить всё
TCNT0=0b00000000;
TCCR0=0b00000100;Теперь заводим себе массивчик двумерный по размеру нашей матрички светодиодов. В этот массив в основной программе будем писать состояния нужные наших светодиодов - яркость кажого светодиода - от 0 до 4. 0 - не горит, 4 - горит с максимальной яркочтью.
счетчик фаз яркости
Код: Выделить всё
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
faza++; if (faza > 10) {
faza = 0;
}
}теперь перебираем значения в нашем массиве яркостей для выбранной линии.
И сравниваем значение в массиве со значением счетчика фаз. Если они равны = выводим на соответствующую линию потра В нолик. Остальные биты порта В не трогаем!
Теперь уменьшаем счетчик фаз на 1 - и выходим из прерывания.


Код: Выделить всё
if (Phase==0) {
PORTB = 0x3F;
PORTA = 0;
Lines++;
if (Lines>5) Lines = 0;
Phase = 4;
PORTA = 1 << Lines; //выводим 1 на линию порта А, соответствующую счетчику линий.
}
Код: Выделить всё
unsigned char i;
for (i=0; i<6; i++) {
if (LedsLevels[Lines][i]==Phase) PORTB &= ~(1<<i);//выводим на соответствующую линию потра В нолик
}
Phase--;
Код: Выделить всё
TCCR1A = ( 0 << WGM11 ) | ( 0 << WGM10 );
TCCR1B = ( 0 << WGM13 ) | ( 1 << WGM12 ) | ( 0 << CS12 ) | ( 0 << CS11 ) | ( 1 << CS10 );
OCR1A = F_CPU/1000 - 1;
TIMSK |= ( 1 << OCIE1A );
Код: Выделить всё
if (Phase == 0 ){
Phase = 4; // 4 уровня яркости
// гасим все 10 светодиодов
PORTC=0;
PORTD=0;
}
// а теперь перебираем ваши яркости в массиве.
// я тут напишу линейный код, если у вас будет желание обернуть это хозяйство в цикл или еще как сократить/алгоритмизировать - не буду возражать
if (Leds[0] == Phase) PORTD |= (1 << 0);
if (Leds[1] == Phase) PORTD |= (1 << 1);
if (Leds[2] == Phase) PORTD |= (1 << 2);
if (Leds[3] == Phase) PORTD |= (1 << 3);
if (Leds[4] == Phase) PORTD |= (1 << 4);
if (Leds[5] == Phase) PORTD |= (1 << 5);
if (Leds[6] == Phase) PORTD |= (1 << 6);
if (Leds[7] == Phase) PORTD |= (1 << 7);
if (Leds[8] == Phase) PORTC |= (1 << 1);
if (Leds[9] == Phase) PORTC |= (1 << 0);
if (Leds[10] == Phase) PORTC |= (1 << 5);
Phase --;
все пишут в авр студио и используют библиотеки....
что это означаетOCR1A = F_CPU/1000 - 1;
Код: Выделить всё
OCR1A = F_CPU/1000 - 1;заводим массив яркостей для 11 светодиодов
volatile unsigned char Leds[11];
теперь перебираем значения в нашем массиве яркостей для выбранной линии.
И сравниваем значение в массиве со значением счетчика фаз. Если они равны = выводим на соответствующую линию потра В нолик. Остальные биты порта В не трогаем!
Теперь уменьшаем счетчик фаз на 1 - и выходим из прерывания.
Код: Выделить всё
/*******************************************************
This program was created by the
CodeWizardAVR V3.10 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 16.12.2018
Author :
Company :
Comments:
Chip type : ATmega168P
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*******************************************************/
#include <mega168.h>
#include <delay.h>
volatile unsigned int f=400, // время кадра
h=5, // число повторов эффекта
z=1000; // ms для паузы после эффекта
volatile unsigned char Phase=0, Lines = 0;
// Declare your global variables here
//unsigned char A[5][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
//unsigned char B[5][4] = {{0,0,0,1},{0,0,0,1},{0,0,0,1},{0,0,0,1},{0,0,0,1}};
// unsigned char C[5][4] = {{2,0,2,0},{2,0,2,0},{2,0,2,0},{2,0,2,0},{2,0,2,0}};
// unsigned char D[5][4] = {{3,0,3,0},{3,0,3,0},{3,0,3,0},{3,0,3,0},{3,0,3,0}};
// unsigned char E[5][4] = {{0,4,0,0},{0,4,0,0},{0,4,0,0},{0,4,0,0},{0,4,0,0}};
// unsigned char F[5][4] = {{0,4,0,0},{0,4,0,0},{0,4,0,0},{0,4,0,0},{0,4,0,0}};
// unsigned char G[5][4] = {{3,0,3,0},{3,0,3,0},{3,0,3,0},{3,0,3,0},{3,0,3,0}};
// unsigned char H[5][4] = {{2,0,2,0},{2,0,2,0},{2,0,2,0},{2,0,2,0},{2,0,2,0}};
// unsigned char I[5][4] = {{0,0,0,1},{0,0,0,1},{0,0,0,1},{0,0,0,1},{0,0,0,1}};
// unsigned char J[5][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
flash char flasher_0[200] =
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,
2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,
3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,
0,4,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,4,0,0,
0,4,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,4,0,0,
3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,
2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,
0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
flash char flasher_1[200] =
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,
0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,
0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,
0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,
0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,
0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,
0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,4,
0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,4
};
flash char flasher_2[200] =
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
};
volatile flash char *u;
volatile char a;
// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
unsigned char i;
if (Phase==0) {
PORTD = 0x3F;
PORTC = 0;
Lines++;
if (Lines>5) Lines = 0;
Phase = 4;
PORTC = 1 << Lines; //выводим 1 на линию порта А, соответствующую счетчику линий.
}
for (i=0; i<4; i++) {
//if (LedsLevels[Lines][i]==Phase) PORTD &= ~(1<<i);//выводим на соответствующую линию потра В нолик
a = *(u+Lines*4+i);
if (a==Phase) PORTD &= ~(1<<i);//выводим на соответствующую линию потра В нолик
}
Phase--;
}
void view_pauza(void) {
delay_ms(z);
}
void view_flasher_0(void) {
int i,j;
for (j =0; j<h;++j){
for (i =0; i<9;++i){
u = &(flasher_0[i*20]);
delay_ms(f);
}
}
view_pauza();
}
void view_flasher_1(void) {
int i,j;
for (j =0; j<h;++j){
for (i =0; i<9;++i){
u = &(flasher_1[i*20]);
delay_ms(f);
}
}
view_pauza();
}
void view_flasher_2(void) {
int i,j;
for (j =0; j<h;++j){
for (i =0; i<9;++i){
u = &(flasher_2[i*20]);
delay_ms(f);
}
}
view_pauza();
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit6=In Bit5=In Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRC=(0<<DDC6) | (0<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
// State: Bit6=T Bit5=T Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
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: 500,000 kHz
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
// Timer Period: 0,512 ms
ASSR=(0<<EXCLK) | (0<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20);
TCCR2B=(0<<WGM22) | (0<<CS22) | (1<<CS21) | (1<<CS20);
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (1<<TOIE2);
// 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=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT1) | (0<<INT0);
PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
// USART initialization
// USART disabled
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR1=(0<<AIN0D) | (0<<AIN1D);
// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
view_flasher_0();
view_flasher_1();
view_flasher_2();
}
}
заводим массив яркостей для 11 светодиодов
volatile unsigned char Leds[11];
Код: Выделить всё
if (Phase == 0 ){
Phase = 4; // 4 уровня яркости
// гасим все 10 светодиодов
PORTC=0;
PORTD=0;
}
// а теперь перебираем ваши яркости в массиве.
// я тут напишу линейный код, если у вас будет желание обернуть это хозяйство в цикл или еще как сократить/алгоритмизировать - не буду возражать
if (Leds[0] == Phase) PORTD |= (1 << 0);
if (Leds[1] == Phase) PORTD |= (1 << 1);
if (Leds[2] == Phase) PORTD |= (1 << 2);
if (Leds[3] == Phase) PORTD |= (1 << 3);
if (Leds[4] == Phase) PORTD |= (1 << 4);
if (Leds[5] == Phase) PORTD |= (1 << 5);
if (Leds[6] == Phase) PORTD |= (1 << 6);
if (Leds[7] == Phase) PORTD |= (1 << 7);
if (Leds[8] == Phase) PORTC |= (1 << 1);
if (Leds[9] == Phase) PORTC |= (1 << 0);
if (Leds[10] == Phase) PORTC |= (1 << 5);
Phase --;Код: Выделить всё
#include <mega8.h>
#include <delay.h>
unsigned char Leds[10];
volatile unsigned char Phase = 0;// счетчик фаз <---------- должен стартовать с 0
// _______
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
if (Phase == 0 ){
Phase = 4; // 4 уровня яркости
PORTC=0; // гасим все 10 светодиодов
PORTD=0;
}
if (Leds[0] == Phase) PORTD |= (1 << 0);
if (Leds[1] == Phase) PORTD |= (1 << 1);
if (Leds[2] == Phase) PORTD |= (1 << 2);
if (Leds[3] == Phase) PORTD |= (1 << 3);
if (Leds[4] == Phase) PORTD |= (1 << 4);
if (Leds[5] == Phase) PORTD |= (1 << 5);
if (Leds[6] == Phase) PORTD |= (1 << 6);
if (Leds[7] == Phase) PORTD |= (1 << 7);
if (Leds[8] == Phase) PORTC |= (1 << 1);
if (Leds[9] == Phase) PORTC |= (1 << 0);
Phase --;
}
//=================== main ==========
//основаня функция
void main(void){
//настройка портов
PORTB=0b00000000;
DDRB=0b00000000;
PORTC=0b00000000; //порт С 4 первые по умолчанию 1
DDRC=0b00000011; //порт С 4 первые ноги на вывод
PORTD=0b00000000; //порт D по умолчанию все ноги на 0
DDRD=0b11111111; //порт D все ноги на вывод
TCCR0 = 0;
TIMSK |= 0b00000001;
TCCR0 |= (0<<CS02)|(1<<CS01)|(0<<CS00);
#asm("sei") // Глобальные прерывания включения
// заполним Ледс значениями стартовыми
unsigned char i;
for (i=0; i<10; i++) Leds[i] = i % 5; // массив заполнится значениями 0,1,2,3,4,0,1,2,3,4
// ---------- рабочая часть ----------
while (1) {
// а теперь будем двигать массив по кругу с какой то задержкой
unsigned char buf = Leds[9];
for (i=9; i>0; i--) Leds[i] = Leds[i-1];
Leds[0] = buf;
// и задержка
delay_ms(200);
}; // ---------- рабочая часть (end) ----------
} // ================= end main ======
//
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- The End -=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//