Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   147 / 153
(#) kaqkk válasza Laja1 hozzászólására (») Ápr 12, 2021 /
 
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
(#) Bakman válasza Laja1 hozzászólására (») Ápr 12, 2021 /
 
Így egyszerűbb olvasni:
  1. // CONFIG
  2. /*#pragma config FOSC = EXTRC     // Oscillator Selection bits (RC oscillator)
  3. #pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enabled)
  4. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  5. #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
  6. #pragma config LVP = ON  */       // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
  7. //#pragma config CPD = OFF       // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
  8. //#pragma config WRT = ON        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
  9. //#pragma config CP = ON      // Flash Program Memory Code Protection bit (Code protection off)
  10.  
  11. #include <xc.h>
  12. #define _XTAL_FREQ 20000000 //define crystal frequency to 20MHz
  13.  
  14.  
  15. #define ajto1 RA0
  16. #define ajto2 RA1
  17. #define ajto3 RA2
  18. #define ajto4 RA3
  19. #define ajto5 RA4
  20. #define ajto6 RB0
  21.  
  22. void main()
  23. {
  24.    
  25.     TRISB=0x01; //Port-B as Output
  26.     TRISA=0x1F; //RA as input
  27.     while (1)
  28.     {
  29.         if (ajto1=1)
  30.             PORTB=0x04;
  31.         if (ajto2=1)
  32.             PORTB=0x08;
  33.         if (ajto3=1)
  34.            PORTB=0x10;    
  35.          if (ajto4=1)
  36.            PORTB=0x20;        
  37.          if (ajto5=1)
  38.             PORTB=0x40;
  39.         if (ajto6=1)
  40.             PORTB=0x02;
  41.          
  42.         else
  43.           PORTB=0x00;
  44.    }
  45.   return;  
  46. }
A leírásod alapján alapvető hiba van a programban. A

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.
(#) Laja1 hozzászólása Ápr 12, 2021 /
 
Igazad van. Majd ezen modositok. De akkor sem értem, hogy az első 4 bemenetre miért nem történik semmi.
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 12, 2021 /
 
ADCON1 regiszterben be kell állítani a RA0 .. RA3 lábakat digitális módba.
  1. ADCON1 = 0x06;
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 13, 2021 /
 
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?
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 13, 2021 /
 
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.
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 13, 2021 /
 
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.
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 13, 2021 /
 
Fel tudnál tölteni egy kis részletet a programból, ahol a "villogó" kimeneteket állítod?
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 13, 2021 /
 
  1. // CONFIG
  2. /*#pragma config FOSC = EXTRC     // Oscillator Selection bits (RC oscillator)
  3. #pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enabled)
  4. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  5. #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
  6. #pragma config LVP = ON  */       // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
  7. //#pragma config CPD = OFF       // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
  8. //#pragma config WRT = ON        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
  9. //#pragma config CP = ON      // Flash Program Memory Code Protection bit (Code protection off)
  10.  
  11. #include <xc.h>
  12. #define _XTAL_FREQ 20000000 //define crystal frequency to 20MHz
  13.  
  14.  
  15. #define ajto1 RA0
  16. #define ajto2 RA1
  17. #define ajto3 RA2
  18. #define ajto4 RA3
  19. #define ajto5 RB0
  20. #define ajto6 RB1
  21.  
  22.  
  23.  
  24. void main()
  25. {
  26.     ADCON1 = 0x0F;
  27.     TRISB=0x03; //Port-B as Output
  28.     TRISA=0x1F; //RA as input
  29.     while (1)
  30.     {
  31.         if (ajto1=1)
  32.         {PORTBbits.RB3=1;}
  33.         if (ajto2=1)
  34.         {PORTBbits.RB2=1;
  35.          PORTBbits.RB4=1;
  36.           PORTBbits.RB5=1;}
  37.          
  38.         if (ajto3=1)
  39.         {PORTBbits.RB3=1;
  40.            PORTBbits.RB5=1;}
  41.            
  42.          if (ajto4=1)
  43.          {PORTBbits.RB3=1;
  44.             PORTBbits.RB4=1;
  45.              PORTBbits.RB6=1;}
  46.              
  47.          if (ajto5=1)
  48.          { PORTBbits.RB5=1;}
  49.         if (ajto6=1)
  50.         { PORTBbits.RB7=1;}
  51.          
  52.          
  53.         else
  54.           PORTB=0x00;
  55.    }
  56.   return;  
  57. }


Tulajdonképpen nem kellene villogni, csak a szimulátoron úgy tűnik.
A hozzászólás módosítva: Ápr 13, 2021
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 13, 2021 /
 
  1. void main()
  2. {
  3.     ADCON1 = 0x0F;
  4.     TRISB=0x03; //Port-B as Output
  5.     TRISA=0x1F; //RA as input
  6.     while (1)
  7.     {
  8.         if (ajto1=1)
  9.         {
  10.             PORTBbits.RB3=1;
  11.         }
  12.         else
  13.         {
  14.             PORTBbits.RB3=0;
  15.         }
  16.  
  17.         if (ajto2=1)
  18.         {
  19.             PORTBbits.RB2=1;
  20.             PORTBbits.RB4=1;
  21.             PORTBbits.RB5=1;
  22.         }
  23.         else
  24.         {
  25.             PORTBbits.RB2=0;
  26.             PORTBbits.RB4=0;
  27.             PORTBbits.RB5=0;
  28.         }
  29.          
  30.         if (ajto3=1)
  31.         {
  32.            PORTBbits.RB3=1;
  33.            PORTBbits.RB5=1;
  34.         }
  35.         else
  36.         {
  37.            PORTBbits.RB3=0;
  38.            PORTBbits.RB5=0;
  39.         }
  40.          
  41.          if (ajto4=1)
  42.          {
  43.             PORTBbits.RB3=1;
  44.             PORTBbits.RB4=1;
  45.             PORTBbits.RB6=1;
  46.          }
  47.          else
  48.          {
  49.             PORTBbits.RB3=0;
  50.             PORTBbits.RB4=0;
  51.             PORTBbits.RB6=0;
  52.          }
  53.              
  54.          if (ajto5=1)
  55.          {
  56.              PORTBbits.RB5=1;
  57.           }
  58.          else
  59.          {
  60.              PORTBbits.RB5=0;
  61.           }
  62.         if (ajto6=1)
  63.         {
  64.              PORTBbits.RB7=1;
  65.         }
  66.         else
  67.         {
  68.              PORTBbits.RB7=0;
  69.         }
  70.    }
  71. }
A hozzászólás módosítva: Ápr 13, 2021
(#) benjami válasza Laja1 hozzászólására (») Ápr 13, 2021 / 1
 
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?
(#) Laja1 válasza benjami hozzászólására (») Ápr 13, 2021 /
 
Végülis azt akartam, hogy, ha a bemenet aktív (1), akkor bizonyos kimenet is legyen aktív.
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 13, 2021 /
 
Így is villog a szimulációnál, csak lassabban.
(#) gg630504 válasza Hp41C hozzászólására (») Ápr 13, 2021 /
 
  1. PORTBbits.RB3 = ajto1 ? 1 : 0;

Az
  1. ajto1 = 1
  2. ajto1 == 1
  3. ajto1 != 0

különböző hatású.
(#) Hp41C válasza gg630504 hozzászólására (») Ápr 13, 2021 /
 
Valóban. Az összes
  1. if (ajto1=1)

típusú sort
  1. if (ajto1==1) -re kell javítani.
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 13, 2021 /
 
A Watchdog ki van kapcsolva?
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 13, 2021 /
 
Már megtettem, de változás nincs.
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 13, 2021 /
 
Így kell kikapcsolni?
#pragma config WDTE = OFF
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 13, 2021 /
 
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

16F716.c
    
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 14, 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:
  1. #ifdef _16F716
  2. #ifdef _LEGACY_HEADERS
  3. #include <pic16f716_legacy.h>
  4. #undef _HEADER_NOT_FOUND
  5. #else
  6. #include <pic16f716.h>
  7. #undef _HEADER_NOT_FOUND
  8. #endif
  9. #endif

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.
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 14, 2021 /
 
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
(#) Laja1 válasza Hp41C hozzászólására (») Á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.
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 14, 2021 /
 
Sajnos a Protus -hoz nem értek.
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 14, 2021 /
 
É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.
(#) kissi válasza Laja1 hozzászólására (») Ápr 14, 2021 /
 
Szia!

Tools --Options --> Embedded, ha minden igaz ...
(#) benjami válasza Laja1 hozzászólására (») Ápr 14, 2021 /
 
A project gyökerénél jobb katt, ott properties / Conf / XC8 global options / XC8 compiler / Include directories.
(#) Laja1 válasza benjami hozzászólására (») Ápr 14, 2021 /
 
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.
(#) Bakman válasza Laja1 hozzászólására (») Ápr 14, 2021 /
 
Egy vagy több fájl nevében és/vagy elérési útjában van szóköz és/vagy speciális karakter.
(#) Laja1 válasza Bakman hozzászólására (») Ápr 14, 2021 /
 
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!
(#) superuser válasza Laja1 hozzászólására (») Ápr 14, 2021 /
 
Hozz létre új projektet, csak a forrás fájlok maradjanak.
Következő: »»   147 / 153
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem