Stránka 1 z 2
Simulace běhu programu v MPLAB X IDE
Napsal: 28 čer 2018, 00:40
od nvenca
Na stará kolena začínám s programováním Mikrokontrolerů PIC. Pro začátek jsem se chytil Matouškovy knížky Mikrokontroléry PIC bez předchozích znalostí a dalšího dílu této knížky - pro pokročilé. Pořídil jsem PIC16F628A a PICkit3 (klon z ebay). Používám MPLAB X IDE v. 4.15 s překladačem XC8 v. 1.45. Pokud vyjdu z příkladů v knize lze to snadno pochopit a po editaci programu a odstranění chyb které ohlásí překladač proběhne vše v pořádku a program se přenese do PIC a vše běží. Menší úpravy programů rovněž. Když si ale vymyslím složitější verze s cykly, mám problém jak program odladit. Protože PICkit3 údajně umí debug pouze u PICů, které mají zabudovánu HW podporu, potřeboval bych krokovat program aspoň v simulaci. Tady ovšem narážím na rozsáhlost možných nastavení programu MPLAB X, zatím nevím jak na to. Angličtinu zvládám s obtížemi. Můžete mi někdo poradit jak na to?
Napsal: 28 čer 2018, 17:45
od MiloPS3
Cau, uz to tu pisu po nekolikaty , MPLAB X je hruza ,priserny pro nastaveni ....
vyskousej starej MPLAB IDE
https://www.youtube.com/watch?v=pnkUOL0mmyA
jinak skus projet temata od uzivatele pettter nedavno jsme tam resily spoustu uzitecnejch veci
Napsal: 30 čer 2018, 21:57
od nvenca
Děkuju za tip na youtube. Tam jsem našel postup jak nastavit MPLABX IDE pro simulaci. Je to sice logické, ale v tom obrovském rozsahu možných nastavení to neprofesionál sám těžko hledá. Ale můj problém jsem stejně nevyřešil, pouze jsem zjistil jak se program chová (ale to není málo!).
Je to tento prográmek, který má opakovaně honit v osmici LED na portu B jednu svítící LED od bitu 0 po bit7 a zpět. Ve skutečnosti se rozsvítí jen LED na bitu 0 a tím to skončí. Na simulaci jsem zjistil že program běží dobře pouze do skončení čekání a pak se vrátí na začátek cyklu while a tak dokola v nekonečném cyklu.
/*
* File: 8xLEDpostupne_cyklem.c
* Author: xxxx
*
* Created on 27. ?ervna 2018, 17:03
*/
#pragma config FOSC=INTOSCIO //vnitrni osc., RA6 a RA7 volne
#pragma config WDTE=OFF //vypnuti WDT
#pragma config LVP=OFF //vypnuti LVP, RB4 volny
#define _XTAL_FREQ 4000000UL //taktovaci kmitocet 4 MHz
#include <xc.h>
#include <stdint.h>
void main(void)
{
uint8_t n,m;
TRISB=0; //vsechny vyvody portu B jsou vystupy
PORTB=0b11111111; //vsechny LED zhasnute
n=0b00000001;
while(1) //nekonecny cyklus
{
if (n==0b00000001)
m=0;
if (n==0b10000000)
m=1;
PORTB=(unsigned)~n;
__delay_ms(500);
if (m==0)
n>>1; //bitovy posuv doleva o 1 bit
if (m==1)
n>>1; //bitovy posuv doprava o 1 bit
}
return;
}
Tedy část:
if (m==0)
n>>1; //bitovy posuv doleva o 1 bit
if (m==1)
n>>1; //bitovy posuv doprava o 1 bit
se celá přeskakuje.
Našel jsem pouze varování překladače
":: warning: (1273) Omniscient Code Generation not available in Free mode" s kterým si nevím rady v čem je problém a jak jej mohu řešit i v bezplatné (free) verzi.
Mohu požádat někoho ze zkušených, proč vadí ty dva podmíněné příkazy na konci. Rád bych to pochopil abych věděl v čem je omezení.
Díky moc za pomoc.
Napsal: 30 čer 2018, 22:21
od MiloPS3
cau mas to spatne a jeste asi preklep
Kód: Vybrat vše
n>>1; //bitovy posuv doleva o 1 bit
n>>1; //bitovy posuv doprava o 1 bit
https://www.sallyx.org/sally/c/c10.php
Napsal: 30 čer 2018, 22:26
od nvenca
Omlouvám se za chybnou verzi programu, uvedenou v předchozím příspěvku. Zkoušel jsem totiž přehazovat příkazy pro posuvy a omylem jsem uvedl verzi kde jsou ty posuvy prohozené. Na chování programu to ale nemá žádný vliv, protože jak jsem uvedl, překladač ty dva podmíněné příkazy stejně ignoruje. Uvádím to jen pro toho kdo tuto chybu objeví, aby věděl že v tom problém nespočívá.
Napsal: 30 čer 2018, 22:32
od MiloPS3
dobra , takze to mame vyresenej ten "preklep" a tet tu dulezitou chybu ktera to znefunkcnuje ..
do odkazu jsi koukal ?
jo jinak kod davej do CODE
Napsal: 30 čer 2018, 22:45
od nvenca
Bohužel to moje upozornění na chybu přišlo pozdě, MiloPS3 byl rychlejší. Ale dík za odkaz na sallyx.org. Zjistil jsem totiž že Microchip má v dokumentaci která se nainstaluje s překladačem pěkný chaos vyplývající asi z kombinace s makroassemblerem. A když se místo překladače XC8 verze 1.45 nainstaluje novější verze 2.00, což MPLABX nabídne, překladač používá jinak psané příkazy.
Navíc sallyx je v češtině.
Napsal: 30 čer 2018, 22:48
od nvenca
Na odkaz na sallyx jsem zatím jen koukl, ale přečtu si jej jak bude chvíle, teď musím od počítače.
Napsal: 30 čer 2018, 22:59
od rnbw
gcc píše:Kód: Vybrat vše
test.c:5:11: warning: statement with no effect [-Wunused-value]
n >> 1;
~~^~~~
Napsal: 01 črc 2018, 17:39
od nvenca
pro rnbw:
je to zpráva pro mne nebo pro gcc (asi mimo toto vlákno)?
mám tam sice podobný příkaz pro posuv, ale napsaný asi správně, tj. bez mezer. Alespoň jinak tomu nerozumím.
Napsal: 01 črc 2018, 17:51
od MiloPS3
to je odpoved pro tebe
asi neznamena ze je to spravne ...
Kód: Vybrat vše
n>>1; //bitovy posuv doleva o 1 bit
kam zapisujes vysledek ?
otevri si ten odkaz co sem sem dal a najdi si
Binární a relační operátory a najdi si spravny zapis prikazu ne "asi spravny"
Napsal: 01 črc 2018, 18:02
od Bernard
nvenca píše:...":: warning: (1273) Omniscient Code Generation not available in Free mode"
To bude asi jen taková srandička:
Vševědoucí kompilátor není ve free verzi k dispozici. gcc to zhodnotí stručně:
warning: statement with no effect
EDIT: Teď koukám, že
rnbv to napsal už včera.

