Fórum témák
» Több friss téma |
Nézd meg a pic adatlapját , vannak kontrollerek amelyeknél az RA4 csak GND re tud kapcsolni ...
A hozzászólás módosítva: Ápr 12, 2021
Így egyszerűbb olvasni:
PORTB=0x04; jelentése: PORTB=0b00000100. Tehát ha az első feltétel teljesül, akkor az RB2 kimenet magas lesz, a többi alacsony. A következő feltételnél ezt a kimeneti állapotot felülírod. PORTB=0x08; PORTB=0b00001000. RB3 magas lesz, a többi alacsony. A PORTB=valami utasítással a teljes regisztert írod, nem csak egy bitet, ahogy szeretnéd.
Igazad van. Majd ezen modositok. De akkor sem értem, hogy az első 4 bemenetre miért nem történik semmi.
ADCON1 regiszterben be kell állítani a RA0 .. RA3 lábakat digitális módba.
Köszönöm szépen, ez a része megoldódott! A Proteus 8 szimulátornál ne törődjek azzal, hogy van amelyik kimenet villog és van amelyik szépen pirosan jelez? A valóságban nem fog pulzálni?
Meg kellene nézni, hogy miért "villog".
- Független kimenetek vezérlése hat egymásra: Milyen módszerrel állítod? Teljes port írás okozhatja a villogást. Egy előbb kiírt vezérlést a következő kiírása felülbírálhatja. Bitenkénti kimenetállítás kellene. pl: PORTBbits.RB6 = 1; - Bitenkénti kivitel hat egymásra? Túl gyorsan történnek a kimenetek? A PORT -ra vonatkozó műveleteket egy változóban kellene megcsinálni és akkor kimásolni a PORT -ra, ha az összes kimenetet már beállítottad. pl: PORTB = PORTB_Work; - Túl vannak terhelve a PORT lábak? Pl. előtét ellenállás nélkül vannak rá kötve LED -ek? A bitenkénti műveletek beolvassák a PORT aktuális értékét, ezen az értéken végeznek műveletet és az eredmény írják vissza a PORT -ra. Ha a port lábon nem alakul ki a bemenetre vonatkozó minimális magas szinthez tartozó feszültség, az olvasás 0 -t fog adni a túlterhelt kimenethez tartozó biten. Megoldás az előző pontnál.
Igen, azóta már megcsináltam úgy, hogy nem teljes PORT-ra vonatkozik a kimenet, hanem bitekre, ahogy Te is írtad. Jelenleg a Proteusban a bemeneteket nyomógombbal helyettesítettem és kimenetként semmit sem rajzoltam be. Azt vettem észre, ha egyszerre több bit kimenet is aktív, akkor villog, ha csak egy, akkor nem villog. Egyébként majd minden bit kimenet egy reléhez lesz kapcsolva és az húz be egy ajtómágnest. A kimeneti bitek nem hatnak egymásra.
Fel tudnál tölteni egy kis részletet a programból, ahol a "villogó" kimeneteket állítod?
Tulajdonképpen nem kellene villogni, csak a szimulátoron úgy tűnik. A hozzászólás módosítva: Ápr 13, 2021
A hozzászólás módosítva: Ápr 13, 2021
Nem néztem végig a kódot, csak feltűnt, hogy az összes feltételnél értékadás "=" van az egyenlőség vizsgálat "==" helyett. Biztosan így akartad?
Végülis azt akartam, hogy, ha a bemenet aktív (1), akkor bizonyos kimenet is legyen aktív.
Így is villog a szimulációnál, csak lassabban.
Az
különböző hatású.
Valóban. Az összes
típusú sort
Így kell kikapcsolni?
#pragma config WDTE = OFF
Szívesen segítek, de azért nem árt egy kis gondolkodás sem....
Az eredeti program 53. sorában levő else az 49. sorhoz tartozik. Ezért a gondosan beállított kimeneteket törli a 54. sor, ha ajto6 nem 1. Ettől már villognak is. (Az ajto1=1 fordulatokat már ajto1==1 -re cseréltük. ) Be kell állítani a konfigurációt. Mivel már típusspecifikus adatok vannak benne, a #include <xc.h> sor után kell lennie. Végezetül nem árt fordítva gondolkodni: Melyik kimenetet meny ajtó jelek vezérlik. Mivel fordítasz? MpLab 8.9x -el? Ha igen készíts egy projectet, állítsd be debuggernek az MpLab Sim -et. Sajnos át kell verni a fordító eszét és az ajtóx definícióját érdemes átírni: #include <xc.h> #define _XTAL_FREQ 20000000 //define crystal frequency to 20MHz // CONFIG #pragma config FOSC = XT // Oscillator Selection bits (XT oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) /* #define ajto1 RA0 #define ajto2 RA1 #define ajto3 RA2 #define ajto4 RA3 #define ajto5 RB0 #define ajto6 RB1 */ typedef unsigned char BYTE; typedef u_n_i_o_n _BYTE_VAL { BYTE Val; struct { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; } bits; } BYTE_VAL, BYTE_BITS; // Az u_n_i_o_n -ból a 4 db _ elhagyandó. BYTE_VAL porta = 0; BYTE_VAL portb = 0; #define ajto1 (porta.bits.b0) #define ajto2 (porta.bits.b1) #define ajto3 (porta.bits.b2) #define ajto4 (porta.bits.b3) #define ajto5 (portb.bits.b0) #define ajto6 (portb.bits.b1) void main() { porta.Val = portb.Val + 128; portb.Val = porta.Val - 128; ADCON1 = 0x0F; TRISB=0x03; //Port-B as Output TRISA=0x1F; //RA as input while (1) { if ((ajto1==1)||(ajto3==1)||(ajto4==1)) { PORTBbits.RB3=1; } else { PORTBbits.RB3=0; } if ((ajto2==1)||(ajto3==1)||(ajto5==1)) { PORTBbits.RB5=1; } else { PORTBbits.RB5=0; } if ((ajto2==1)||(ajto4==1)) { PORTBbits.RB4=1; } else { PORTBbits.RB4=0; } if (ajto2==1) { PORTBbits.RB2=1; } else { PORTBbits.RB2=0; } if (ajto4==1) { PORTBbits.RB6=1; } else { PORTBbits.RB6=0; } if (ajto6==1) { PORTBbits.RB7=1; } else { PORTBbits.RB7=0; } } } Fordítsuk le a programot. Vegyük fel a Watch ablakba a porta és portb változókat. Tegyünk töréspontot a TRISA=0x1F; //RA as input sorra. Indítsuk a programot. Megáll a fenti soron. Utasításonként lehet léptetni illetve máshová is lehet töréspontot tenni. Ne álljunk meg itt... Állítsuk be a Logikai Analizátort: View / Simulator Logic Analizer Adjuk a diagramhoz a kimeneteket a Channels gomb megnyomása után keressük meg a listában a RB2, RB3, RB4, RB5, RB6, RB7 kimeneteket és egyesével "Add+ -juk hozzá a csatornákhoz. Majd Ok. Ha léptetjük a programot egyből láthatjuk a csatornákon a változást. Ha egy nagyobb programrészt futtatunk (mondjuk töréspontig), a megállás után vizsgálhatjuk a jelalakokat... A hozzászólás módosítva: Ápr 13, 2021
Köszönöm szépen!! Az valóban jó ötlet, hogy a kimeneteket így csináltad, mert eddig azért villogott, mert az egyik ajtó azt kérte egy bizonyos ajtótól, hogy zárva legyen; utána egy másik ajtó pedig azt, hogy nyitva legyen. De így a kimeneteket az ajtók csak egyszer módosítják körönként. Bemásoltam a Te programodat, de hibára futott. Ezt írja:
De, amikor új projektet csináltam és kiválasztottam a PIC-t, akkor abból ajánlottam, amit felkínált, azaz a PIC16F716-t. Nem értem.
A Project tulajdonságai között be kell állítani az include path -t a fodító telepítési mappájában található include mappára.
A hozzászólás módosítva: Ápr 14, 2021
A projekt nevére jobb egérrel ráklikkelek, ott a Properties-en belül hol találom a path-t (utat), amit állítanom kell?
A fordító telepítési mappájában lévő include mappát megtaláltam. Csak azt nem tudom, hogy ezt az elérési utat hol kell megadnom.
Én azt szeretném beállítani az MPLAB X IDE felületen, amit Te javasoltál és ott nem találom az include path helyét.
Szia!
Tools --Options --> Embedded, ha minden igaz ...
A project gyökerénél jobb katt, ott properties / Conf / XC8 global options / XC8 compiler / Include directories.
Megtettem, továbbra is hiba van. Ez a hibaüzenet: Some of the files in this Project "Reteszeles" contain spaces or odd characters in their name or their path. This could potentially cause issues during the build process. This is a limitation of GNU Make tool that we use as part of our build process. Removing spaces from all file and folder names included in this project will eliminate this potential issue.
Egy vagy több fájl nevében és/vagy elérési útjában van szóköz és/vagy speciális karakter.
Teljesen újratelepítettem az MPLAB-t. Most már újabb hibája van:
make[2]: *** [build/default/debug/16F716.p1] Error 1 make[1]: *** [.build-conf] Error 2 make: *** [.build-impl] Error 2 Már nehezen bírom idegekkel!
Hozz létre új projektet, csak a forrás fájlok maradjanak.
|
Bejelentkezés
Hirdetés |