Citat:
korak: Greska na izlaznim pinovima mi je vidljiva, ali trebam da nadjem njen uzrok.
Upravo ovo ilustruje ono sto sam pricao gore. Prvo sto treba znati je od cega sve zavisi to sto se pojavljuje na pinovima. Da li vrednosti na tim pinovima zavise eventualno i od nekih ranijih ocitavanja koje je uC recimo pokupio sa nekog senzora ili ih je izracunao na osnovu nekih podataka koje mu je neki drugi cip poslao ili nesto trece.
Dalje je pitanje da li se te greske pojavljuju samo u pravom radu (realnom vremenu) ili i tokom simulacije/debugiranja?
Ako znas odgovore na ova pitanja onda mozes krenuti redom unatrag od tih problematicnih pinova (pinovi -> output registri -> funkcija koja je upisala vrednosti u output registre -> funkcija koja je izracunala sta treba da se upise -> vrednosti na osnovu kojih je obavljeno to izracunavanje -> ko je dostavio te vrednosti -> ko ih je ocitao -> ko ih je dogurao do ulaznih pinova -> ...itd...
Sad ispada da pricam trivijalne stvari, ali to sve navodim zbog toga sto u svakoj ovoj tacki taj BCD mozda moze da se iskoristi uz pomoc neke doskocice, ali se te doskocice sigurno razlikuju za svaku tu tacku.
Recimo prvi korak: Ti dakle znas kad se pojavi greska na izlaznim pinovima. Onda prepravi svoj softver tako da ako je moguce da se sav saobracaj na magistralama relevantan za ono sto ce se pojaviti na tim pinovima obavlja bas neposredno prije slanja na izlazne pinove. Na pocetku tih akcija stavi neki upis bilo cega na neku mem. lokaciju koja ce ti sluziti kao Tag i koja ce okinuti pocetak snimanja u FIFO. Neposredno iza instrukcije koja je poslala problematicne vrednosti na izlazni port stavi break point. Osim toga prepravi svoj program tako da i sve druge vrednosti koje igraju neku ulogu u svemu tome snimis prethodno u neki kutak memorije.
Kad se sva ta drama odigra imaces CPU zaustavljen neposredno poslije slanja problematicnih podataka. U FIFO ces imati sve sto se odigralo neposredno prije tog cina. Na svojim predvidjenim mjestima u memoriji imaces normalno sve vrednosti bitne za taj slucaj, a u onom udaljenom kutku u memoriji imaces netaknute prvobitne kopije svih tih vrednosti. I onda uporedjujes redom i gledas sta nije kako treba.
Ako vidis da su ispravne vrednosti upisane u izlazni registar onda je znaci problem van mikrokontrolera, ili ako vidis da su vec neispravni upisani u izlazni registar onda ispituj funkciju koja ih je upisala. Pa ako je i ta funkcija dobila neispravne podatke onda tempiraj sve oko onog dijela koda koji je to njoj proslijedio itd...
E sad, ako ti u principu ne znas kad ce da se javi ta greska, ali znas da prepoznas sta je greska, onda recimo povezes neki detektor na pinove (obican dekoder koji ce detektovati tu pogresnu kombinaciju i poslati interrupt mikrokontroleru). Zatim podesis FIFO da non stop snima, a break point postavis tacno na ulasku u prekidnu rutinu koja se pokrece ovim prekidom. Time ce CPU biti zaustavljen odmah poslije problematicnog trenutka, a u FIFO ces imati sta se neposredno prije toga odigravalo na magistralama. I onda u skladu sa onim prethodno recenim krenes u analizu.
Naravno, ovo pod pretpostavkom da sa FIFO od 8x16 bita imas dovoljno prostora da "obuhvatis" taj kriticni interval.
A ako nista od toga ne bi pomoglo, meni je sad npr. palo na pamet da koristis vise mikrokontrolera koji odjednom rade paralelno u istom kolu i jedan supervizorski koji ce da ih startuje sve istovremeno i da im daje ujednacen clock. Prvi podesis da snima FIFO od tacke A do B, drugi od B do C, treci od C do D....
Tako mozes prosiriti opseg tog snimanja, ali po cijenu znacajnih hardverskih vratolomija.
Ili ako je moguce da koncipiras svoj program tako da ne ovisi o tome sta se zbivalo ranije nego samo o trenutnim vrednostima na ulazu mikrokontrolera (recimo da sve varijable koje su ti bitne za rad programa ne drzis unutar mikrokontrolera nego na spoljnoj memoriji) onda mozes da imas dva mikrokontrolera paralelno od kojih uvijek jedan ocitavas dok onaj drugi radi, pa drugi ocitavas a prvi radi i tako u krug. Oba mikrokontrolera dijele tu zajednicku spoljnu memoriju tako da se obezbedjuje kontinuitet programa. U tom slucaju imas kontinualno logovanje u real-time modu. Isto zahtjeva petljancije sa hardverom i supervizorskim uC koji ce time da upravlja i da vrsi ocitavanja i snimanja tih podataka.
Ovo lako moze da se implementira ako ono okruzenje u kojem mikrokontroler radi nije narocito zahtjevno po brzini (sto obicno i jeste slucaj kad se radi o masinama). Onda koncipiras program tako da se ciklicno izvrsava jedna funkcija:
1) Ucitaj aktuelne vrednosti iz spoljne memorije
2) Obavi sta treba da se obavi
3) Snimi aktuelne vrednosti na spoljnu memoriju
4) Signaliziraj supervizorskom cipu da moze da zaustavi ovaj CPU i aktivira drugi
Dok je ovaj zaustavljen cita se njegov FIFO, pa se onda drugi zaustavi, a ovaj opet pokrene itd...
Moguce je da ova rjesenja nemogu imati nikakvu primjenu u tvom slucaju, ali navodim samo kao ilustraciju raznoraznih rjesenja, ali da bi se ova lupanja, iz kojih bi se mogla izroditi i neka primjenjivija ideja, konkretno usmjerila na tvoj slucaj trebalo bi nam nesto vise cinjenica.
Pozdrav.