Napsal: 01 črc 2018, 18:09
od nvenca
Nějak jsem uvízl v mrtvém bodě.
Jsem totiž původně analogový hardwerář s určitými malými zkušenostmi z pokusů ve strojovém kódu se stavebnicí SDK 8085 (historicky). Tam o žádný překlad nešlo a za celý program včetně chyb a jejich hledání si ručil programátor. Hlavním nástrojem byl selský rozum a pečlivost při studiu a použití instrukcí. Byly také nějaké historické pokusy v Basicu a pak v Borland Pascalu, ale to se netýkalo řízení hardware.
Domnívám se že problém může být v tom, že na rozdíl od prostého assembleru (vlastně strojový kód jen zapsaný v sybolických adresách) tady (u C) přibývá překladač, kde kromě toho selského rozumu přibývá nutnost respektovat potřeby toho překladače, aby interpretace nejen příkazů (syntaxi pohlídá překladač) ale i obsahu proměnných byla jednoznačná (signed, unsigned apod.). Z toho vyplývá zřejmě nutnost prostudovat si úvodní kapitoly (definice, typy, deklarace atd.) k jazyku C, což se mi jednak nechtělo v anglické rozsáhlé dokumentaci k XC8, jednak jsem jel podle té Matouškovy knihy, která se tím na začátku vůbec nezabývá. Ty příklady z knihy jsou samozřejmě v pořádku, ale jen primitivní, no a já jsem chtěl hned u prvního příkladu více, podle selského rozumu měl program fungovat, syntaxe byla taky OK, ale překladač to asi chápe jinak.
Takže zpátky na strom a začít studovat, nejlépe v češtině. Zkusím sallyx.org i když tam samozřejmě není popis C pro XC8 od Microchipu, ale to už snad porovnám s dokumentací k XC8 (asi stačí syntaxe příkazů).
Vidíte někdo lepší cestu k porozumění chování překladače?
Napsal: 01 črc 2018, 18:49
od MiloPS3
nehledej v tom zadny čáry máry
mas spatne zapsanej prikaz
MiloPS3 píše:kam zapisujes vysledek ?
(viz priloha)
Vidíte někdo lepší cestu k porozumění chování překladače?
help a pak google a
google a
GOOGLE
Napsal: 01 črc 2018, 19:13
od nvenca
Děkuju všem za pomoc, už to běhá jak má. Ve všech popisech, které mám k dispozici se u operátorů pro bitový posuv sice zabývají popisem co se stane s operandem signed a co s unsigned, ale ve všech jsem to chápal tak, že se NAHRADÍ původní obsah proměnné hodnotou bitově posunutou požadovaným směrem o požadovaný počet bitů.
O tom že by to mohlo být i jinak jsem začal uvažovat až po přečtení dotazu od MiloPS3 (kam zapisuješ výsledek?). Stačilo nahradit n>>1; příkazem n=n>>1; a obdobně u druhého posuvu a vše jede.
Akorát to při překladu varuje:
8xLEDpostupne_cyklem.c:34: warning: (373) implicit signed to unsigned conversion.
Ale protože je asi správně definovaný typ proměnné, tak to nevadí?
Ještě jednou díky všem.