Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   82 / 153
(#) pepe1125 válasza Hp41C hozzászólására (») Szept 19, 2013 /
 
Több szem többet lát. Egyből meglátsz ilyen lehetőségeket. ÉN MEG NEM! :@

Köszönöm nagyon a hozzászólást! Javítottam is.

Találtam egy ilyet:
  1. int szamlalo = 0;
  2.  
  3. void megszakitas(){
  4.   if(INTCON.INTF == 1 ){
  5.     szamlalo++;
  6.     INTCON.INTF = 0;
  7.   }
  8. }


Az INTF-et aláhúzza a fordító... Na gondolom, hogy az én PIC18F252-nek megfelelő interrupt kellene, igaz? Ezt az adatlapjában találom, azaz nem találom...
(#) Attila86 hozzászólása Szept 19, 2013 /
 
Na most akkor szükségem lenne olyan késleltető rutinra amit ms-onként tudok beállítani. 32MHz-es kvarccal megy egyébként a PIC így ehhez kellene. Nézegettem a neten de nem találok. Ami érdekes mert assembly kódot fél perc alatt találtam mikor anno az kellett.
(#) Hp41C válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
A C18 nem szereti a hosszú és kacifántos elérési utakat.
Idézet:
„D:\Elektronika\Projektek\Projektek-2013\PIC-es panelmero III - C\PIC-es panelmero III - C.mcp”

Majdnem biztosan kiakadáshoz fog vezetni...
Nem akarlak nadyon lelombozni:
- C18 nem támogatja a 32 bitnél hosszabb számábrázolást, kínszenvedés lesz megcsináni. Még szerencse, hogy az if (STATUSbits.C) működik...
- Amit Potyo írt a függvények paraméterezéséről, visszatérési értékeiről, az szép és egyszerűen leírható, de a kontroller ugyan azt fogja csinálni, amit az assembly megoldás: Átmeneti globális (ACCESS RAM) változókba fogja másolni vagy software stack -re teszi a paraméreteket és a visszatérési értékeket - hosszabb, lassabb kódot eredményezhet. Ha egy utasítás "túl" bonyolult megint csak átmeneti változólat fog használni.
LATCbits.LATC5 = PORTAbits.RA2 sokkal hoszzabb, mint az
  1. if (PORTAbits.RA2) LATCbits.LATC5 = 1;
  2.  if (!PORTAbits.RA2) LATCbits.LATC5 = 0;

ami csak 4 utasítás...
- "Ha átváltasz assemblyre, akkor ott minden úgy fog történni, ahogy assemblyben megszoktad." Ha egy C függvényben a fordító meglát egy _asm -mel kezdődő sort, a függvényben nem optimalizál. Ha ez egy jó hosszú példány (main, isr, stb.) volt, akkor nagy marad a kód.

Egyszóval igencsak előfordulhat, hogy nem fog beférni C -ben megírva az összes funkció, ha az assembly megoldás kitöltötte a kontroller harmadát - felét. Jobb ezt előre tudni, és egyből nagyobb kontrollerre kezdeni. Ha nincs nagyobb memóriájú kompatibilis kontroller... marad az assembly.
A hozzászólás módosítva: Szept 19, 2013
(#) Hp41C válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
#define Fosc 32000000L // 32MHz
#include <delays.h>
_delay_ms(3);
A hozzászólás módosítva: Szept 19, 2013
(#) Attila86 válasza Hp41C hozzászólására (») Szept 19, 2013 /
 
Idézet:
„Error - could not find definition of symbol '_delay_ms' in file './PIC-es panelmero III - C.o'.”
(#) Hp41C válasza Hp41C hozzászólására (») Szept 19, 2013 /
 
Ez szép és jó lenne, ha a Mc konzekvens lenne a fordítóiban..
Most nézem, hogy a C18 -ban más delay megoldások vannak:
  1. #ifndef __DELAYS_H
  2. #define __DELAYS_H
  3.  
  4. /* PIC18 cycle-count delay routines.
  5.  *
  6.  *   Functions:
  7.  *               Delay1TCY()
  8.  *               Delay10TCY()  // 17Cxx only
  9.  *               Delay10TCYx()
  10.  *               Delay100TCYx()
  11.  *               Delay1KTCYx()
  12.  *               Delay10KTCYx()
  13.  */
  14.  
  15. /* For definition of Nop() */
  16. #include <p18cxxx.h>
  17.  
  18. /* Delay of exactly 1 Tcy */
  19. #define Delay1TCY() Nop()
  20.  
  21. #define PARAM_SCLASS auto
  22.  
  23. /* Delay of exactly 10 Tcy */
  24. #define Delay10TCY() Delay10TCYx(1)
  25.  
  26. /* Delay10TCYx
  27.  * Delay multiples of 10 Tcy
  28.  * Passing 0 (zero) results in a delay of 2560 cycles.
  29.  * The 18Cxxx version of this function supports the full range [0,255]
  30.  * The 17Cxxx version supports [2,255] and 0.
  31.  */
  32. void Delay10TCYx(PARAM_SCLASS unsigned char);
  33.  
  34. /* Delay100TCYx
  35.  * Delay multiples of 100 Tcy
  36.  * Passing 0 (zero) results in a delay of 25,600 cycles.
  37.  * The full range of [0,255] is supported.
  38.  */
  39. void Delay100TCYx(PARAM_SCLASS unsigned char);
  40.  
  41. /* Delay1KTCYx
  42.  * Delay multiples of 1000 Tcy
  43.  * Passing 0 (zero) results in a delay of 256,000 cycles.
  44.  * The full range of [0,255] is supported.
  45.  */
  46. void Delay1KTCYx(PARAM_SCLASS unsigned char);
  47.  
  48. /* Delay10KTCYx
  49.  * Delay multiples of 10,000 Tcy
  50.  * Passing 0 (zero) results in a delay of 2,560,000 cycles.
  51.  * The full range of [0,255] is supported.
  52.  */
  53. void Delay10KTCYx(PARAM_SCLASS unsigned char);
  54.  
  55. #endif
A hozzászólás módosítva: Szept 19, 2013
(#) Attila86 válasza Hp41C hozzászólására (») Szept 19, 2013 /
 
Idézet:
„C18 nem támogatja a 32 bitnél hosszabb számábrázolást, kínszenvedés lesz megcsináni.”

Az assembly-nél mindenképp jobb lesz az biztos. De egyébként van másik C fordító ami 18F-es PIC-ekhez jó és támogatja 32 bitnél nagyobb számábrázolást? Mert még szinte sehol nem tartok, úgyhogy ha van jobb akkor legyen az!
Idézet:
„Egyszóval igencsak előfordulhat, hogy nem fog beférni C -ben megírva az összes funkció, ha az assembly megoldás kitöltötte a kontroller harmadát - felét.”

Hát, a DC-t mérő panelmérőm asm programja a 18F25K80 programmemóriáját kb harmadában lefoglalja (5755/16384). De úgy gondoltam hogy a kritikus részeket asm-ben írnám úgyis. Csak az hogy nem kell bájtonként összeadnom, kivonnom, szoroznom, összehasonlítanom, hatalmas segítség lenne. És nem is az egyszerűbb programozás miatt mert megírok én asm-ben szinte bármit, csak nagyon nehezen átlátható a végeredmény. Igazából az átláthatósága miatt érdekel a C.
Idézet:
„A C18 nem szereti a hosszú és kacifántos elérési utakat.”

Hát az ő kedvéért nem fogom átírni a számítógépemen a könyvtárszerkezetet. Az assembly-nél is mindig mikor bemásoltam ide a fórumba kódrészleteket akkor mindenki rögtön lekiabálta a fejemet hogy ne írjak áéöőüűú betűket a címkéknek meg a regisztereknek, de SOHA nem okozott ez problémát.
A fájlnevet átírom majd rövidebbre és szóközmentesre azért. Az első alkalomkor amikor kiderül hogy ez okoz hibát akkor megkövetlek benneteket és létrehozok egy külön mappát a C programjaimnak ami rövid lesz és nem lesz benne speciális karakter. Az assembly-nél ugyan így voltam az ékezetes karakterekkel, aztán azóta is várom az alkalmat (hogy hibát okozzon).
(#) Attila86 válasza (Felhasználó 15355) hozzászólására (») Szept 19, 2013 /
 
Idézet:
„Error - could not find definition of symbol 'Delay_ms' in file './PIC-es panelmero III - C.o'.”
(#) Hp41C válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Elfogadom, hogy nem hiszel a tanácsomnak...
Ajánlom, hogy alaposan olvasgasd az alábbi linken levő topikot:
Microchip forum C18 topic
Különös tekintettel az alábbira:
Source file path exceeds 62 characters
D:\Elektronika\Projektek\Projektek-2013\PIC-es panelmero III - C\PIC-es panelmero III - C:
A path 65, a file névével együtt 91 karakter.

Idézet:
„Hát az ő kedvéért nem fogom átírni a számítógépemen a könyvtárszerkezetet.”

Egyszer kelljen átvinned az ilyen könyvtáerszerkezetet más operációs rendszerre. Kipróbáltam ... nem egy élvezet.
A hozzászólás módosítva: Szept 19, 2013
(#) Hp41C válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Sajnos csak az XC8 ismeri a _delay_ms -t, a C18 csak az itt látható delay -eket ismeri.
A hozzászólás módosítva: Szept 19, 2013
(#) Attila86 hozzászólása Szept 19, 2013 /
 
Idézet:
„van másik C fordító ami 18F-es PIC-ekhez jó és támogatja 32 bitnél nagyobb számábrázolást? Mert még szinte sehol nem tartok, úgyhogy ha van jobb akkor legyen az!”

Erre kérlek válaszoljatok mert addig inkább bele sem kezdek semmibe.
(#) potyo válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Én nem találkoztam még ilyennel...
(#) Attila86 válasza potyo hozzászólására (») Szept 19, 2013 /
 
Oké. Akkor maradjak a C18-nál? Vagy most olvasgattam erről a HI-TECH C-ről, az jobb lenne? A Kónya-könyv azt írja hogy az nem 18F-ekhez van kitalálva de a net mást mond.
(#) potyo válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Volt Hi-Tech 18F-re is, bár kevésbé volt elteredt, mert 18F-re volt gyári fordító is. Viszont a Microchip néhány éve megvette a komplett Hi-Tech céget, és elvileg a Hi-Tech fordítóból keletkezett az XC8 néven árult fordító, amivel immár az összes 8 bites kontrollerre lehet fordítani. Tehát jelen állás szerint van a C18 és az XC8 18F-re, de kb. ugyanazt tudja mindkettő.
(#) _vl_ válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Hi-Tech C gyakorlatilag már nincs. Felvásárolta a Microchip a céget, a termékeit beleolvasztotta a saját termékeibe (ami konkrétan a C18 volt - tehát azt se fejlesztik már ezen a néven), így most már csak XC8 van, az örökölte mindazt, amit a Microchip és a Hi-Tech összekalapált a 8-bites PIC-ekhez.
Ezen felül van még a CCS meg a mikroC, mindkettő pénzes, és megvan a maguk baja (a CCS-nek az, hogy a világon semmivel se kompatibilis, C-nek is csak erős túlzással nevezhető; a mikroC-nek meg az, hogy kevesen használják, ezért bétatesztelőnek is jelentkezik, aki használja).
Létezik még az SDCC nevű open source cucc, ami nem rossz, de messze van még attól, hogy az XC8 kihívója lehessen. Cserébe azt írsz bele a forrásába, amit kedved tartja, már persze ha az idő és a tudás hiánya nem gátol meg benne.

Ha engem kérdezel, XC8, mivel annak van értelmes jövője (C18-ból és a legutolsó Hi-Tech fordítóból már nem lesz új release). A free mode-járól már többen értekeztek, szerintem nem sok mindenre jó.
(#) Attila86 válasza _vl_ hozzászólására (») Szept 19, 2013 /
 
Na, akkor legyen ez az XC8 és akkor ígérem létrehozok neki egy barátságosabb elérési utat!
És akkor most jön megint az a rész amikor valaki rám ír privátban hogy honnan lehet ezt az XC8 fordítót költséghatékonyan beszerezni.
(#) Hp41C válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Bocsánat, hogy már megint én... Bővebben: Link
(#) pepe1125 válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
HI-TECH PIC18 teljes verzióban elég komoly... De nekem nagyon magas a használata.
(#) Attila86 válasza pepe1125 hozzászólására (») Szept 19, 2013 /
 
Assemby-ül tudsz?
(#) pepe1125 válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Mondjuk azt, hogy programoztam már MCU-t assembly-ben, alap dolgokat átlátok, de például egy kijelző vezérlést kicsit nehézkes volt megírnom... Amikor írtam vagy 100 sort és az eredményül kiírta nekem a kijelzőre, hogy REKA, akkor már boldog voltam. De túl sokat kell dolgozni benne. Úgyhogy inkább a C nyelv.
(#) pepe1125 hozzászólása Szept 20, 2013 /
 
Sajnos nem bírok vele. Valaki segítsen...

Mindig újraindul a gépezet miután kiírja a demo szöveget az LCD-re és indulna az időzítő...
Hol rontom el?

  1. // Lcd beállítása
  2.  
  3. sbit LCD_RS at LATC7_bit;
  4. sbit LCD_RW at LATC6_bit;
  5. sbit LCD_EN at LATC5_bit;
  6. sbit LCD_D4 at LATB4_bit;
  7. sbit LCD_D5 at LATB5_bit;
  8. sbit LCD_D6 at LATB6_bit;
  9. sbit LCD_D7 at LATB7_bit;
  10.  
  11. sbit LCD_RS_Direction at TRISC7_bit;
  12. sbit LCD_EN_Direction at TRISC5_bit;
  13. sbit LCD_RW_Direction at TRISC6_bit;
  14. sbit LCD_D4_Direction at TRISB4_bit;
  15. sbit LCD_D5_Direction at TRISB5_bit;
  16. sbit LCD_D6_Direction at TRISB6_bit;
  17. sbit LCD_D7_Direction at TRISB7_bit;
  18.  
  19. sbit LCD_BCK at LATB3_bit;
  20. sbit LCD_BCK_Direction at TRISB3_bit;
  21.  
  22. // Lcd beéllítás vége
  23.  
  24.  
  25. unsigned long int ADC_Value1, ADC_Value2, Voltage, Ampere, POWER;
  26. unsigned szamlalo, tick;
  27.  
  28. char *display_v1 = "U=00.0V";
  29. char *display_v2 = "I=00.0A";
  30. char *display_v3 = "POWER  =>   000W";
  31.  
  32. char txt2[] = " SP LCD POWER ";
  33. char txt3[] = "ver 1.1";
  34.  
  35.  
  36.  
  37.  
  38. void megszakitas(){
  39.   if(TMR0IF_bit){
  40.     szamlalo++;
  41.     TMR0IF_bit = 0;
  42.     TMR0L   = 0;
  43.  
  44.   }
  45. }
  46.  
  47.  
  48. void main() {
  49.  
  50.      ADC_init();
  51.  
  52.      TRISA = 0b00001011;
  53.      TRISB = 0b00000000;
  54.      TRISC = 0b00000000;
  55.  
  56.     // ADCON1=0x05;   // Külső referencia (Vref+) ha szükséges
  57.  
  58.      LCD_RW_Direction = 0;
  59.      LCD_RW = 0;
  60.  
  61.      delay_ms(50);
  62.  
  63.      Lcd_Init();
  64.      Lcd_Cmd(_LCD_CLEAR);
  65.      Lcd_Cmd(_LCD_CURSOR_OFF);
  66.  
  67.      LCD_BCK_Direction = 0;
  68.      LCD_BCK = 1; // LCD háttérvilágítás bekapcsolása...
  69.  
  70.   Lcd_Out(1,2,txt2);             // DEMO szöveg kiiratása
  71.   Lcd_Out(2,5,txt3);             // DEMO szöveg kiiratása
  72.  
  73.   Delay_ms(2000);
  74.  
  75.   Lcd_Cmd(_LCD_CLEAR);
  76.  
  77.  
  78. // Megszakítás és időzítő beállítása
  79.  
  80.      TMR0ON_bit = 0;      // TMR0 kikapcs
  81.      INTCON = 0xA0;       // megszakítás engedélyezése TMR0-án
  82.      TMR0IE_bit = 1;      // TMR0 Overflow Interrupt Flag bit
  83.      T08BIT_bit = 1;      // TMR0 8bites
  84.      T0CS_bit = 0;        // Timer0 Clock Source Select bit
  85.      PSA_bit = 0;         // prescaler
  86.  
  87.      // prescaler
  88.      // 111 = 1:256 Prescale value
  89.      // 110 = 1:128 Prescale value
  90.      // 101 = 1:64 Prescale value
  91.      // 100 = 1:32 Prescale value
  92.      // 011 = 1:16 Prescale value
  93.      // 010 = 1:8 Prescale value
  94.      // 001 = 1:4 Prescale value
  95.      // 000 = 1:2 Prescale value
  96.      T0PS0_bit = 1;
  97.      T0PS1_bit = 1;
  98.      T0PS2_bit = 1;
  99.      
  100.      TMR0L   = 0;
  101.  
  102.      szamlalo = 0;
  103.      tick = 0;
  104.      
  105.      TMR0ON_bit = 1;      // időzítő indítása
  106.  
  107.  
  108. do {
  109.  
  110.  
  111.    ADC_Value1 = ADC_Read(0);
  112.    Voltage = (50 * 10 * ADC_Value1) / 1023 ;    // AD értékének Feszültséggé alakítása
  113.  
  114.    ADC_Value2 = ADC_Read(1);
  115.    Ampere = (50 * 4 * ADC_Value2) / 1023;    // AD értékének Árammá alakítása
  116.  
  117.    POWER = (Voltage * Ampere) / 100;      // Teljesítmény számítás
  118.  
  119.  
  120.    display_v1[2] = (Voltage /100) +48 ;
  121.    display_v1[3] = (Voltage /10)%10 +48;
  122.    display_v1[5] =  Voltage %10 +48;
  123.  
  124.    Lcd_Out(1,1,display_v1);
  125.  
  126.    display_v2[2] = (Ampere /100) +48 ;
  127.    display_v2[3] = (Ampere /10)%10 +48;
  128.    display_v2[5] =  Ampere %10 +48;
  129.  
  130.    Lcd_Out(1,10,display_v2);
  131.  
  132.    //display_v3[11] = POWER /1000 +48 ; // Ha szükséges 4 számjegyű kijelzés 1000W felett...
  133.    display_v3[12] = (POWER /100)%10 +48;
  134.    display_v3[13] = (POWER /10)%10 +48;
  135.    display_v3[14] =  POWER %10 +48;
  136.    
  137.    Lcd_Out(2,1,display_v3);
  138.  
  139.  
  140.    if (POWER >= 800){                    // 800W felett a háttérvilágítás majd villogna valamitől
  141.  
  142.  
  143.           LCD_BCK = 0;
  144.  
  145.      }
  146.  
  147.   } while(1);
  148.  
  149. }
(#) Hp41C válasza pepe1125 hozzászólására (») Szept 20, 2013 /
 
Watchdog?
(#) pepe1125 válasza Hp41C hozzászólására (») Szept 20, 2013 /
 
WATCHDOG ki van offolva...

De azóta már rájöttem arra, hogy ha azt írom
  1. void megszakitas()
akkor nem tetszik a fordítónak. Viszont ha angolba átmegyek és
  1. void interrupt()
nem problémázik és sikerült is megoldani a dolgot elvileg. Most meg letöltve a PIC-re működik a program, de amikor elérem a 800 W villogás határát elkezd az AD megbolondulni és ugrál a mért érték... :S


Jelenleg így tudtam megoldani. Biztos van ettől jobb megoldás is, csak még én nem tudom.

  1. // Lcd beállítása
  2.  
  3. sbit LCD_RS at LATC7_bit;
  4. sbit LCD_RW at LATC6_bit;
  5. sbit LCD_EN at LATC5_bit;
  6. sbit LCD_D4 at LATB4_bit;
  7. sbit LCD_D5 at LATB5_bit;
  8. sbit LCD_D6 at LATB6_bit;
  9. sbit LCD_D7 at LATB7_bit;
  10.  
  11. sbit LCD_RS_Direction at TRISC7_bit;
  12. sbit LCD_EN_Direction at TRISC5_bit;
  13. sbit LCD_RW_Direction at TRISC6_bit;
  14. sbit LCD_D4_Direction at TRISB4_bit;
  15. sbit LCD_D5_Direction at TRISB5_bit;
  16. sbit LCD_D6_Direction at TRISB6_bit;
  17. sbit LCD_D7_Direction at TRISB7_bit;
  18.  
  19. sbit LCD_BCK at LATB3_bit;
  20. sbit LCD_BCK_Direction at TRISB3_bit;
  21.  
  22. // Lcd beéllítás vége
  23.  
  24.  
  25. unsigned long int ADC_Value1, ADC_Value2, Voltage, Ampere, POWER;
  26. unsigned szamlalo, tick;
  27.  
  28. char *display_v1 = "U=00.0V";
  29. char *display_v2 = "I=00.0A";
  30. char *display_v3 = "POWER  =>   000W";
  31.  
  32. char txt2[] = " SP LCD POWER ";
  33. char txt3[] = "ver 1.2";
  34.  
  35.  
  36.  
  37.  
  38. void interrupt(){
  39.   if(TMR0IF_bit){
  40.     szamlalo++;
  41.     TMR0IF_bit = 0;
  42.     TMR0L   = 0;
  43.  
  44.   }
  45. }
  46.  
  47. void main() {
  48.  
  49.      ADC_init();
  50.  
  51.      TRISA = 0b00000011;
  52.      TRISB = 0b00000000;
  53.      TRISC = 0b00000000;
  54.  
  55.     // ADCON1=0x05;   // Külső referencia (Vref+) ha szükséges
  56.  
  57.      LCD_RW_Direction = 0;
  58.      LCD_RW = 0;
  59.  
  60.      delay_ms(50);
  61.  
  62.      Lcd_Init();
  63.      Lcd_Cmd(_LCD_CLEAR);
  64.      Lcd_Cmd(_LCD_CURSOR_OFF);
  65.  
  66.      LCD_BCK_Direction = 0;
  67.      LCD_BCK = 1; // LCD háttérvilágítás bekapcsolása...
  68.  
  69.   Lcd_Out(1,2,txt2);             // DEMO szöveg kiiratása
  70.   Lcd_Out(2,5,txt3);             // DEMO szöveg kiiratása
  71.  
  72.   Delay_ms(3000);
  73.  
  74.   Lcd_Cmd(_LCD_CLEAR);
  75.  
  76.  
  77. // Megszakítás és időzítő beállítása
  78.  
  79.      TMR0ON_bit = 0;      // TMR0 kikapcs
  80.      INTCON = 0xA0;       // megszakítás engedélyezése TMR0-án
  81.      TMR0IE_bit = 1;      // TMR0 Overflow Interrupt Flag bit
  82.      T08BIT_bit = 1;      // TMR0 8bites
  83.      T0CS_bit = 0;        // Timer0 Clock Source Select bit
  84.      PSA_bit = 0;         // prescaler
  85.  
  86.      // prescaler
  87.      // 111 = 1:256 Prescale value
  88.      // 110 = 1:128 Prescale value
  89.      // 101 = 1:64 Prescale value
  90.      // 100 = 1:32 Prescale value
  91.      // 011 = 1:16 Prescale value
  92.      // 010 = 1:8 Prescale value
  93.      // 001 = 1:4 Prescale value
  94.      // 000 = 1:2 Prescale value
  95.      T0PS0_bit = 1;
  96.      T0PS1_bit = 1;
  97.      T0PS2_bit = 1;
  98.      
  99.      TMR0L   = 0;
  100.  
  101.      szamlalo = 0;
  102.      tick = 0;
  103.      
  104.      TMR0ON_bit = 1;      // időzítő indítása
  105.  
  106.  
  107. do {
  108.  
  109.  
  110.    ADC_Value1 = ADC_Read(0);
  111.    Voltage = (50 * 10 * ADC_Value1) / 1023 ;    // AD értékének Feszültséggé alakítása
  112.  
  113.    ADC_Value2 = ADC_Read(1);
  114.    Ampere = (50 * 4 * ADC_Value2) / 1023;    // AD értékének Árammá alakítása
  115.  
  116.    POWER = (Voltage * Ampere) / 100;      // Teljesítmény számítás
  117.  
  118.  
  119.    display_v1[2] = (Voltage /100) +48 ;
  120.    display_v1[3] = (Voltage /10)%10 +48;
  121.    display_v1[5] =  Voltage %10 +48;
  122.  
  123.    Lcd_Out(1,1,display_v1);
  124.  
  125.    display_v2[2] = (Ampere /100) +48 ;
  126.    display_v2[3] = (Ampere /10)%10 +48;
  127.    display_v2[5] =  Ampere %10 +48;
  128.  
  129.    Lcd_Out(1,10,display_v2);
  130.  
  131.    //display_v3[11] = POWER /1000 +48 ; // Ha szükséges 4 számjegyű kijelzés 1000W felett...
  132.    display_v3[12] = (POWER /100)%10 +48;
  133.    display_v3[13] = (POWER /10)%10 +48;
  134.    display_v3[14] =  POWER %10 +48;
  135.    
  136.    Lcd_Out(2,1,display_v3);
  137.  
  138.    if (szamlalo >= 9){
  139.    LCD_BCK = 1;
  140.    szamlalo=0;
  141.    }
  142.  
  143.    if ((POWER >= 800)&&(szamlalo == 8)){       // 800W felett a háttérvilágítás majd villog
  144.    LCD_BCK = ~LCD_BCK;
  145.    szamlalo=0;
  146.    }
  147.  
  148.  
  149.  
  150.   } while(1);
  151.  
  152. }
(#) potyo válasza pepe1125 hozzászólására (») Szept 20, 2013 / 1
 
Mondjuk azt nem ártana megmondani a fordítónak, hogy a megszakítás vagy interrupt nevű függvény az a megszakítási rutin akar lenni. Milyen fordító is ez?
(#) pepe1125 válasza potyo hozzászólására (») Szept 20, 2013 /
 
Ez a hú de szuper mikroC fordítója... Kénytelen vagyok ezt használni, mert van benne LCD kezelő függvény ami sokat segített, mert MPLAB C18 fordítója, meg a HI-TECH is kifogott rajtam. Találtam itt hobbielektronikán LCD drivert C18 fordítóhoz, háát... Valamit vagy nem jól csináltam, de kiírta a szöveget, viszont bevillantak ilyen extra karakterek, meg furcsán működtette a kijelzőt. Úgyhogy a mikroC mellett kellett dönteni. De ha segítséget kapok, akkor biztos átszervezném C18-ra a mostani programot. Egyébként most szépen működik minden a jelenlegi állás szerint. Annyi van, hogy rájöttem ha ilyen nagy számokat osztok be, pontosabb eredményt kapok. Ha a nullákat lefaragom akkor pontatlanabb az eredmény.

Még annyit szeretnék, hogy lehetne megoldani azt, hogy a nullák a kijelzőn ne jelenjenek meg, csak akkor amikor épp arra a helyiértékre is szükség van. Tehát ne 001W legyen kiírva, hanem csak 1W.

  1. // Lcd beállítása
  2.  
  3. sbit LCD_RS at LATC7_bit;
  4. sbit LCD_RW at LATC6_bit;
  5. sbit LCD_EN at LATC5_bit;
  6. sbit LCD_D4 at LATB4_bit;
  7. sbit LCD_D5 at LATB5_bit;
  8. sbit LCD_D6 at LATB6_bit;
  9. sbit LCD_D7 at LATB7_bit;
  10.  
  11. sbit LCD_RS_Direction at TRISC7_bit;
  12. sbit LCD_EN_Direction at TRISC5_bit;
  13. sbit LCD_RW_Direction at TRISC6_bit;
  14. sbit LCD_D4_Direction at TRISB4_bit;
  15. sbit LCD_D5_Direction at TRISB5_bit;
  16. sbit LCD_D6_Direction at TRISB6_bit;
  17. sbit LCD_D7_Direction at TRISB7_bit;
  18.  
  19. sbit LCD_BCK at LATB3_bit;
  20. sbit LCD_BCK_Direction at TRISB3_bit;
  21.  
  22. // Lcd beéllítás vége
  23.  
  24.  
  25. unsigned long long ADC_Value1, ADC_Value2, Voltage, Ampere, POWER;
  26. unsigned szamlalo, tick;
  27.  
  28. char *display_v1 = "U=00.0V";
  29. char *display_v2 = "I=00.0A";
  30. char *display_v3 = "POWER =>   0000W";
  31.  
  32. char txt2[] = " SP LCD POWER ";
  33. char txt3[] = "ver 1.2";
  34.  
  35.  
  36.  
  37.  
  38. void interrupt(){
  39.   if(TMR0IF_bit){
  40.     szamlalo++;
  41.     TMR0IF_bit = 0;
  42.     TMR0L   = 0;
  43.  
  44.   }
  45. }
  46.  
  47. void main() {
  48.  
  49.      ADC_init();
  50.  
  51.      TRISA = 0b00000011;
  52.      TRISB = 0b00000000;
  53.      TRISC = 0b00000000;
  54.  
  55.     // ADCON1=0x05;   // Külső referencia (Vref+) ha szükséges
  56.  
  57.      LCD_RW_Direction = 0;
  58.      LCD_RW = 0;
  59.  
  60.      delay_ms(50);
  61.  
  62.      Lcd_Init();
  63.      Lcd_Cmd(_LCD_CLEAR);
  64.      Lcd_Cmd(_LCD_CURSOR_OFF);
  65.  
  66.      LCD_BCK_Direction = 0;
  67.      LCD_BCK = 1; // LCD háttérvilágítás bekapcsolása...
  68.  
  69.   Lcd_Out(1,2,txt2);             // DEMO szöveg kiiratása
  70.   Lcd_Out(2,5,txt3);             // DEMO szöveg kiiratása
  71.  
  72.   Delay_ms(3000);
  73.  
  74.   Lcd_Cmd(_LCD_CLEAR);
  75.  
  76.  
  77. // Megszakítás és időzítő beállítása
  78.  
  79.      TMR0ON_bit = 0;      // TMR0 kikapcs
  80.      INTCON = 0xA0;       // megszakítás engedélyezése TMR0-án
  81.      TMR0IE_bit = 1;      // TMR0 Overflow Interrupt Flag bit
  82.      T08BIT_bit = 1;      // TMR0 8bites
  83.      T0CS_bit = 0;        // Timer0 Clock Source Select bit
  84.      PSA_bit = 0;         // prescaler
  85.  
  86.      // prescaler
  87.      // 111 = 1:256 Prescale value
  88.      // 110 = 1:128 Prescale value
  89.      // 101 = 1:64 Prescale value
  90.      // 100 = 1:32 Prescale value
  91.      // 011 = 1:16 Prescale value
  92.      // 010 = 1:8 Prescale value
  93.      // 001 = 1:4 Prescale value
  94.      // 000 = 1:2 Prescale value
  95.      T0PS0_bit = 1;
  96.      T0PS1_bit = 1;
  97.      T0PS2_bit = 1;
  98.      
  99.      TMR0L   = 0;
  100.  
  101.      szamlalo = 0;
  102.      tick = 0;
  103.      
  104.      TMR0ON_bit = 1;      // időzítő indítása
  105.  
  106.  
  107. do {
  108.  
  109.  
  110.    ADC_Value1 = ADC_Read(0);
  111.    Voltage = (5000 * 10 * ADC_Value1) / 1023 ;    // AD értékének Feszültséggé alakítása
  112.  
  113.    ADC_Value2 = ADC_Read(1);
  114.    Ampere = (5000 * 4 * ADC_Value2) / 1023;    // AD értékének Árammá alakítása
  115.  
  116.    POWER = (Voltage * Ampere) / 1000000;      // Teljesítmény számítás
  117.  
  118.  
  119.    display_v1[2] = (Voltage /10000) +48 ;
  120.    display_v1[3] = (Voltage /1000)%10 +48;
  121.    display_v1[5] = (Voltage /100) %10 +48;
  122.  
  123.    Lcd_Out(1,1,display_v1);
  124.  
  125.    display_v2[2] = (Ampere /10000) +48 ;
  126.    display_v2[3] = (Ampere /1000)%10 +48;
  127.    display_v2[5] = (Ampere /100) %10 +48;
  128.  
  129.    Lcd_Out(1,10,display_v2);
  130.  
  131. // display_v3[8] =  (POWER /100000)%10 +48;
  132. // display_v3[9] =  (POWER /10000) +48;
  133.    display_v3[11] = (POWER /1000) +48;
  134.    display_v3[12] = (POWER /100)%10 +48;
  135.    display_v3[13] = (POWER /10)%10 +48;
  136.    display_v3[14] = (POWER /1)%10 +48;
  137.    
  138.    Lcd_Out(2,1,display_v3);
  139.  
  140.    if (szamlalo >= 10){
  141.    LCD_BCK = 1;
  142.    szamlalo=0;
  143.    }
  144.  
  145.    if ((POWER >= 800)&&(szamlalo == 8)){       // 800W felett a háttérvilágítás majd villog
  146.    LCD_BCK = ~LCD_BCK;
  147.    szamlalo=0;
  148.    }
  149.  
  150.   } while(1);
  151.  
  152. }
(#) janimester hozzászólása Szept 23, 2013 /
 
Üdv. C-ben írok egy proramot amely körülbelül 15 ledet futtat végig majd vissza az első ledig és elalszik. De stack overflow üzenettel a szimulátor nem tudja működtetni a programot. Valamilyen túlcsordulás azt tudom de hogy miként kéne orvosolnom hogy ennyi lábat ki és be tudjak kapcsolni elég gyorsan azt nem tudom
(#) watt válasza janimester hozzászólására (») Szept 23, 2013 /
 
Valószínű rossz a program...
(#) janimester válasza watt hozzászólására (») Szept 23, 2013 /
 
Értem, bemásolom hogy próbálkoztam eddig:
  1. void main() {
  2.  
  3.  TRISB = 0;                            // PORTB all output to LED
  4.  PORTB = 0;
  5.  
  6.  PORTB.F7 = 1;
  7.  delay_ms(100);
  8.  PORTB.F6 = 1;
  9.  delay_ms(100);
  10.  PORTB.F5 = 1;
  11.  delay_ms(100);
  12.  PORTB.F4 = 1;
  13.  delay_ms(100);
  14.  PORTB.F3 = 1;
  15.  delay_ms(100);
  16.  PORTB.F2 = 1;
  17.  delay_ms(100);
  18.  PORTB.F1 = 1;
  19.  delay_ms(100);
  20.  PORTD.F7 = 1;
  21.  delay_ms(100);
  22.  PORTD.F6 = 1;
  23.  delay_ms(100);
  24.  PORTC.F2 = 1;
  25.  delay_ms(100);
  26.  PORTC.F1 = 1;
  27.  delay_ms(100);
  28.  PORTC.F0 = 1;
(#) watt válasza janimester hozzászólására (») Szept 23, 2013 /
 
Ez így nem is fordul le, mert hiányzik a main lezáró kapcsos zárójel.
A másik, hogy ha azt szeretnéd, hogy valami folyamatosan működjön, akkor azt ciklusba kell szervezni, vagy ciklus magjába kell tenni. Ha csak egyszer akarod, hogy lefusson, akkor a művelet végére egy végtelen ciklust kell tenni, különben a program nem áll meg, elkóricál olyan memória területekre, ahol véletlenszerű parancsok vannak. Tehát ha csak egyszer akarod lefuttatni, akkor tegyél a 29. sorra egy while(1); -et.
(#) janimester válasza watt hozzászólására (») Szept 23, 2013 /
 
Bocsi, a programom ezzel kezdődik a többit és a kapcsos zárójelet már nem másoltam be. De hiába a while parancs ugyanúgy rossz Egyszer kell amúgy lefutnia a program elején.
Következő: »»   82 / 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