Hello everyone,
?t's late and I got a serious headache trying to solve this.
basically I tried to optimize my code a bit by getting rid of a switch statement.
When like this, the whole program works perfectly:
(the led array contains bytes)
ISR(TIMER1_COMPA_vect) {
if (BAM_Counter == 1){
BAM_Bit++;}
else if (BAM_Counter == 2){
BAM_Bit++;}
else if (BAM_Counter ==4){
BAM_Bit++;}
else if (BAM_Counter ==8){
BAM_Bit++;}
else if (BAM_Counter ==16){
BAM_Bit = 0;
BAM_Counter = 0;}BAM_Counter++;
switch (BAM_Bit) {
case 0 :
for (int col =0; col <9; col++) {PORTD_CATHODES = 0;
PORTB_CATHODES = 0;
ANODE =0;
for (int row =0; row <9; row++) {if (led[col][row] >> 0 & 1) {
ANODE = pgm_read_byte(&(PIN[col]));
if (row < col && row <5) {
PORTD_CATHODES = PORTD_CATHODES | pgm_read_byte(&(PIN[row]));
}
else if (row < col && row >= 5) {
PORTB_CATHODES = PORTB_CATHODES | pgm_read_byte(&(PIN[row]));
}
else if (row >= col && row <4) {
PORTD_CATHODES = PORTD_CATHODES | pgm_read_byte(&(PIN[row+1]));
}
else if (row >= col && row >= 5) {
PORTB_CATHODES = PORTB_CATHODES | pgm_read_byte(&(PIN[row+1]));
}
}
}if (col < 5) {
DDRD = (DDRD & 3) | (PORTD_CATHODES & B11111100) | ANODE;
PORTD = ANODE;}
else {
DDRB = PORTB_CATHODES | ANODE;
PORTB = ANODE;}
}
break;case 1 :
for (int col =0; col <9; col++) {PORTD_CATHODES = 0;
PORTB_CATHODES = 0;
ANODE =0;
for (int row =0; row <9; row++) {if (led[col][row] >> 1 & 1) {
ANODE = pgm_read_byte(&(PIN[col]));
if (row < col && row <5) {
PORTD_CATHODES = PORTD_CATHODES | pgm_read_byte(&(PIN[row]));
}
else if (row < col && row >= 5) {
PORTB_CATHODES = PORTB_CATHODES | pgm_read_byte(&(PIN[row]));
}
else if (row >= col && row <4) {
PORTD_CATHODES = PORTD_CATHODES | pgm_read_byte(&(PIN[row+1]));
}
else if (row >= col && row >= 5) {
PORTB_CATHODES = PORTB_CATHODES | pgm_read_byte(&(PIN[row+1]));
}
}
}if (col < 5) {
DDRD = (DDRD & 3) | (PORTD_CATHODES & B11111100) | ANODE;
PORTD = ANODE;}
else {
DDRB = PORTB_CATHODES | ANODE;
PORTB = ANODE;}
}
break;case 2 :
for (int col =0; col <9; col++) {PORTD_CATHODES = 0;
PORTB_CATHODES = 0;
ANODE =0;
for (int row =0; row <9; row++) {if (led[col][row] >> 2 & 1) {
ANODE = pgm_read_byte(&(PIN[col]));
if (row < col && row <5) {
PORTD_CATHODES = PORTD_CATHODES | pgm_read_byte(&(PIN[row]));
}
else if (row < col && row >= 5) {
PORTB_CATHODES = PORTB_CATHODES | pgm_read_byte(&(PIN[row]));
}
else if (row >= col && row <4) {
PORTD_CATHODES = PORTD_CATHODES | pgm_read_byte(&(PIN[row+1]));
}
else if (row >= col && row >= 5) {
PORTB_CATHODES = PORTB_CATHODES | pgm_read_byte(&(PIN[row+1]));
}
}
}if (col < 5) {
DDRD = (DDRD & 3) | (PORTD_CATHODES & B11111100) | ANODE;
PORTD = ANODE;}
else {
DDRB = PORTB_CATHODES | ANODE;
PORTB = ANODE;}
}
break;case 3 :
for (int col =0; col <9; col++) {PORTD_CATHODES = 0;
PORTB_CATHODES = 0;
ANODE =0;
for (int row =0; row <9; row++) {if (led[col][row] >> 3 & 1) {
ANODE = pgm_read_byte(&(PIN[col]));
if (row < col && row <5) {
PORTD_CATHODES = PORTD_CATHODES | pgm_read_byte(&(PIN[row]));
}
else if (row < col && row >= 5) {
PORTB_CATHODES = PORTB_CATHODES | pgm_read_byte(&(PIN[row]));
}
else if (row >= col && row <4) {
PORTD_CATHODES = PORTD_CATHODES | pgm_read_byte(&(PIN[row+1]));
}
else if (row >= col && row >= 5) {
PORTB_CATHODES = PORTB_CATHODES | pgm_read_byte(&(PIN[row+1]));
}
}
}if (col < 5) {
DDRD = (DDRD & 3) | (PORTD_CATHODES & B11111100) | ANODE;
PORTD = ANODE;}
else {
DDRB = PORTB_CATHODES | ANODE;
PORTB = ANODE;}
}
break;case 4 :
etc...
but when I change it to
ISR(TIMER1_COMPA_vect) {
if (BAM_Counter == 1){
BAM_Bit++;}
else if (BAM_Counter == 2){
BAM_Bit++;}
else if (BAM_Counter ==4){
BAM_Bit++;}
else if (BAM_Counter ==8){
BAM_Bit++;}
else if (BAM_Counter ==16){
BAM_Bit = 0;
BAM_Counter = 0;}BAM_Counter++;
for (int col =0; col <9; col++) {
PORTD_CATHODES = 0;
PORTB_CATHODES = 0;
ANODE =0;
for (int row =0; row <9; row++) {if (led[col][row] >> BAM_Bit & 1) {
ANODE = pgm_read_byte(&(PIN[col]));
if (row < col && row <5) {
PORTD_CATHODES = PORTD_CATHODES | pgm_read_byte(&(PIN[row]));
}
else if (row < col && row >= 5) {
PORTB_CATHODES = PORTB_CATHODES | pgm_read_byte(&(PIN[row]));
}
else if (row >= col && row <4) {
PORTD_CATHODES = PORTD_CATHODES | pgm_read_byte(&(PIN[row+1]));
}
else if (row >= col && row >= 5) {
PORTB_CATHODES = PORTB_CATHODES | pgm_read_byte(&(PIN[row+1]));
}
}
}if (col < 5) {
DDRD = (DDRD & 3) | (PORTD_CATHODES & B11111100) | ANODE;
PORTD = ANODE;}
else {
DDRB = PORTB_CATHODES | ANODE;
PORTB = ANODE;}
}}
it doesn't work. Any thoughts?
Thanks in advance.