Fórum témák
» Több friss téma |
Szimulátorban nézted már? Mutass többet a kódodból.
Idézet: „unsigned int n=0; void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); while(1){ if (n==0) output_high(PIN_A1); if (n==1) output_high(PIN_A0); if (n==2) output_high(PIN_A7); if (n==3) output_high(PIN_A6); ... delay_ms(500); n++; } }” Ez előtt pedig csak a be include-olt pic van. Annyira egyszerű, hogy nem igaz és megfog. Olvastam, hogy a proteus jó szimulátor. Kezdő vagyok ezért kérdem, hogy te mit ajánlsz? Én most beleégettem egy pic-be és úgy próbáltam. Ezért biztos, hogy nem működőképes ![]()
Az MPLAB-ban van szimulátor is, bár a CCS kódot forrásszinten nem biztos, hogy tudja kezelni (én úgy alapból nem szeretem a CCS-t, sosem kerestem, hogy tudja-e). asm szinten biztosan tudja. Viszont azt nem látom, hogy letiltanád az analóg-digitális átalakítót. Konfigurációs biteket is jó lenne látni, nem-e az a probléma, hogy a watchdog mindig újraindítja a pic-et, mielőtt odaérhetne, hogy magasra húzza az A0 lábat.
Én az assembly-val nem vagyok megbékélve. Ezért is kezdtem inkább C-vel. Itt van minden. Holnap az egészet új mappába mindenestől újra megírom nehogy az legyen a baj.
Idézet: „#include <16F628A.h> #FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES NOPUT //No Power Up Timer #FUSES NOPROTECT //Code not protected from reading #FUSES NOBROWNOUT //No brownout reset #FUSES NOMCLR //Master Clear pin used for I/O #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #use delay(clock=20000000)”
Köszönöm. Holnap kipróbálom mert egész nap kódokat bújtam. Én is kaptam egy generált hibás kódot de annál még a futtatás közbeszólt. Úgy látszik vannak hibák ebben a programban is. Mindenhol 20Mhz-et láttam én is, biztos ezért nem tűnt fel. Most nézem az adatlapot, hogy a belső csak 4-re képes. Igen, valóban 3 topikot is találtam és nem tudtam melyikbe írjak (ez, ccs, pic kezdő).
Kíváncsiság megölt ezért még azért is kijavítottam a dolgokat. Még egyszer köszönöm szépen. Lehet még lesznek majd ügyetlen kérdéseim. Előre is elnézéseteket kérem. Majd a ccs topikjába fogom írni azokat.
Ismer valaki olyan C forrásfájl gyűjteményt, vagy bináris fájlokat, amik betűkészletek "leírását" tartalmazzák ilyesmi formában: Link? Vagy esetleg programot, ami tud ilyet generálni? A mikroelektronika Visual TFT nevű programja tud ilyen C forrást generálni bármilyen betűkészletből és bármekkora betűmérettel, csak épp az ascii tábla 0x32-0x7F tartományából vannak csak benne a karakterek, az afelettiek nincsenek, én meg szeretnék ékezetes betűket is kiíratni. Tudom, csinálhatnék magamnak ilyen fájlt akár kézzel is, de hátha létezik már készen és nem kell újra feltalálnom
![]()
Van ott egy segedprogram ami barmilyen alakzatbol csinal binaris (C) kimenetet, de neked kell megrajzolni a kivant betut.
Egy port bitét akarom 1-be állítani, ha egy váltózó 6. bite egy.
Össze lehet így fűzni két logikai operátort? Ez is jó lenne, de lefordítva asm-re, 2 sorral több:
C-ben legrövidebb így lenne:
Viszont ennek a fordításával én nem voltam megelégedve, ezért én ezt szoktam használni:
-------------------- Idézet: „Össze lehet így fűzni két logikai operátort?”
Ilyeneket inkább ne csinálj, ugyanis senki sem garantálja, hogy az A && B művelet eredménye csak 0 vagy 1 lehet, hanem könnyen lehet pl. a 64&&64 eredménye 64.
A két példa nem ugyanazt csinálja, az első a jó.
Mi van ha a változó értéke 128? Az első feltétel FALSE értéket ad vissza mert a 6.bit 0, a második TRUE-t, mert nagyobb mint 64. Feltételes kifejezéssel sokkal elegánsabb lehet a kód: LATCbits.LATC0 = (64 & v_sram_cim) ? 1 : 0;
Ehhez még annyit, hogy próbáld meg ezt, hátha ebből jobban fordít:
Szia!
Köszi!
Ezt a kérdőjeles forma még nekem új, az if-else ág áttekinthetőbb és most hogy nézem a disassembly ablakban, hatékonyabb is. Lokátoros, Hp41C köszi nektek is! Egyébként reggel eszembe jutott, hogy ez a maszkolásos módszer rövidnek tűnik, gyors ki is pattantam az ágyból (igen, még feküdtem, első 4 órám lyukas ![]() ![]()
Még egy kérdés: bár úgy látom helyesen lefordítja az MPLAB, de lehet egy sorba írni ezt:
Így:
Lehet. Általában az újsor jelek lényegtelenek a fordító számára. Nem mindenhol, mert pl. a //-el kezdődő kommenteket, meg a define-okat, pragma, stb.-t is az újsor zárja, így ezeknél lényeges, de a tiszta kódban most nem jut eszembe olyan, ahol feltétlenül fontos az újsor.
Köszi, így nem "rúgja" annyira szét a programot.
Nézegetem kicsit a disassembly ablakot és valamit nem értek. Van az alábbi C kód:
Aminek azt kéne csinálni, hogy amíg a PORTD 5. bite "0", addig "álljon" a program. Íme a lefordított kód a disassembly ablakban:
Viszont itt ha a PORTD (f83 a cime) 5. bite "0", akkor nem a while ciklustörzsét hatja végre, hanem visszaugrik a feltételvizsgálathoz (BRA 0x205e). Ez lehetne jó is, hisz eltelik egy utasításidő, amíg visszaugrik a BTFSC-re, de ha a ciklustörzsbe nem nopot, hanem pl. egy inkrementáló utasítást rakok, azt se hajta végre a disassembly kódot nézve. Szerk.: ez az MPLAB fordító hibája (elég nagy hiba lenne...), vagy csak én értelmezek valamit rosszul?
Én arra tippelek, hogy egyszerűen kioptimalizálta a NOP utasítást. Próbáld meg kikapcsolni az optimalizálásokat és nézd meg úgy is a listát.
A program memory meg teljesen mást mutat. Na én inkább beszúrok egy asm kódot és probléma (remélhetőleg) megoldva.
![]()
Ha megnezed az assembly utasitasok cimeit, akkor kiderul, hogy a NOP utasitas a 2062-es cimen van, es az az utasitas amelyik vissza ugrik a 2064-esen. Azaz jol forditott a fordito, csak ez a listazas furcsa kicsit...
... szoval a kod valojaban igy nez ki a program memoriaban:
Úgylátszik a program memory ablak használhatóbb infót ad.
Fura ez a lista, tenyleg. De amugy miert szeretted volna latni a disassembly kodot? Arra gyanakodtal hibas a fordito?
Csak kíváncsi voltam hogy mire fordítja le, de hát akkor lehet nem is azt mutatja...
Azt mutatja az, csak néha nem szedi sorba memóriacím szerint. Ezért én is a Program Memory ablakot nézem kínomban, ha helyes sorrendben akarom látni az utasításokat.
Sziasztok!
Egy kis segítségre lenne szükségem. Van egy ds1621-es IC-m és össze akarnám hozni egy PIC16F874-el+2x16-os LCD-vel. Na már most kipróbáltam a CCS gyári forráskódját és ugyan működik csak állandóan 82,83, 84 dec. számmal tér vissza az LCD-re. De már volt olyan, hogy lement 79-re. ![]() Szóval ha valaki tudna segíteni abban, hogy mit rontok el, akkor azt szívesen venném. A forrásfájl a következő: |
Bejelentkezés
Hirdetés |