Fórum témák

» Több friss téma
Fórum » PIC programozás mikroC fejlesztőkörnyezetben
Lapozás: OK   4 / 10
(#) Lüke Aladár hozzászólása Júl 8, 2016 /
 
Sziasztok!
A következő problémába ütköztem: adott egy 18F452-es kontroller, elég sok adatot ír ki egy 16x2-es LCD-re. Ennek egy részét mentem a belső EEPROM-ba. Ha beleteszem azt, hogy indulás után olvassa ki az EEPROM-ot a megfelelő címekről, megbolondul az LCD kezelés, nem jelennek meg dolgok. Ha kiveszem az olvasást, megint jó minden. MikroC PRO-t használok.

Találkozott már valaki ilyen hibával? Mi a megoldás?
(#) attika hozzászólása Szept 26, 2016 /
 
Sziasztok.
Egy kis segítséget szeretnék kérni az alábbi kódot szeretném átírni a mellékelt kapcsolási rajzhoz de eddig sajnos nem sikerült bárhogy próbálkoztam.
  1. /*
  2.   ############################################
  3.   Project: 00-99 Minutes Timer
  4.   Written By: Rajendra Bhatt
  5.   Date: Sep 03, 2010
  6.   ############################################
  7.  
  8.   LCD Data D4-D7 connected to RB4-RB7
  9.   LCD RS -> RA0
  10.   LCD E -> RA1
  11.   Relay -> RA3
  12. */
  13.  
  14. // LCD module connections
  15. sbit LCD_RS at RA0_bit;
  16. sbit LCD_EN at RA1_bit;
  17. sbit LCD_D4 at RB4_bit;
  18. sbit LCD_D5 at RB5_bit;
  19. sbit LCD_D6 at RB6_bit;
  20. sbit LCD_D7 at RB7_bit;
  21. sbit LCD_RS_Direction at TRISA0_bit;
  22. sbit LCD_EN_Direction at TRISA1_bit;
  23. sbit LCD_D4_Direction at TRISB4_bit;
  24. sbit LCD_D5_Direction at TRISB5_bit;
  25. sbit LCD_D6_Direction at TRISB6_bit;
  26. sbit LCD_D7_Direction at TRISB7_bit;
  27. // End LCD module connections
  28.  
  29. // Tact switches and Relay ports
  30. sbit Relay at RB3_bit;
  31. sbit SS_Select at RB0_bit;    // Start Stop Timer Select
  32. sbit Unit_Button at RA4_bit;  // Set unit min
  33. sbit Ten_Button at RA3_bit;   // Set ten min
  34.  
  35.  
  36. // Messages
  37. char Message1[]="00-99 min Timer";
  38. char Message2[]="Device ON";
  39. char Message3[]="Device OFF";
  40. char Message4[]="Set Time:    min";
  41. char Message5[]="Time Left:   min";
  42. unsigned short i, j, unit=0, ten=0, ON_OFF=0, index=0, clear, time;
  43. char *digit = "00";
  44. // 300ms Delay
  45. void Delay_300(){
  46.  Delay_ms(300);
  47. }
  48.  
  49. void Display_Digits(){
  50.  digit[1]=unit+48;
  51.  digit[0]=ten+48;
  52.  Lcd_Out(2,11,digit);
  53. }
  54.  
  55. void start_timer(unsigned short MinVal){
  56.  unsigned short temp1, temp2;
  57.  Relay = 1;
  58.  ON_OFF = 1;
  59.  Lcd_Cmd(_LCD_CLEAR);
  60.  Lcd_Out(1,1,Message2);
  61.  Lcd_Out(2,1,Message5);
  62.  OPTION_REG = 0x80 ;
  63.  INTCON = 0x90;
  64.  for (i=0; i<MinVal; i++){
  65.   temp1 = (MinVal-i)%10 ;
  66.   temp2 = (MinVal-i)/10 ;
  67.   Lcd_Chr(2, 12, temp2+48);
  68.   Lcd_Chr(2, 13, temp1+48);
  69.   j=1;
  70.   do {
  71.   Delay_ms(1000);
  72.   j++;
  73.   } while(((j<=60) && (Clear ==0)));
  74.   if (Clear) {
  75.    Relay = 0;
  76.    Delay_ms(500);
  77.    Lcd_Out(1,1,Message3);
  78.    INTCON = 0x00;
  79.    goto stop;
  80.    }
  81.  }
  82.  stop:
  83.  Relay = 1;
  84.  ON_OFF = 1;
  85.  unit = 1;
  86.  ten = 1;
  87.  clear = 1;
  88. }
  89.  
  90. void interrupt(void){
  91.   if (INTCON.INTF == 1)   // Check if INTF flag is set
  92.    {
  93.     Clear = 1;
  94.     INTCON.INTF = 0;       // Clear interrupt flag before exiting ISR
  95.    }
  96.   }
  97.  
  98. void main() {
  99.   CMCON  |= 7;                       // Disable Comparators
  100.   TRISB = 0b11101111;
  101.   TRISA = 0b11110000;
  102.   Relay = 0;
  103.  
  104.   Lcd_Init();                        // Initialize LCD
  105.  start:
  106.   clear = 0;
  107.   Lcd_Cmd(_LCD_CLEAR);               // Clear display
  108.   Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
  109.   Lcd_Out(1,1,Message1);
  110.   Lcd_Out(2,1,Message4);
  111.   Display_Digits()  ;
  112.  do {
  113.  
  114.      if(!Unit_Button){
  115.      Delay_300();
  116.      unit ++;
  117.      if(unit==10) unit=0;
  118.      Display_Digits();
  119.     } // If !Unit_Button
  120.  
  121.     if(!Ten_Button){
  122.      Delay_300();
  123.      ten ++;
  124.      if(ten==10) ten=0;
  125.      Display_Digits();
  126.     } // If !Ten_Button
  127.  
  128.     if(!SS_Select){
  129.      Delay_300();
  130.      time = ten*10+unit ;
  131.      if(time > 0) start_timer(time);
  132.     } // If !SS_Select
  133.  
  134.     if(clear){
  135.      goto start;
  136.     }
  137.    } while(1);
  138. }


Hiába írogattam át a lábakat meg a ki-be meneteket az RB3-as lábon nem jelenik meg magas szint.Egy másik kapcsolásnál 2db lábat kellet megcserélnem a kódba az LCD-nél és az tökéletesen működik de itt bárhogy próbálkozok semmi siker nincs.
(#) Elektro.on válasza attika hozzászólására (») Szept 26, 2016 /
 
Ez a kód eredetileg is 16F628 ra készült?
Nem látom beállítva az RB.3 irányát. (Kimenet/bemenet).
A hozzászólás módosítva: Szept 26, 2016
(#) Elektro.on válasza attika hozzászólására (») Szept 26, 2016 /
 
Valami ilyesmi esetleg kéne:
  1. sbit Relay_Direction at TRISB3_bit;
(#) attika válasza Elektro.on hozzászólására (») Szept 26, 2016 /
 
Az a kód ehhez a rajzhoz készült amit most mellékeltem.
Működik a kijelzés és el is indul rendesen csak a ki-be menetek nem stimmelnek. Meg a nyomógombok mert ahogy elindul rögtön lépteti a perceket.
A relé kimenetet szerettem volna áttenni az RB3-ra mert ott az RA3-on van de sajnos nem sikerült.
Nekem az előző kapcsolás van megépítve és ahhoz szerettem volna ezt a kódot átírni.
(#) Prendick válasza attika hozzászólására (») Szept 26, 2016 / 1
 
Rossz szinte az összes TRIS bit a 100-101. sorban. A TRISB-ben csak az RB0 bemenet, a többi kimenet, tehát TRISB = 0b00000001. A TRISA-n van a többi gomb, vagyis TRISA = 0b11111100.
(#) attika válasza Prendick hozzászólására (») Szept 26, 2016 /
 
Próbáltam már azokat is átírni de most kipróbálom amit írtál.
A 30-as sorban "sbit Relay at RB3_bit"
Itt nem kell átírnom RA3-ra?

Mekkora királyság, át is írtam úgy ahogy írtad, lefordítottam és tökéletesen működik úgy ahogy kell, köszönöm szépen.
Próbálkoztam már TRISA,TRISB átírásával de nem működött valamiért.
A hozzászólás módosítva: Szept 26, 2016
(#) Hp41C válasza attika hozzászólására (») Szept 26, 2016 / 1
 
Idézet:
„TRISB = 0b11101111;
TRISA = 0b11110000;”

Itt RA3..0 kimenetnek vagyon állítva, ezért lépteti az időt, az RB3 pedig bemenetként nem tudja vezérelni a relét...
  1. TRISB = 0b00000111;
  2.   TRISA = 0b11111100;
(#) attika válasza Hp41C hozzászólására (») Szept 26, 2016 /
 
Most már működik úgy ahogy prendick írta.
Köszönöm neked is meg neki is még egyszer.
(#) Prendick válasza attika hozzászólására (») Szept 26, 2016 /
 
Működik? Pedig az enyém nem jó a kék rajzhoz. Még a régi rajzhoz írtam, úgyhogy Hp41C verzióját írd a programba, mert nem fognak menni a gombjaid.
(#) attika válasza Prendick hozzászólására (») Szept 26, 2016 /
 
Érdekes, pedig elsőre működött.
Most azóta félre tettem de megpróbálom megint.
Nekem nem a kék rajzhoz kell, a kék rajz kódját tettem fel és a másik rajzhoz kell a program mert az a kapcsolás van nekem megépítve.
Így viszont akkor jó az amit te írtál.
(#) attika hozzászólása Szept 26, 2016 /
 
Na most már teljesen össze zavarodtam.
Az előbb működött és még a relét is vezérelte, most meg semmi.
A kód amit beillesztettem az eredetileg a kék rajzhoz tartozik, de nekem a legelső kapcsolás van megépítve és ahhoz szerettem volna a kódot illeszteni.
(#) Elektro.on válasza attika hozzászólására (») Szept 26, 2016 /
 
Arra figyelj, hogy ha az adott portot aTRIS -el 1 re állítod az bemenet. Ha 0 -ra akkor kimenet.
(#) attika válasza Elektro.on hozzászólására (») Szept 26, 2016 /
 
Ha egy láb nincs használva akkor azt ki, vagy be menetre kell állítani?
(#) Elektro.on válasza attika hozzászólására (») Szept 27, 2016 /
 
Én bemenetre állítanám.
(#) Hp41C válasza attika hozzászólására (») Szept 27, 2016 /
 
Ha bemenetnek állítod fel- vagy lehúzó ellenállás kell a lábra. CMOS bemenetet nem szabad bekötetlenül hagyni. Ha kimenetnek állítod be, nem kell további alkatrész.
(#) Elektro.on válasza Hp41C hozzászólására (») Szept 27, 2016 /
 
A legtöbb lábnak van kapcsolható belső felhúzó ellenállása.
(#) attika válasza Hp41C hozzászólására (») Szept 27, 2016 /
 
  1. /*
  2.   ############################################
  3.   Project: 00-99 Minutes Timer
  4.   Written By: Rajendra Bhatt
  5.   Date: Sep 03, 2010
  6.   ############################################
  7.  
  8.   LCD Data D4-D7 connected to RB4-RB7
  9.   LCD RS -> RA0
  10.   LCD E -> RA1
  11.   Relay -> RA3
  12. */
  13.  
  14. // LCD module connections
  15. sbit LCD_RS at RA0_bit;
  16. sbit LCD_EN at RA1_bit;
  17. sbit LCD_D4 at RB4_bit;
  18. sbit LCD_D5 at RB5_bit;
  19. sbit LCD_D6 at RB6_bit;
  20. sbit LCD_D7 at RB7_bit;
  21. sbit LCD_RS_Direction at TRISA0_bit;
  22. sbit LCD_EN_Direction at TRISA1_bit;
  23. sbit LCD_D4_Direction at TRISB4_bit;
  24. sbit LCD_D5_Direction at TRISB5_bit;
  25. sbit LCD_D6_Direction at TRISB6_bit;
  26. sbit LCD_D7_Direction at TRISB7_bit;
  27. // End LCD module connections
  28.  
  29. // Tact switches and Relay ports
  30. sbit Relay at RB3_bit;
  31. sbit SS_Select at RB0_bit;    // Start Stop Timer Select
  32. sbit Unit_Button at RA4_bit;  // Set unit min
  33. sbit Ten_Button at RA3_bit;   // Set ten min
  34.  
  35.  
  36. // Messages
  37. char Message1[]="00-99 min Timer";
  38. char Message2[]="Device ON";
  39. char Message3[]="Device OFF";
  40. char Message4[]="Set Time:    min";
  41. char Message5[]="Time Left:   min";
  42. unsigned short i, j, unit=0, ten=0, ON_OFF=0, index=0, clear, time;
  43. char *digit = "00";
  44. // 300ms Delay
  45. void Delay_300(){
  46.  Delay_ms(300);
  47. }
  48.  
  49. void Display_Digits(){
  50.  digit[1]=unit+48;
  51.  digit[0]=ten+48;
  52.  Lcd_Out(2,11,digit);
  53. }
  54.  
  55. void start_timer(unsigned short MinVal){
  56.  unsigned short temp1, temp2;
  57.  Relay = 1;
  58.  ON_OFF = 1;
  59.  Lcd_Cmd(_LCD_CLEAR);
  60.  Lcd_Out(1,1,Message2);
  61.  Lcd_Out(2,1,Message5);
  62.  OPTION_REG = 0x80 ;
  63.  INTCON = 0x90;
  64.  for (i=0; i<MinVal; i++){
  65.   temp1 = (MinVal-i)%10 ;
  66.   temp2 = (MinVal-i)/10 ;
  67.   Lcd_Chr(2, 12, temp2+48);
  68.   Lcd_Chr(2, 13, temp1+48);
  69.   j=1;
  70.   do {
  71.   Delay_ms(1000);
  72.   j++;
  73.   } while(((j<=60) && (Clear ==0)));
  74.   if (Clear) {
  75.    Relay = 0;
  76.    Delay_ms(500);
  77.    Lcd_Out(1,1,Message3);
  78.    INTCON = 0x00;
  79.    goto stop;
  80.    }
  81.  }
  82.  stop:
  83.  Relay = 0;
  84.  ON_OFF = 0;
  85.  unit = 0;
  86.  ten = 0;
  87.  clear = 1;
  88. }
  89.  
  90. void interrupt(void){
  91.   if (INTCON.INTF == 1)   // Check if INTF flag is set
  92.    {
  93.     Clear = 1;
  94.     INTCON.INTF = 0;       // Clear interrupt flag before exiting ISR
  95.    }
  96.   }
  97.  
  98. void main() {
  99.   CMCON  |= 7;                       // Disable Comparators
  100.   TRISB = 0b00000001;
  101.   TRISA = 0b00111100;
  102.   Relay = 0;
  103.  
  104.   Lcd_Init();                        // Initialize LCD
  105.  start:
  106.   clear = 0;
  107.   Lcd_Cmd(_LCD_CLEAR);               // Clear display
  108.   Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
  109.   Lcd_Out(1,1,Message1);
  110.   Lcd_Out(2,1,Message4);
  111.   Display_Digits()  ;
  112.  do {
  113.  
  114.      if(!Unit_Button){
  115.      Delay_300();
  116.      unit ++;
  117.      if(unit==10) unit=0;
  118.      Display_Digits();
  119.     } // If !Unit_Button
  120.  
  121.     if(!Ten_Button){
  122.      Delay_300();
  123.      ten ++;
  124.      if(ten==10) ten=0;
  125.      Display_Digits();
  126.     } // If !Ten_Button
  127.  
  128.     if(!SS_Select){
  129.      Delay_300();
  130.      time = ten*10+unit ;
  131.      if(time > 0) start_timer(time);
  132.     } // If !SS_Select
  133.  
  134.     if(clear){
  135.      goto start;
  136.     }
  137.    } while(1);
  138. }


Ezekkel a beállításokkal most már működik ahogy kell ,de nem volt elég csak a lábakat beállítanom hanem a 59-65-ös sorokban is át kellett írnom a lábakat.
Amíg azokat nem írtam át össze vissza működött és magától léptette a perceket.
Amit legelőször raktam fel rajzot ahhoz ez a beállítás a jó.
TRISB = 0b00000001;

TRISA = 0b00111100;
(#) kriszrap hozzászólása Okt 4, 2016 /
 
Sziasztok
Van egy pic18f46k22
Alap konfigom ez:
  1. OSCCON.IRCF0=1;///Internal Oscillator Frequency Select bits, 16MHz
  2.     OSCCON.IRCF1=1;
  3.     OSCCON.IRCF2=1;
  4.     OSCTUNE.PLLEN=1; // 4x PLL
  5.     TRISA = 0;
  6.     TRISB = 0;
  7.     TRISC = 0;
  8.     TRISD = 0;
  9.     TRISE = 0;
  10.  
  11.     LATA = 0;
  12.     LATB = 0;
  13.     LATC = 0;
  14.     LATD = 0;
  15.     LATE = 0;
  16.     LATC.RC1=1;
  17.     ANSELE.RE1=0;// gomb jobb bemenet
  18.     ANSELE.RE2=0;// gomb ball bemenet


ANSELE nincs ennél a picknél ha nem ANSELx.ANSxy ha ez igy van akkor a forditó mért fogadja el??
Idézet:
„ANSELE.RE1=0;// gomb jobb bemenet
ANSELE.RE2=0;”


Csak a nyomógomb miatt kellet berakni mert ennélküld nem tudtam olvasni POST al




Krédéseim xy helyére a lábnevét írjam pl RE2 RE1 vagy az analog idjét AN1 AN3.....??
Tervem AN5 szeretnék analogot mérni.
A hozzászólás módosítva: Okt 4, 2016
(#) Owert hozzászólása Jan 8, 2017 /
 
Sziasztok! Sokadjára látok neki és szeretném most már elsajátítani a PIC programozást viszont pár kérdés felmerült már a kezdeteknél. Ilyen például, hogy ha MikroC-ben megírok egy programot és égetem a PIC-be, nem csinál semmit, holott a Real Pic Simulator rendesen mutatja. PIC Simulator IDE szintén nem mutatja. Másik érdekesség:habár ugyanazok a beállítások vannak, mindegyik szimulátor más gyorsasággal mutatja az eredményt. Ötleteket szívesen fogadnám. Köszönöm!
(#) Bakman válasza Owert hozzászólására (») Jan 8, 2017 / 1
 
A szimulátorok sebessége eltérő, ez szinte törvényszerű, ez, mondhatni normális. Az, hogy szimulátorban működik a program de a valóságban nem, több okra vezethető vissza. Pár dolog, ami eszembe jut:

MCLR: Van olyan kontroller, amelyiknél a konfigban nem lehet megadni, hogy te nem szeretnéd használni ezt a lábat, mint Reset, hanem mint bemenet. Az ilyeneknél ezt a lábat fel kell húzni a tápfeszültségre, különben a kontroller újraindul vagy egyáltalán el sem indul. Lehet, hogy ezt a szimulátor megteszi helyetted.

BOR (Brown Out Reset): Ha a konfigban ez engedélyezve van, akkor a valóságban, amennyiben egy bizonyos szint alá esik a tápfeszültség, a kontroller újraindul. Többnél ez a szint beállítható. A szimulátor ezt nagy valószínűséggel nem veszi figyelembe, úgy "gondolja", hogy a minimális tápfeszültség mindenképpen megvan.

Oszcillátor: Sok kontrollernél meg lehet adni, milyen oszcillátorról menjen. Pl. külső kvarc, belső órajel (már ha van ilyen). Ha van belső órajel generátora a kontrollernek, akkor azt be is kell állítani és külön megmondani a kontrollernek, hogy ő most ennyivel ketyeg. Ha a kettő nem stimmel, könnyen lehet, hogy azt hiszed, 8 MHz-ről megy a kontroller de a valóságban csak 1 MHz-es órajelet kap. Lehetséges, hogy a szimulátorban megadott pl. 8 MHz-es órajelet mindenképpen annyinak veszi, függetlenül attól, hogy a valóságban nem annyi.

WDT (Watchdog Timer): Ez egy kis számláló, amit időnként nullázni kell, különben újraindítja a kontrollert, már ha aktív a WDT. Van olyan PIC, amelyikben a WDT periódusideje 20-30 ms és nem lehet átállítani, tehát viszonylag sűrűn kell nullázni. Lehet, hogy a szimulátor ezt nem veszi figyelembe.

Általában ezek a fő buktatók. A következő lépés az esetleges hibás felprogramozás, a hibás bekötés vagy a kimondottan kötelező hidegítőkondenzátor(ok) elhagyása a Vdd láb(ak) közelében (100 nF).

Tovább úgy lehet lépni, ha megmutatod a programot, elmondod milyen kontrollert használsz és esetlegesen lefényképezed a kész művet. Az is érdekes lehet, hogy mivel programozod a kontrollert.
A hozzászólás módosítva: Jan 8, 2017
(#) Owert válasza Bakman hozzászólására (») Jan 8, 2017 /
 
Kedves Bakman! Köszönöm a részletes választ, pótolom ezeket, remélem segít. A betáplálással nem hinném hogy probléma lesz, stabil 5 V feszültséget kap az IC és közvetlenül lőtte van kondenzátor. Egyébként korábban Topi leírása alapján indultam el (ezúton is köszönöm a cikket) és az Ő által készített HEX-et beégetve hibátlanul megy a kontroller, viszont a szimulátoroknál nem. Most főképp MikroC-t használnék programozásra (azért is ide írtam), ehhez viszont neten nézem az instrukciókat. Lépésenként haladnék: szokásos LED villogtatás, villogtatás gombra, 2x16-os LCD szövegkiíratás és 4x3-as keypad használattal bevitel. Az IC PIC16F877A/I-P, mellékeltem képet a műről, ami erősen tesztjellegűre sikeredett, de használható.
A hozzászólás módosítva: Jan 8, 2017
(#) Bakman válasza Owert hozzászólására (») Jan 8, 2017 / 1
 
Nevezett kontrollerben nincs belső oszcillátor, az MCLR lábat pedig minden esetben fel kell húzni a tápfeszültségre. Ha Topi programja működik de a tiéd nem, akkor valószínű, hogy magában a programban van hiba vagy a konfigurációs beállításokban.
(#) Owert válasza Bakman hozzászólására (») Jan 8, 2017 /
 
És ott is volt, a konfigurációs beállításokban a hiba. Nagyon köszönöm a leírást, sokat segített!Érdekes, hogy jó pár oktató cikk, videó kering az interneten kezdőknek és ezt a fontos lépést nem említi.
(#) kriszrap hozzászólása Jan 9, 2017 /
 
Kedves profik
Megtudnátok nézni hogy a hőmérőmet rendesen programoztam be??
A kódom:
  1. int i = 2;
  2.       Ow_Reset(&PORTA, 2); // Reset
  3.       Ow_Write(&PORTA, 2,0x44);  // Convert_T
  4.       Delay_us(120);
  5.  
  6.       Ow_Reset(&PORTA, 2); // Reset
  7.       //Ow_Write(&PORTA, 2,0xCC);  // Skip ROM
  8.       Ow_Write(&PORTA, 2,0xBE);  // Read Scratchpad
  9.  
  10.       kod = Ow_Read(&PORTA, 2); // Byte 0: Temperature  7..0
  11.       kod |= Ow_Read(&PORTA, 2) << 8; // Byte 1: Temperature  15..8
  12.  
  13.       Homerseklet= kod / 16;
  14.  
  15.       if(0>Homerseklet)minusz=1;
  16.       else minusz=0;
  17.  
  18.        while (i > 0)//minusz hömérsékletböl +csináljak kíiratás miatt,és számjegyek felbontása
  19.        {
  20.         i--;
  21.         homersekletszamjegy[i] = Homerseklet % 10;
  22.         if (homersekletszamjegy[i] < 0) homersekletszamjegy[i] -= homersekletszamjegy[i] * 2;
  23.         Homerseklet /= 10;
  24.  
  25.        }
  26.       idokiir(-1,-1,homersekletszamjegy[0],homersekletszamjegy[1],-1,-1,0);

Nincs lehetőségem most tesztelni de müködhet???
DS18B20+ lesz mérve
(#) Owert válasza Bakman hozzászólására (») Jan 14, 2017 /
 
Kedves Bakman! Egy kérdést feltennék még, ha nem lenne probléma: tökéletesen működik jelenleg minden (kijelző meghajtás, LED-ek megfelelő felvillantása). Egy valami mégis probléma, mégpedig a gombok kezelése. A képen látható panelen minden egyes gomb egy-egy PIC A portra van kötve, viszont úgy érzékeli, mintha le lenne nyomva. Természetesen bemenetre van állítva az adott láb és fel van húzva 5V-ra és 0-val zárva lenne "lenyomva". Köszönöm a választ, kellemes napot!
(#) Bakman válasza Owert hozzászólására (») Jan 14, 2017 / 1
 
Nem ismerem a programot, de a jelenségből arra következtetek, hogy a kontrollerben aktív magas a gombok érzékelése. Tehát nem felhúzni kell az adott bemenetet, hanem lehúzni nullára egy ellenállással, a gomb pedig +5 V-ot ad a bemenetre.
(#) Owert válasza Bakman hozzászólására (») Jan 16, 2017 /
 
Köszönöm a választ! Végül meg lett a hiba, több órás keresés után: kimaradt az analóg - digitális konvertálás.
(#) tomee1986 hozzászólása Ápr 15, 2017 /
 
Sziasztok!

Egy kis segítséget szeretnék kérni.Adott egy PIC16f1936 és egy 16*2 es LCD kijelző és 3 nyomógomb.
Egy visszaszámlálót szeretnék írni. Egyik nyomógomb növeli a perc értéket másik csökkenti a harmadik megnyomásra elindulna a visszaszámlálás. De csak akkor számol vissza ha megnyomom a 3. gombot, hogy kéne átírnom hogy ha megnyomom akkor folyamatosan számoljon vissza. Külön kezeltem a tízes illetve az egyes helyértéket.


  1. mpe=48;
  2.         mpt=48;
  3.         pe=48;
  4.         pt=48;
  5.  
  6.  
  7.  Sound_Init(&PORTC,1);
  8.  LCD_Init();
  9.  LCD_CMD(_LCD_CLEAR);
  10.  LCD_CMD(_LCD_CURSOR_OFF);
  11.  
  12.  while(1)
  13.  {
  14.  
  15.    //1-es nyomógomb
  16.    if(nyg1 !=1 &&  gomb1!=1 )
  17.         {
  18.          gomb1=1;
  19.          pe++;
  20.  
  21.            if (pe==58)
  22.           {
  23.             pe=48;
  24.             pt++;
  25.             if(pt>51)
  26.             {
  27.              pe=48;
  28.              pt=51;
  29.             }
  30.  
  31.           }
  32.  
  33.  
  34.         }
  35.  
  36.    if(nyg1 !=0 && gomb1!=0 )
  37.    {
  38.     gomb1=0;
  39.    }
  40.  
  41.   // 2-es nyomógomb
  42.    if(nyg2 !=1 &&  gomb2!=1 )
  43.      {
  44.  
  45.           gomb2=1;
  46.           pe--;
  47.           if(pe==47)
  48.             {
  49.              pt--;
  50.              pe=57;
  51.             }
  52.           if(pe>47 && pt==47)
  53.              {
  54.               pe=48;
  55.               pt=48;
  56.  
  57.              }
  58.       }
  59.  if(nyg2 !=0 && gomb2!=0 )
  60.   {
  61.    gomb2=0;
  62.   }
  63.  
  64.  
  65.   // 3-mas nyomógomb
  66.      if(nyg3 !=1 && gomb3 != 1)
  67.         {
  68.  
  69.          mpe--;
  70.          delay_ms(1000);
  71.  
  72.          if(mpe==47) {mpe=57; mpt--;}
  73.          if(mpt==47) {mpe=57;mpt=53; pe--;}
  74.          if(pe==47) {mpe=57;mpt=53;pe=57; pt--;}
  75.          if(pt==47) {mpe=57;mpt=53;pe=48;pt=48;}
  76.  
  77.          gomb3=1;
  78.          }
  79.  
  80.     if(nyg3 !=0 && gomb3 != 0  )
  81.         {
  82.          gomb3=0;
  83.          }
  84.   LCD();
  85.     }
A hozzászólás módosítva: Ápr 15, 2017
(#) gyurma888 válasza tomee1986 hozzászólására (») Ápr 15, 2017 /
 
Szia!
Bár profiknak kéne megnézniük, de én úgy látom, hogy a programod a számlálót csökkentő részt csak akkor hajtja végre, ha a gombot éppen nyomod:
  1. if(nyg3 !=1 && gomb3 != 1)

Amint a gombot elengeded, máris hamis lesz a feltétel, így az "mpe--;" nem megy végbe.
Ezt a problémát én úgy oldanám meg, hogy a gombokat a program elején beolvasnám, majd egy-egy változóban tárolnám őket. Ha viszont éppen egy gombot sem nyomtál meg, akkor ezeket a változókat nem módosítanám, így újra a csökkentésért felelős ág teljesülne.
Következő: »»   4 / 10
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