Zaslal: ne prosinec 08 2013, 19:45 Předmět: 74HC575 a multiplex na atmega
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).
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
Nemá být počet odeslaných < 11 (pokud teda počítáme od nuly)?
No já bych se vsadil, že určitě ne, protože 0,1,2,3,4,5,6,7,8,9,10 určitě dohromady nedá 12...
Nechtěl jsem tu zbytečně spamovat celým kódem, tak jsem vybral podstatnou část a doufal že si zbytek každý domyslí, ale asi ne, tak tady pro pořádek celý kód. Uvnitř smyčky while bych problém neviděl, odeslání stringu se zdá že funguje, nefunguje však její ukončení a skočení na další case. Program sem se snažil nějak okomentovat.
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 & 1) PORTC=PORTC|0b00000010; // pokud vymaskovaný bit v proměné není roven nule, pošli jedničku do sériového výstupu
else PORTC=PORTC&0b11111101; // jinak pošli nulu
PORTC=PORTC|0b00000001; // hodiny do jednicky, povolení vstupu bitu 1 z předch.podm. na sériový výstup
data_k_odeslani>>=1; //posuň data o bit doprava
pocet_odeslanych++;
}
PORTC=PORTC|0b00000100; // pusť data na paralelní výstupy
asm("nop");
PORTC=PORTC&0b11111011; // výstupy uzavři
Založen: Nov 20, 2012 Příspěvky: 1453 Bydliště: Praha
Zaslal: po prosinec 09 2013, 18:32 Předmět:
zkus přeložit kód bez optimalizace nebo všechny proměnné, které se používají v obsluze přerušení, deklarovat jako volatile. Obecně by globální proměnné, které se používají v obsluze přerušení, měly být takto deklarovány. Jinak hrozí že se po návratu z obsluhy nezachová jejich hodnota.
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.