Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   83 / 153
(#) Hp41C válasza janimester hozzászólására (») Szept 23, 2013 / 1
 
Talán így:
  1. void main()
  2. {
  3.      
  4.      TRISB = 0;                            // PORTB all output to LED
  5.      PORTB = 0;
  6.      do
  7.     {
  8.      PORTB.F7 = 1;
  9.      delay_ms(100);
  10.      PORTB.F6 = 1;
  11.      delay_ms(100);
  12.      PORTB.F5 = 1;
  13.      delay_ms(100);
  14.      PORTB.F4 = 1;
  15.      delay_ms(100);
  16.      PORTB.F3 = 1;
  17.      delay_ms(100);
  18.      PORTB.F2 = 1;
  19.      delay_ms(100);
  20.      PORTB.F1 = 1;
  21.      delay_ms(100);
  22.      PORTD.F7 = 1;
  23.      delay_ms(100);
  24.      PORTD.F6 = 1;
  25.      delay_ms(100);
  26.      PORTC.F2 = 1;
  27.      delay_ms(100);
  28.      PORTC.F1 = 1;
  29.      delay_ms(100);
  30.      PORTC.F0 = 1;
  31.      } while (1);
  32. }
(#) kissi válasza Hp41C hozzászólására (») Szept 23, 2013 /
 
Idézet:
„Egyszer kell amúgy lefutnia a program elején.”
Ez így nem az !
(#) Hp41C válasza kissi hozzászólására (») Szept 23, 2013 /
 
Idézet:
„De hiába a while parancs ugyanúgy rossz”
Így talán nem annyira rossz.
(#) kissi válasza Hp41C hozzászólására (») Szept 23, 2013 /
 
Ez igaz !
(#) Wudoou hozzászólása Szept 28, 2013 /
 
Sziasztok!
Egy kis segítségre lenne szükségem. Szeretnék egy többcsatornás mérőpanelt készíteni PIC+ds18b20-as eszközökkel. LCD kijelzés+soros portos adatátvitel...
Az lenne a gondom, hogy 24 érzékelőt kellene mérjek, de az előző fórumozások alapján arra a végeredményre jutottunk/ jutottam, hogy 3 különböző lábon lenne 8-8 eszköz.
Na most, hogy a kód ne legyen túl nagy, szeretném átírni a ds-hez tartozó függvényeimet úgy, hogy kapna még egy argumentumot, és az alapján lenne eldöntve, hogy melyik lábon kell mérni.
Csakhogy nekem van egy 1wire.h fájlom, amiben define paranccsal adom meg az OW láb "helyzetét" és ezt hogyan tudom feltételes fordítássá tenni? Mármint hogy bármikor módosulhasson a meghívott argumentum függvényében?
  1. #ifndef _1WIRE_H_
  2. #define _1WIRE_H_
  3.  
  4. #include "types.h"
  5.  
  6. #define OW_TRIS TRISC4
  7. #define OW_DATA RC4
  8.  
  9. #define OW_HIZ()        (OW_TRIS = INPUT)
  10. #define OW_HI() (OW_DATA = 1, OW_TRIS = OUTPUT) /* ez a 'strong pullup' */
  11. #define OW_LO() (OW_DATA = 0, OW_TRIS = OUTPUT)
  12.  
  13. BYTE OW_reset(void);
  14. void OW_write_bit(BYTE val);
  15. void OW_write_byte(BYTE val);
  16. BYTE OW_read_bit(void);
  17. BYTE OW_read_byte(void);
  18.  
  19. #endif


Először valami ilyesmire gondoltam:
  1. void Change_PIN(unsigned char pin)
  2. {
  3.         switch(pin)
  4.                 {
  5.                         0:      //
  6.                         1:      //
  7.                         2:      //
  8.                 }
  9.  
  10. }


És a meghíváskor:

  1. void start_allds1820(void){
  2.  
  3.         unsigned char pin_variable;
  4.         for(pin_variable=0;pin_variable<3;pin_variable++){
  5.         Change_PIN(pin_variable);
  6.         OW_reset();                                                             //onewire reset
  7.         OW_write_byte(SKIP_ROM);
  8.         OW_write_byte(START_CONVERSION);
  9.         }
  10. }


Csak így nem jó.
(#) _vl_ válasza Wudoou hozzászólására (») Szept 28, 2013 /
 
Idézet:
„Csakhogy nekem van egy 1wire.h fájlom”

Koncepcionális hiba van az elképzelésedben. A .h fájlhoz tartozik valahol egy .c fájl, amiben a .h-ban felsorolt függvények beltartalma van megadva (a .h csak a függvények meghívását mutatja, de a konkrét implementáció máshol van). Nem elég a .h fájlt módosítani, a függvények implementációjához is hozzá kell nyúlni.
(#) Wudoou válasza _vl_ hozzászólására (») Szept 28, 2013 /
 
Az tiszta sor. Csak azt szerettem volna tudni, hogy van-e rá valamilyen eljárás, hogy ezt a két sort
  1. #define OW_TRIS TRISC4
  2. #define OW_DATA RC4

megtudjam változtatni valahol máshol.
Mivel ezt nem tudom, így kénytelen vagyok megírni a :
  1. void OW_write_bit1(BYTE val);
  2. void OW_write_bit2(BYTE val);
  3. void OW_write_bit3(BYTE val);

és így tovább.....
És persze ezeket is:
  1. #define OW_HIZ1()       (OW_TRIS1 = INPUT)
  2. #define OW_HI1()        (OW_DATA1 = 1, OW_TRIS1 = OUTPUT)       /* ez a 'strong pullup' */
  3. #define OW_LO1()        (OW_DATA1 = 0, OW_TRIS1 = OUTPUT)
  4.  
  5. #define OW_HIZ2()       (OW_TRIS2 = INPUT)
  6. #define OW_HI2()        (OW_DATA2 = 1, OW_TRIS2 = OUTPUT)       /* ez a 'strong pullup' */
  7. #define OW_LO2()        (OW_DATA2 = 0, OW_TRIS2 = OUTPUT)
  8.  
  9. #define OW_HIZ3()       (OW_TRIS3 = INPUT)
  10. #define OW_HI3()        (OW_DATA3 = 1, OW_TRIS3 = OUTPUT)       /* ez a 'strong pullup' */
  11. #define OW_LO3()        (OW_DATA3 = 0, OW_TRIS3 = OUTPUT)
A hozzászólás módosítva: Szept 28, 2013
(#) _vl_ válasza Wudoou hozzászólására (») Szept 28, 2013 /
 
Idézet:
„hogy ezt a két sort megtudjam változtatni valahol máshol.”

Nem azt a két sort kell megváltoztatni, hanem azokat a sorokat, ahol ezeket a makrókat felhasználod. Persze megoldás lehet az is, hogy legyen 3 verzió mindegyik függvényből. Annak fényében, hogy 8-bites PIC-ről beszélünk, érdemes megnézni azt is, hogy a függvények kibővítése egy plusz paraméterrel mennyivel bonyolultabb kódot fog eredményezni assemblyben. Ha nagyon, akkor simán lehet, hogy nem éri meg az, hogy ne legyen 3 verzió mindegyik függvényből.
A hozzászólás módosítva: Szept 28, 2013
(#) Wudoou válasza _vl_ hozzászólására (») Szept 28, 2013 /
 
Idézet:
„simán lehet, hogy nem éri meg”


Igen, ezt szerettem volna elkerülni azzal, hogy megváltoztatom a lábat, így csak arról kell gondoskodjak, hogy akkor tudjam, hogy csatornaváltás történt.
Szóval
Idézet:
„Nem azt a két sort kell megváltoztatni, hanem azokat a sorokat, ahol ezeket a makrókat felhasználod.”
:
pl. van egy ilyen függvényem:

  1. void OW_write_bit(unsigned char val)
  2. {
  3.         DisableAllInterrupts();
  4.         OW_HIZ();
  5.         OW_LO();
  6.         vWait_us(5);
  7.         if (val)
  8.                 OW_HIZ();
  9.         vWait_us(60);
  10.         OW_HI();                       
  11.         vWait_us(2);
  12.         ResumeAllInterrupts();
  13. }


Akkor itt mit kellene átírnom?
(#) _vl_ válasza Wudoou hozzászólására (») Szept 28, 2013 /
 
  1. OW_HIZ();
  2. OW_LO();

helyett pl.
  1. switch (pin) {
  2.   case 0:
  3.     OW_HIZ0();
  4.     OW_LO0();
  5.     break;
  6.   case 1:
  7.     OW_HIZ1();
  8.     OW_LO1();
  9.     break;
  10.   case 2:
  11.     OW_HIZ2();
  12.     OW_LO2();
  13.     break;
  14. }

nyilván az OW.. makrókból kell csinálni három készletet.
(#) Hp41C hozzászólása Szept 28, 2013 /
 
Egy ilyen megoldás is működik:
  1. #define OUTPIN(tris, port) {tris = 0; port = 1;}
  2. #define INPIN(tris, port) {tris = 1; val = port;}
  3.  
  4. void W(void)
  5. {
  6.         OUTPIN(TRISCbits.TRISC7, PORTCbits.RC7);
  7. }
(#) Wudoou válasza Hp41C hozzászólására (») Szept 28, 2013 /
 
Na ez sokkal jobban tetszik!
(#) watt válasza Hp41C hozzászólására (») Szept 28, 2013 /
 
Nekem a legtöbb infót ez a megoldás adja:
  1. #define mInitPORTA()    LATA &= 0b00000000;     TRISA &= 0b00011111; //
  2. #define mInitPORTB()    LATB &= 0b00000000;     TRISB &= 0b11111001; //


Egy kapcsolási razhoz beállítani így a legkönnyebb szerintem. Minden más megoldás, számomra csak áttekinthetetlenné teszi a kiosztást.
Kinek a pap....
A hozzászólás módosítva: Szept 28, 2013
(#) Hp41C válasza watt hozzászólására (») Szept 28, 2013 /
 
Nem inicializálásról, hanem egy kiterjedt 1-Wire (a számosság miatt több vezetékre kötött) érzékelő rendszer kezeléséről volt szó. Ahhoz kerestem ötletet, hogy ne kelljen annyiszor elkészíteni, leírni a 1-Wire kezelő függvényeket.,,
(#) watt válasza Hp41C hozzászólására (») Szept 28, 2013 /
 
Értem, elnézést a félreértésért!
(#) whalaky hozzászólása Okt 5, 2013 /
 
Sziasztok!
Feladtam a jó kis langyos CCS-t és elkezdtem C18-al foglalkozni, de az őrületbe kerget a warningjaival.
Hogyan lehetne ezektől megszabadulni? (Természetesen nem a warningok kikapcsolására gondoltam)
  1. // definició
  2. rom const char * cmd_commands[] = {
  3.     "LEDS"
  4. };
  5. const rom char strVersion[] = "Version 1.0";
  6. ...
  7. char cmd[ 5 ];
  8. int i = 0;
  9.  
  10. ...
  11. if( strncmpram2pgm( *commands[i], (char*)&cmd, 4 ) == 0 )

erre Warning [2066] type qualifier mismatch in assignment
  1. strcpypgm2ram( (char*)&outdata[5], &strVersion );

erre pedig Warning [2054] suspicious pointer conversion
az uotdata egy egyszerű char[64]

és az strncmpram2pgm hívásra mindenhol ugyan ezt adja, akár mit teszek vele....
Segítsen valaki!
(#) icserny válasza whalaky hozzászólására (») Okt 5, 2013 /
 
C18-nál a ROM és a RAM memóriához különböző típusú mutatókat használunk. Nem tudom, hogy az MPLAB-ban a memória címzésmód változtatásával lehet-e ezen segíteni.
(#) _vl_ válasza whalaky hozzászólására (») Okt 5, 2013 / 1
 
Szerintem hadilábon állsz a tömbök/pointerek használatával, és erre próbál finoman rávezetni a fordító. Azt kell megjegyezni, hogy a tömb neve magában leírva egy pointer, ami pont az első elemre mutat. Ennek a pointernek nincs címe (úgy nevezett jobb-érték), ezért a "&cmd" kifejezést a fordító csak nagy duzzogva eszi meg, és értékeli ki ugyanarra a kifejezésre, amit "cmd" magában is jelent. Ugyanezért a "&strVersion" helyett is "strVersion" kéne magában.
Továbbá ha az outdata egy char tömb, akkor a "(char*)&outdata[5]" pont ugyanazt csinálja, mint az "&outdata[5]", csak nem sumákolja el egy casttal, hogy most akkor stimmel-e a típus (ha később megváltoztatod az outdata típusát, akkor cast nélkül a fordító ordítani fog, míg a casttal ezt felülbírálod, hogy "jól van, tudom mit csinálok, ne küldjél warningot" ). Ezen felül az "&outdata[5]" helyett lehet írni, hogy "outdata + 5", ami jobban tükrözi a pointeres szemléletet.
A hozzászólás módosítva: Okt 5, 2013
(#) whalaky válasza _vl_ hozzászólására (») Okt 5, 2013 /
 
Igazad van, vannak bizonytalanságok/hiányosságok a tudásomban.
Sajnos amit leírtál az nem vitt előrébb, sőt..... megsokasodtak a warningok
Lehet hogy valami apróság, még sportolok rajta, de ahogy kiveszem a típuskényszerítéseket egyre jobban hisztizik a fordító. Azért próbálkozom. Köszi az oktatást, ez a jobb-érték dolog valóban az újdonság erejével hatott.
(#) janimester hozzászólása Okt 5, 2013 /
 
Üdv. Sikerült találnom egy hibátlan fordulasztámmérő programot. Mindössze a timer2 leosztását nem tudom átállítani hogy azt az értéket jelezze ki amit kellene mert gyorsabban jár ez a processzor mint amire írták eredetileg a programot. Előtte egy 16f887-en 8mhz-en ketyegett a program most 18f4550-ön menne 48Mhz-es pll-el és kristállyal. Bemásolom azt a kódrészletet ami nem stimmel :
  1. // setup TMR2 and enable TMR2 int
  2.   T2CON = 0b00011111;       // TMR2 ON, 8MHz xtal, 16:4:1 = 31250 Hz
  3.   PR2 = 250;                // TMR2 int is 31250 / 250 = 125 ints/sec
  4.   PIE1.TMR2IE = 1;          // TMR2 interrupt is on
  5.   INTCON = 0b11000000;      // GIE=ON, PIE=ON
  6.  
  7.   // load variables ready to run
  8.   int_sec_count = 125;


Most 50Hz-nél aminek 3000-es fordulatot kéne jelentenie 480RPM-et jelez ki.
(#) Hp41C válasza janimester hozzászólására (») Okt 5, 2013 /
 
Egy kicsit több részlet kellene a programból... 48 MHz = 6 * 8 MHz, tehát nem 125 megszakítás érkezik, hanem 6 * 125 = 750. Milyen típusú az int_sec_count?
(#) janimester válasza Hp41C hozzászólására (») Okt 5, 2013 /
 
Bemásolom az egészet. Hirtelen nem tudom mire gondolsz az utolsó kérdésed alatt.
  1. /******************************************************************************
  2.  * Project name:
  3.      EP6_freq.c   EasyPIC6 only, is a freq/rpm meter using the COG display
  4.  * Copyright:
  5.      Open-source  -  Oct 2009  -  Roman Black
  6.  * Description:
  7.      I modified the EasyPIC6 COG text display example to make a simple
  8.      frequency/rpm meter. The incoming frequency to be measured must be
  9.      connected to PORTC.F0 (T1CKI) pin. Max freq measured is 65000 Hz.
  10.      Note! If you don't have a freq signal connected, you can test it
  11.      by pressing the RC0 pushbutton REALLY quickly.
  12.  
  13.  * Test configuration:
  14.      MCU:             PIC16F887
  15.                       http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf
  16.      Dev.Board:       EasyPIC6
  17.                       http://www.mikroe.com/en/tools/easypic6/
  18.      Oscillator:      HS, 8.0000 MHz
  19.      Ext. Modules:    - freq signal comes in on PORTC.F0
  20.      SW:              mikroC PRO for PIC v2.50
  21.  
  22. ******************************************************************************/
  23.  
  24. // global declarations
  25.  
  26. // Port Expander module connections
  27. sbit  SPExpanderCS  at RA2_bit;
  28. sbit  SPExpanderRST at RA3_bit;
  29. sbit  SPExpanderCS_Direction  at TRISA2_bit;
  30. sbit  SPExpanderRST_Direction at TRISA3_bit;
  31. // End Port Expander module connections
  32.  
  33. unsigned char int_sec_count;    // used to count ints/second
  34. unsigned char new_second;       // is set once per second
  35.  
  36. unsigned char tchar;            // text char used in LCD display numbers
  37. unsigned int freq;              // 0-65000, holds freq value to display
  38.  
  39. unsigned long rpm;              // holds RPM for calcs AND display
  40.  
  41. char txt[12];                   // used to display number string
  42.  
  43. char sec_count;
  44.  
  45. //-----------------------------------------------------------------------------
  46. void interrupt()
  47. {
  48.     // this is TMR2 overflow interrupt
  49.     int_sec_count--;
  50.     if(!int_sec_count)    // if reached 1 second!
  51.     {
  52.       // get the TMR1 count!
  53.       T1CON = 0;        // TMR1 OFF
  54.       freq = ((TMR1H << 8) + TMR1L);  // put TMR1 16bit value in freq
  55.       TMR1L = 0;        // clear TMR1
  56.       TMR1H = 0;
  57.       T1CON = 0b00000011;   // TMR1 back ON again
  58.  
  59.       // that's everything done for this second
  60.       new_second++;
  61.       int_sec_count = 125;  // load ready to generate another second
  62.     }
  63.     TMR2IF_bit = 0;           // Clear TMR2IF before exit
  64. }
  65.  
  66. //-----------------------------------------------------------------------------
  67. void main()
  68. {
  69.  
  70.   //-------------------------------------------------------
  71.   // setup PIC 16F887 registers
  72.   ANSEL  = 0;                               // Configure AN pins as digital
  73.   ANSELH = 0;
  74.   C1ON_bit = 0;                             // Disable comparators
  75.   C2ON_bit = 0;
  76.  
  77.   TRISC = 0b00000001;         // PORTC.F0 = input from freq signal
  78.  
  79.   //-------------------------------------------------------
  80.   // EasyPIC6 COG text LCD setup
  81.   // Port Expander Library uses SPI1 module
  82.   SPI1_Init();                              // Initialize SPI module used with PortExpander
  83.  
  84.   // show startup message
  85.   SPI_Lcd_Config(0);                        // Initialize Lcd over SPI interface
  86.   SPI_Lcd_Cmd(_LCD_CLEAR);                  // Clear display
  87.   SPI_Lcd_Cmd(_LCD_CURSOR_OFF);             // Turn cursor off
  88.   SPI_Lcd_Out(1,2, "EP6  Frequency");       // display startup text to Lcd
  89.   SPI_Lcd_Out(2,2, " & RPM  Meter ");
  90.   Delay_1sec();
  91.   Delay_1sec();
  92.  
  93.   // clear LCD again before main
  94.   SPI_Lcd_Cmd(_LCD_CLEAR);
  95.  
  96.   //-------------------------------------------------------
  97.   // setup the timers for frequency counting
  98.  
  99.   // setup TMR1
  100.   T1CON = 0b00000011;       // TMR1 ON, external clock pulse on PORTC.F0
  101.  
  102.   // setup TMR2 and enable TMR2 int
  103.   T2CON = 0b00011111;       // TMR2 ON, 8MHz xtal, 16:4:1 = 31250 Hz
  104.   PR2 = 250;                // TMR2 int is 31250 / 250 = 125 ints/sec
  105.   PIE1.TMR2IE = 1;          // TMR2 interrupt is on
  106.   INTCON = 0b11000000;      // GIE=ON, PIE=ON
  107.  
  108.   // load variables ready to run
  109.   int_sec_count = 125;
  110.  
  111.   //-------------------------------------------------------
  112.   // now do the main run loop
  113.   while(1)
  114.   {                                
  115.     // safe limit freq at 65 kHz
  116.     if(freq > 65000) freq = 65000;
  117.  
  118.     // everytime we reach a second, calculate and display freq
  119.     if(new_second)
  120.     {
  121.       new_second = 0;
  122.  
  123.       // display freq as "xxxxx Hz"
  124.       WordToStr(freq,txt);
  125.       SPI_Lcd_Out(1,8,txt);
  126.       SPI_Lcd_Out(1,14,"Hz");
  127.  
  128.       // calc RPM from freq
  129.       rpm = (freq * 60);
  130.  
  131.       // format rpm to display as "xxxxxxx RPM"
  132.       LongToStr(rpm,txt);       // get the rpm as a string
  133.       SPI_Lcd_Out(2,2,txt);     // and display RPM!
  134.       SPI_Lcd_Out(2,14,"RPM");
  135.     }
  136.   }
  137. }


Az spi-s dolgokkal nem kell foglalkozni és a komparátor és analóg bemenetekhez tartozó paranccsal azt már átírtam a 18f nyelvére.
(#) Hp41C válasza janimester hozzászólására (») Okt 5, 2013 / 1
 
Szia!
  1. unsigned char int_sec_count;    // used to count ints/second

helyett
  1. unsigned int int_sec_count;    // used to count ints/second

és minden előfordulásánál az
  1. int_sec_count = 125;

helyett
  1. int_sec_count = 750;
(#) janimester válasza Hp41C hozzászólására (») Okt 5, 2013 /
 
Szia, köszönöm szépen módosítom ez szerint.
(#) whalaky válasza _vl_ hozzászólására (») Okt 6, 2013 /
 
Hát ha szét szakadok is warningol.....
  1. const rom char strVersion[] = "Version 1.0";
  2. char outdata[];
  3. ....
  4. strcpypgm2ram( &outdata[5], strVersion );

erre még mindíg Warning [2066] type qualifier mismatch in assignment

  1. rom const char * cmd_commands[] = {
  2.     "LEDS"
  3. };
  4. char cmd[5];
  5. if( strncmpram2pgm( commands[i], cmd, 4 ) == 0 )

Erre pedig Warning [2066] type qualifier mismatch in assignment

Mit nem csinálok jól?
(MPLAB C18 v3.45)
(#) pbalazs válasza whalaky hozzászólására (») Okt 6, 2013 /
 
Nem ismerem a C18-at, de szerintem csak annyi a baja, hogy konstans memóriaterületre állítasz egy pointert, és szól, hogy veszélyes vizekre eveztél.
Ha erre a memóriaterületre a változó nevével közvetlenül hivatkozol, akkor nem fogod tudni felülírni a "const" miatt. De ha ugyanide pointerrel hivatkozol, akkor már felülírható. A szintaktika szempontjából pedig mindegy, hogy az egy ROM terület, és egyébként sem lehet "csak úgy" írkálni oda.
Másrészt az is lehet a baj, hogy egy konstans "változót" egy nem konstans változóba másolsz, ami innentől szabadon megváltoztatható, azaz afféle típus konverzió történik.
(#) killbill válasza whalaky hozzászólására (») Okt 6, 2013 / 1
 
Akkor kapod ezt a warning-ot, ha az strcpypgm2ram()-nak nem jo tipusu erteket adsz at.

Amit kap az (char *, const rom char *)

Hogy mit var az strcpypgm2ram() azt meg kellene nezni abban a header-ben, ahol deklaraljak, ami valoszinuleg a string.h lesz. Mondjuk logikusan ezt kellene varnia.

Na, utanaolvastam a neten: A C18 leirasa irja (csak nem tudok a pdf-bol masolni), hogy elofordul, hogy ezt a warningot kapod, ha a masodik parameter 'near' mikozben a fuggveny 'far'-t var. Valoszinuleg a megoldas a problemadra:

strcpypgm2ram(outdata + 5, (const rom far char *)strVersion);

Erdemes a C18 pdf-jet elolvasni, ott irnak meg par dolgot ezzel kapcsolatban.

Udv,
Andor
(#) whalaky válasza pbalazs hozzászólására (») Okt 6, 2013 /
 
Nem akarok "csak úgy írkálni", hanem a ROM területre akarom tenni a string konstansokat hogy ne a RAM-ot zabálják.
killbill: Köszi! Ez lett a megoldás egyszerűen csak egy far kellett neki.
(#) killbill válasza whalaky hozzászólására (») Okt 6, 2013 /
 
Szuper!
(#) univerzum hozzászólása Okt 8, 2013 /
 
Üdv, valaki elmondhatná, ha van mondjuk egy nand nor stb kapu, hogyan tudok kialakítani c-ben picre?
Azért lenne érdekes, mert plc-t kéne alkalmazni az alkalmazáshoz, de nem akarok rá 10-en ezreket költeni, amúgy is csak egy uC- van ugyanúgy egy plc-ben is.
Valaki tudna-e példákat mutatni?
Következő: »»   83 / 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