74HC575 a multiplex na atmega
Napsal: 08 pro 2013, 19:45
Zdravím, mám takový problém, dělám program pro multiplexování BCD displeje pomocí shift registru 595, program jako takový pro posílání stringu a pouštění potřebných bitů na výstup se zdá že funguje dobře, ale když chci přepínat anody pomocí funkce switch case, tak proběhne nejspíš jen první case a druhý už ne a nevím si s tím vůbec rady, kde může být chyba. Na ukázku sem vybral část kódu a zapojení v ISIS, kde by správně mělo být **56, ale je jen ***6 (adresování zjednodušeno jen na dvě poslední cifry).
Kód: Vybrat vše
int i=3456;
unsigned char znaky [10] = {
0b00000011, //0
0b10011111, //1
0b00100101, //2
0b00001101, //3
0b10011001, //4
0b01101001, //5
0b01000001, //6
0b00011111, //7
0b00000001, //8
0b00001001 }; //9
unsigned char anody [4] = {
0b0001, //0 - 4.digit
0b0010, //1 - 3.digit
0b0100, //2 - 2.digit
0b1000 }; //3 - 1.digit
ISR(TIMER0_OVF_vect)
{
tisice=i/1000; // 4-cif. cislo rozsekej na cifry
pom=i%1000;
stovky=pom/100;
pom=pom%100;
desitky=pom/10;
jednotky=pom%10;
switch (cyklus) {
case 0:
data_k_odeslani= (znaky[jednotky]<<4) | anody[0]; // sluč registry pro katody a anody
while(pocet_odeslanych < 12) //posilam 12 bitu
{ PORTC=PORTC&0b11111110; //hodiny do nuly
if(data_k_odeslani & 0x01) PORTC=PORTC|0b00000010;
else PORTC=PORTC&0b11111101;
PORTC=PORTC|0b00000001; // hodiny do jednicky
data_k_odeslani>>=1; //posun data o bit doprava
pocet_odeslanych++;
}
PORTC=PORTC|0b00000100; // pusť data na paralelní výstupy
asm("nop");
PORTC=PORTC&0b11111011; // výstupy uzavři
cyklus=1;
break;
case 1:
data_k_odeslani= (znaky[desitky]<<4) | anody[1]; // sluč registry pro katody a anody
while(pocet_odeslanych < 12) //posilam 12 bitu
{ PORTC=PORTC&0b11111110; //hodiny do nuly
if(data_k_odeslani & 0x01) PORTC=PORTC|0b00000010;
else PORTC=PORTC&0b11111101;
PORTC=PORTC|0b00000001; // hodiny do jednicky
data_k_odeslani>>=1; //posun data o bit doprava
pocet_odeslanych++;
}
PORTC=PORTC|0b00000100; // vpusť data na paralelní výstupy
asm("nop");
PORTC=PORTC&0b11111011; // výstupyuzavři
cyklus=0;
break;
} // konec switch
TCNT0=217;
}