Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   148 / 153
(#) Laja1 válasza superuser hozzászólására (») Ápr 15, 2021 /
 
Továbbra is hiba. A változatosság kedvéért:
make[2]: *** [build/default/production/16F716.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
(#) Taki33 válasza Laja1 hozzászólására (») Ápr 15, 2021 /
 
Nem tudom mit csinálsz, nálam minden hiba nélkül lefordult amit Hp41C csinált neked!

Ajto.X.zip
    
(#) Laja1 válasza Taki33 hozzászólására (») Ápr 16, 2021 /
 
Nagyon rendesek vagytok, hogy így segítetek!! De sajnos nekem erre is ugyanazt a hibát írja ki. Ezek szerint valami az MPLAB X IDE általános beállításainál lehet elrontva. Talány.....
(#) Taki33 válasza Laja1 hozzászólására (») Ápr 16, 2021 /
 
Azért nem hiszem, hogy akkora kihívás feltelepíteni a MPLAB X IDE-t, meg az XC8 fordítót! Tele van a youtube videóval hogyan kell! Például: Download and Install MPLAB X IDE
(#) Bakman válasza Laja1 hozzászólására (») Ápr 16, 2021 1 /
 
Egy előző hibából kiindulva: van a fájl(ok) elérési útjában szóköz és/vagy speciális karakter?
(#) pipi válasza Laja1 hozzászólására (») Ápr 16, 2021 /
 
Azt hiszem javasolták már, nem tudom megcsináltad-e, hogy létrehozol egy tök új projekt-et, és ebbe bemásolod a forrásfájlokat, utána hozzáadod a másoltakat az új projekt-be.
(#) Laja1 válasza Bakman hozzászólására (») Ápr 16, 2021 /
 
Volt szóköz, de máshova athelyeztem. De nem javult meg. Aztán az egész MPLAB-t letöröltem és újra telepítettem.. De nincs változás.
(#) Laja1 válasza pipi hozzászólására (») Ápr 16, 2021 /
 
Megcsináltam, nincs változás. Átnézem még az MPLAB beallitasait.
(#) Taki33 válasza Laja1 hozzászólására (») Ápr 16, 2021 /
 
Az egész fordítási üzenetet írd ide ne csak azt ahol a hibát írja.
(#) Laja1 válasza Taki33 hozzászólására (») Ápr 16, 2021 /
 
CLEAN SUCCESSFUL (total time: 2ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'F:/Elektronika/Microchip/Ajto.X'
make -f nbproject/Makefile-default.mk dist/default/production/Ajto.X.production.hex
make[2]: Entering directory 'F:/Elektronika/Microchip/Ajto.X'
"F:\Elektronika\Microchip\xc8\v2.32\bin\xc8-cc.exe" -mcpu=16F716 -c -mdfp="F:/Elektronika/Microchip/MPLABX/v5.45/packs/Microchip/PIC16Fxxx_DFP/1.2.33/xc8" -fno-short-double -fno-short-float -fasmfile -maddrqual=ignore -xassembler-with-cpp -I"../xc8/v2.32/pic/include" -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/Ajtok.p1 Ajtok.c
::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries
Ajtok.c:30:9: error: unknown type name 'u_n_i_o_n'
typedef u_n_i_o_n _BYTE_VAL
^
Ajtok.c:30:28: error: expected ';' after top level declarator
typedef u_n_i_o_n _BYTE_VAL
^
;
Ajtok.c:47:1: error: unknown type name 'BYTE_VAL'
BYTE_VAL porta = 0;
^
Ajtok.c:48:1: error: unknown type name 'BYTE_VAL'
BYTE_VAL portb = 0;
^
4 errors generated.
(908) exit status = 1
nbproject/Makefile-default.mk:107: recipe for target 'build/default/production/Ajtok.p1' failed
make[2]: Leaving directory 'F:/Elektronika/Microchip/Ajto.X'
nbproject/Makefile-default.mk:91: recipe for target '.build-conf' failed
make[1]: Leaving directory 'F:/Elektronika/Microchip/Ajto.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make[2]: *** [build/default/production/Ajtok.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 856ms)
(#) Taki33 válasza Laja1 hozzászólására (») Ápr 16, 2021 /
 
Írja hogy az „Ajtok.c:30:9: error: unknown type name 'u_n_i_o_n'” vagyis a 9. sorba nem vetted ki az alsó aláhúzásokat az u_n_i_o_n betűk közül pedig Hp41C még fel is hívta rá a figyelmed!
Egyébként meg csatolt neked egy 16F716.c fájlt annak a tartalmát egy az egybe másold be main fájlodba, de más ne legyen benne.
(#) Laja1 válasza Taki33 hozzászólására (») Ápr 17, 2021 /
 
Bocs, nem a végleges hibaüzenetet küldtem. Azóta minden verziót kipróbáltam...
Mellékelem a "jó" hibaüzenetet.
A hozzászólás módosítva: Ápr 17, 2021
(#) Taki33 válasza Laja1 hozzászólására (») Ápr 17, 2021 /
 
Az XC8 a 2. verziótól már nem a C90 szabványt használja, hanem a C99-est! A megoldás: File - Project Properties ablaknál XC8 Global Options és ott a C Standard részt változtasd meg C99-ről C90-re majd Apply és OK. És utána fordítsd le újra.
(#) Laja1 válasza Taki33 hozzászólására (») Ápr 17, 2021 /
 
Sikerült!! Köszönöm!
Csak a Proteus szimuláció szerint egyáltalán nincs kimenet, hiába kapcsolgatom a bemeneteket.
(#) Taki33 válasza Laja1 hozzászólására (») Ápr 17, 2021 /
 
Ha jól értelmezem az első kérdésedet, akkor minden ajtóhoz tartozik egy reed relé ami nyitásra magas jelet ad, és ennek hatására kellene egy hozzá tartozó reteszelő relének magas jelet adni? A bemeneteket lehúznám GND-re egy egy 10K ellenállással és egy lehetséges megoldás:

  1. #include <xc.h>
  2. #define _XTAL_FREQ 20000000 //define crystal frequency to 20MHz
  3.  
  4. // CONFIG
  5. #pragma config FOSC = XT    // Oscillator Selection bits (XT oscillator)
  6. #pragma config WDTE = OFF   // Watchdog Timer Enable bit (WDT disabled)
  7. #pragma config PWRTE = OFF  // Power-up Timer Enable bit (PWRT disabled)
  8. #pragma config BOREN = OFF  // Brown-out Reset Enable bit (BOR disabled)
  9. #pragma config CP = OFF     // Flash Program Memory Code Protection bit (Code protection off)
  10.  
  11.  
  12. #define ajto1 RA0
  13. #define ajto2 RA1
  14. #define ajto3 RA2
  15. #define ajto4 RA3
  16. #define ajto5 RB0
  17. #define ajto6 RB1
  18. #define rele1 RB2
  19. #define rele2 RB3
  20. #define rele3 RB4
  21. #define rele4 RB5
  22. #define rele5 RB6
  23. #define rele6 RB7
  24.  
  25. void main()
  26. {
  27.   ADCON1 = 0x0F;  //ADC kikapcsolva
  28.   TRISB  = 0x03;  //RB0, RB1 bemenet, RB2..RB7 kimenet
  29.   TRISA  = 0x1F;  //RA0..RA4 bemenet, RA5..RA7 kimenet
  30.   PORTB  = 0x00;  //PORT összes alacsony
  31.  
  32.   while (1)
  33.   {
  34.     // Ha ajto1 jel magas, akkor rele1 magas, ha nem akkor rele1 alacsony
  35.     if (ajto1 == 1)
  36.     {
  37.       rele1 = 1;
  38.     } else
  39.     {
  40.       rele1 = 0;
  41.     }
  42.  
  43.     if (ajto2 == 1)
  44.     {
  45.       rele2 = 1;
  46.     } else
  47.     {
  48.       rele2 = 0;
  49.     }
  50.  
  51.     if (ajto3 == 1)
  52.     {
  53.       rele3 = 1;
  54.     } else
  55.     {
  56.       rele3 = 0;
  57.     }
  58.    
  59.     if (ajto4 == 1)
  60.     {
  61.       rele4 = 1;
  62.     } else
  63.     {
  64.       rele4 = 0;
  65.     }
  66.    
  67.     if (ajto5 == 1)
  68.     {
  69.       rele5 = 1;
  70.     } else
  71.     {
  72.       rele5 = 0;
  73.     }
  74.    
  75.     if (ajto6 == 1)
  76.     {
  77.       rele6 = 1;
  78.     } else
  79.     {
  80.       rele6 = 0;
  81.     }
  82.   }
  83. }


Persze még lehetne esetleg pergésmentesítést is tenni bele.
(#) Laja1 válasza Taki33 hozzászólására (») Ápr 17, 2021 /
 
Tökéletesen működik! Egy kicsit más a feladat, mert egy-egy ajtó nyitásérzékelője, nem csak egy ajtóra, hanem egy csoport másik ajtó mágnesére hat. De ezt sikerült megoldani. Szerintem pergetésmentesítésre sincs szükség. Még egy kérdés: miért gondolod, hogy a bemeneteket le kellene húzni a földre? Anélkül nem működne? A szimulátor szerint anélkül is jó.
(#) Taki33 válasza Laja1 hozzászólására (») Ápr 17, 2021 /
 
A bemenetet nem szoktuk lebegni hagyni, hanem egy 10K ellenállással vagy földhöz vagy a táphoz kötjük, így mindig biztos az állapota vagy 0 vagy 1.
(#) Laja1 válasza Taki33 hozzászólására (») Ápr 18, 2021 /
 
Azt meg tudjátok mondani, hogy milyen parancsot kell beírni, ha azt szeretnénk, hogy később ne olvashassák ki a programot a PIC-ből?
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 18, 2021 /
 
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
helyett
#pragma config CP = ON // Flash Program Memory Code Protection bit (Code protection on)

Ha PICkit2/3/4 -gyel programozol, az írás közbeni ellenőrzés sikerül, de a továbbiakban külön indított ellenőrzések hibára futnak.
(#) Laja1 hozzászólása Ápr 19, 2021 /
 
Sziasztok!
Az volna a kérdésem, hogy hogyan lehet azt programozni, hogy egy nyomógomb hatására a PIC egyik kimenete 20 sec-ig aktív legyen és ugyanakkor egy másik kimenete ez alatt a 20 sec alatt 10 sec legyen aktív. Volt egy ötletem, de az nem működik. Sajnos addig, amíg az egyik kimenet ideje nem jár le, addig a másik kimenet vár.
  1. #include <xc.h>
  2. #define _XTAL_FREQ 20000000 //define crystal frequency to 20MHz
  3.  
  4.     // CONFIG
  5. #pragma config FOSC = XT     // Oscillator Selection bits (RC oscillator)
  6. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  7. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  8. #pragma config BOREN = OFF       // Brown-out Reset Enable bit (BOR disabled)
  9. #pragma config CP = OFF      // Flash Program Memory Code Protection bit (Code protection off)
  10.  
  11.  
  12. #define gomb RA0
  13.  
  14.  
  15.        
  16. void ido()
  17. {
  18.  
  19.     PORTBbits.RB5=1;
  20. __delay_ms(20000);
  21. PORTBbits.RB5=0;
  22.  
  23. }
  24.  
  25.        
  26. void main()
  27.     {
  28.      ADCON1 = 0x0F;
  29.         TRISB=0x00; //Port-B as Output
  30.         TRISA=0xFF; //RA as input
  31.        
  32.         while (1)
  33.         {
  34.  
  35.             if (gomb==1)
  36.             {
  37.                 ido()
  38.                 //__delay_ms(2000);
  39.                 PORTBbits.RB3=1;
  40.                 __delay_ms(10000);
  41.                 PORTBbits.RB3=0;
  42.             }
  43.             else
  44.             {
  45.                 PORTBbits.RB3=0;
  46.                 PORTBbits.RB5=0;
  47.             }
  48.  
  49.                        
  50.        }
  51.     }
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 19, 2021 /
 
Mennyire kell pontosnak lennie a 10 ill. 20 sec -nek?

Fel kell programozni egy timer -t periodikus megszakításkérésre. Minden kimenethez egy számlálót kell felvenni. Ha bekapcsolsz egy kimenetet, a hozzá tartozó számlálót a bekapcsolási időhöz tartozó értékre kell beállítani. A timer megszakítási rutinja figyeli a számlálókat, ha nem 0 az rétékük, csökkenti eggyel, ha így elérte a 0 -t, kikapcsolja a hozzá tartozó kimenetet.
(#) Bakman válasza Laja1 hozzászólására (») Ápr 19, 2021 /
 
Ha teljesül a feltétel:

A és B kimenetet bekapcsolod.
Vársz tíz másodpercet.
B kimenetet kikapcsolod.
Vársz tíz másodpercet.
A kimenetet kikapcsolod.

Szerencsésebb lenne Timer-rel megoldani, ahogy Hp41C írta, de úgy érzem, egyelőre ennyi is elég lesz a tanuláshoz. Ismertetett móddal az a baj, hogy a várakozás időtartama alatt nem csinál semmit a kontroller. Ha ez nem probléma, akkor hajrá!
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 20, 2021 /
 
Nem kell pontosnak lennie.
Csináltam egy Timer próbát, hogy működik-e. De valami nem teszik neki. Most ez csak annyit csinálna, hogy pár másodpercig aktív a kimenet. De nem akarja az igazságot.
  1. #include <xc.h>
  2. #define _XTAL_FREQ 200000 //define crystal frequency to 20MHz
  3.  
  4.     // CONFIG
  5. #pragma config FOSC = XT     // Oscillator Selection bits (RC oscillator)
  6. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  7. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  8. #pragma config BOREN = OFF       // Brown-out Reset Enable bit (BOR disabled)
  9. #pragma config CP = OFF      // Flash Program Memory Code Protection bit (Code protection off)
  10.  
  11.  
  12. //#define gomb RA0
  13.  
  14.  
  15.        
  16.  
  17.  
  18.  
  19. /*    PORTBbits.RB5=1;
  20. __delay_ms(20000);
  21. PORTBbits.RB5=0;*/
  22.  
  23.  
  24.  
  25.        
  26. void main()
  27.     {
  28.      ADCON1 = 0x0F;
  29.         TRISB=0x00; //Port-B as Output
  30.         TRISA=0xFF; //RA as input
  31.         T1CON=0x30;
  32.        
  33.         while (1)
  34.         {
  35.             TMR1H=0xD9;
  36.             TMR1L=0xDB;
  37.             T1CON.TMR1ON=1;
  38.             PIE1.TMR1IE=1;
  39.            
  40.          while(PIR1.TMR1IF==0);
  41.             T1CON.TMR1ON=0;
  42.             PIR1.TMR1IF=0;
  43.             PORTBbits.RB3=1;
  44.            /* if (gomb==1)
  45.             {
  46.                 ido()
  47.                 //__delay_ms(2000);
  48.                 PORTBbits.RB3=1;
  49.                 __delay_ms(10000);
  50.                 PORTBbits.RB3=0;
  51.             }
  52.             else
  53.             {
  54.                 PORTBbits.RB3=0;
  55.                 PORTBbits.RB5=0;
  56.             }*/
  57.  
  58.                        
  59.        }
  60.     }
(#) Zsora válasza Laja1 hozzászólására (») Ápr 20, 2021 /
 
Nem ártana engedélyezni a megszakításokat (a while(1) ciklus előtt).
  1. // megszakítások beállítása
  2.     PIE1bits.TMR1IE=1;              // Timer1 megszak. engedélyezés
  3.     PIR1bits.TMR1IF=0;              // Timer1 megszakításjelző törlése
  4.     INTCONbits.PEIE=1;              // periféria megszak. engedélyezés
  5.     INTCONbits.GIE=1;               // globális megszak. engedélyezés

Továbbá ha regiszterek bitjeire hivatkozol, akkor ne felejtsd el odaírni azt hogy 'bits', mint ahogy az a fenti példában is látható.
A hozzászólás módosítva: Ápr 20, 2021
(#) Hp41C válasza Zsora hozzászólására (») Ápr 21, 2021 /
 
Idézet:
„Nem ártana engedélyezni a megszakításokat (a while(1) ciklus előtt).”

Akkor meg kellene írni a megszakítás koszolgáló rutint is...

Én inkább a TMR1 bekapcsolását vinnén a while -on kívülre.
  1. unsigned char gomb1_sz;
  2.  
  3. ....
  4.         gomb1_sz = 0;
  5.         TMR1H=0xD9;
  6.         TMR1L=0xDB;
  7.         T1CON.TMR1ON=1;
  8.         PIE1.TMR1IE=1;
  9.         while (1)
  10.         {
  11.             if (gomb==1)
  12.             {
  13.                 PORTBbits.RB3=1;
  14.                 gomb1_sz = 240;
  15.             }
  16.  
  17.          if(PIR1.TMR1IF==1)
  18.          {
  19.            TMR1H=0xD9;
  20.            TMR1L=0xDB;
  21.             PIR1.TMR1IF=0;
  22.  
  23.             if (--gomb1_sz == 0)
  24.             {
  25.                   PORTBbits.RB3=0;
  26.             }
  27.           }


Ez így működhet, hiszen a főprogram gyakran lekérdezi a TMR1IF állapot bitet.
A hozzászólás módosítva: Ápr 21, 2021
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 21, 2021 /
 
Sajnos nálam ez nem működik.
(#) Hp41C válasza Laja1 hozzászólására (») Ápr 21, 2021 /
 
  1. if(PIR1.TMR1IF==1)
  2.          {
  3.            TMR1H=0xD9;
  4.            TMR1L=0xDB;
  5.             PIR1.TMR1IF=0;
  6.  
  7.             if (gomb1_sz)
  8.             {
  9.               if (--gomb1_sz == 0)
  10.               {
  11.                   PORTBbits.RB3=0;
  12.               }
  13.             }
  14.           }
A hozzászólás módosítva: Ápr 21, 2021
(#) Hp41C válasza Hp41C hozzászólására (») Ápr 21, 2021 /
 
A módosítással műkodik.

16F716.c
    
(#) Laja1 válasza Hp41C hozzászólására (») Ápr 21, 2021 /
 
A Te megoldásod nem működik nálam, de a tőletek kapott segítségekből összeraktam a saját elképzelésemet és ez így tökéletes. Most még csak annyit tud, hogy az egyik kimenet a nyomógombra azonnal magas lesz, egy másik csak később. A többi szükséges verziót már össze tudom hozni. Köszönöm!
  1. #include <xc.h>
  2. #define _XTAL_FREQ 20000000 //define crystal frequency to 20MHz
  3.  
  4. // CONFIG
  5. #pragma config FOSC = XT     // Oscillator Selection bits (RC oscillator)
  6. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  7. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  8. #pragma config BOREN = OFF       // Brown-out Reset Enable bit (BOR disabled)
  9. #pragma config CP = OFF      // Flash Program Memory Code Protection bit (Code protection off)
  10.  
  11.  
  12. #define gomb RA0
  13. int k=0;
  14.  
  15. void main() {
  16.     ADCON1 = 0x0F;
  17.     TRISB = 0x00; //Port-B as Output
  18.     TRISA = 0xFF; //RA as input
  19.     T1CON = 0x30;
  20.  
  21.     // megszakítások beállítása
  22.     /* PIE1bits.TMR1IE=1;              // Timer1 megszak. engedélyezés
  23.      PIR1bits.TMR1IF=0;              // Timer1 megszakításjelző törlése
  24.      INTCONbits.PEIE=1;              // periféria megszak. engedélyezés
  25.      INTCONbits.GIE=1;            */   // globális megszak. engedélyezés  
  26.        
  27.         TMR1H=0xD9;
  28.         TMR1L=0xDB;
  29.            
  30.      
  31.        
  32.         T1CONbits.TMR1ON=0;    
  33.        PIR1bits.TMR1IF=0;
  34.        
  35.     while (1)
  36.     {
  37.            
  38.       if (gomb==1)
  39.       {
  40.           PORTBbits.RB3=1;
  41.            T1CONbits.TMR1ON=1;}
  42.          
  43.      
  44.            
  45.       if (PIR1bits.TMR1IF==1)
  46.      { PIR1bits.TMR1IF=0;
  47.          TMR1H=0xD9;
  48.         TMR1L=0xDB;
  49.          
  50.          k=k+1;
  51.          if (k==30)
  52.          {
  53.           PORTBbits.RB5=1;  
  54.          }
  55.      
  56.          
  57.       }
  58.       }
  59.     }
(#) Laja1 válasza Laja1 hozzászólására (») Ápr 21, 2021 /
 
Csak még az nem világos, ha a számlálót úgy töltöm fel, hogy 1 sec alatt csorduljon túl, akkor a k értéke miért nem másodperceket jelent. Beállítások: 2 MHz, Fosc=2/4=0,5 MHz. Prescaler:1:8. Így egy sec alatt 62500 művelet van. Tehát 3035-re töltöttem fel. Így 1 sec alatt túlcsordul, így ha k=10-nél akarok kapcsolni, akkor a szimulátor szerint az nem 10 sec múlva kapcsol, hanem kb. 14 sec múlva. K=30-nál pedig kb. 38 sec-nál. Nem értem miért.
Következő: »»   148 / 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