Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   740 / 1320
(#) vilmosd válasza tamibandy hozzászólására (») Máj 14, 2010 /
 
Gondolom a terminalon latod a pontokat es az y-okat. Egyik megoldas, hogy a terminalt atallitod hex kiirasara, vagy a PICben atalakitod ASCII formatumra a szamokat es azt kuldod a terminalra. Esetleg elkuldhetned a Te altalad irt progit, es akkor biztosan tobbet lehetne mondani.
Udv Vili
(#) tamibandy válasza vilmosd hozzászólására (») Máj 14, 2010 /
 
Aham, terminálon irja igen a pontokat és az ipszilonokat. Termite, ezt a terminált használom.

Probálkoztam már a sprintf-es átalakitással, de ugyis csak vesszőket kaptam akárhova is érintettem az ADC bemenetet.

Itt a kód:
  1. #include<plib.h>
  2. #include<string.h>
  3. #include "config.h"
  4. #include "stdtypes.h"
  5.  
  6. #ifndef OVERRIDE_CONFIG_BITS
  7.  
  8. #pragma config ICESEL   = ICS_PGx2              // ICE/ICD Comm Channel Select
  9. #pragma config BWP      = OFF                   // Boot Flash Write Protect
  10. #pragma config CP       = OFF                   // Code Protect
  11. #pragma config FNOSC    = PRIPLL                // Oscillator Selection
  12. #pragma config FSOSCEN  = OFF                   // Secondary Oscillator Enable
  13. #pragma config IESO     = OFF                   // Internal/External Switch-over
  14. #pragma config POSCMOD  = HS                    // Primary Oscillator
  15. #pragma config OSCIOFNC = OFF                   // CLKO Enable
  16. #pragma config FPBDIV   = DIV_1                 // Peripheral Clock divisor
  17. #pragma config FCKSM    = CSDCMD                // Clock Switching & Fail Safe Clock Monitor
  18. #pragma config WDTPS    = PS1                   // Watchdog Timer Postscale
  19. #pragma config FWDTEN   = OFF                   // Watchdog Timer
  20. #pragma config FPLLIDIV = DIV_2                 // PLL Input Divider
  21. #pragma config FPLLMUL  = MUL_20                // PLL Multiplier
  22. //#pragma config UPLLIDIV = DIV_2               // USB PLL Input Divider
  23. //#pragma config UPLLEN   = OFF                 // USB PLL Enabled
  24. #pragma config FPLLODIV = DIV_1                 // PLL Output Divider
  25. #pragma config PWP      = OFF                   // Program Flash Write Protect
  26. #pragma config DEBUG    = OFF                   // Debugger Enable/Disable
  27.  
  28. #endif
  29.  
  30.  
  31.  
  32. /******* Serial parameters and variables *******/
  33. #define DESIRED_BAUDRATE        (57600)      // The desired BaudRate
  34. #define SYSTEM_FREQUENCY (80000000L)      // defining the system's running frequency
  35.  
  36. #define config1         UART_EN | UART_IDLE_CON | UART_RX_TX | UART_DIS_WAKE | UART_DIS_LOOPBACK | UART_DIS_ABAUD | UART_NO_PAR_8BIT | UART_1STOPBIT | UART_IRDA_DIS | UART_DIS_BCLK_CTS_RTS| UART_NORMAL_RX | UART_BRGH_SIXTEEN
  37. #define config2         UART_TX_PIN_LOW | UART_RX_ENABLE | UART_TX_ENABLE | UART_INT_TX | UART_INT_RX_CHAR | UART_ADR_DETECT_DIS | UART_RX_OVERRUN_CLEAR
  38.  
  39. unsigned short int channel4;    // conversion result as read from result buffer
  40. unsigned int offset;
  41. volatile unsigned char data;
  42. int ADCValue;
  43.  
  44. void    Wait_ms(WORD ms);
  45.  
  46. int main(void)
  47. {
  48.         AD1PCFG = 0xFFFB;
  49.         AD1CON1 = 0x0000;
  50.         AD1CHS = 0x00020000;
  51.         AD1CSSL = 0;
  52.         AD1CON3 = 0x0002;
  53.         AD1CON2 = 0;
  54.         AD1CON1SET = 0x8000;
  55.  
  56. //      SYSTEMConfig(SYSTEM_FREQUENCY, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
  57.         // configure and enable the ADC
  58. //      CloseADC10();   // ensure the ADC is off before setting the configuration
  59.         // define setup parameters for OpenADC10
  60.         //                              Turn module on | ouput in integer | trigger mode auto | enable autosample
  61. //      #define PARAM1  ADC_FORMAT_INTG | ADC_CLK_AUTO | ADC_AUTO_SAMPLING_ON
  62.         // define setup parameters for OpenADC10
  63.         //                              ADC ref external    | disable offset test    | disable scan mode | perform 2 samples | use dual buffers | use alternate mode
  64. //      #define PARAM2  ADC_VREF_AVDD_AVSS | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_OFF | ADC_SAMPLES_PER_INT_2 | ADC_ALT_BUF_ON | ADC_ALT_INPUT_ON
  65.         // define setup parameters for OpenADC10
  66.         //                                use ADC internal clock | set sample time
  67. //      #define PARAM3  ADC_CONV_CLK_INTERNAL_RC | ADC_SAMPLE_TIME_15
  68.         // define setup parameters for OpenADC10
  69.         //               set AN4 and AN5 as analog inputs
  70. //      #define PARAM4  ENABLE_AN4_ANA | ENABLE_AN5_ANA
  71.         // define setup parameters for OpenADC10
  72.         // do not assign channels to scan
  73. //      #define PARAM5  SKIP_SCAN_ALL
  74.         // use ground as neg ref for A | use AN4 for input A      |  use ground as neg ref for A | use AN5 for input B
  75.         // configure to sample AN4 & AN5
  76. //      SetChanADC10( ADC_CH0_NEG_SAMPLEA_NVREF | ADC_CH0_POS_SAMPLEA_AN4 |  ADC_CH0_NEG_SAMPLEB_NVREF | ADC_CH0_POS_SAMPLEB_AN5); // configure to sample AN4 & AN5
  77. //      OpenADC10( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5 ); // configure ADC using the parameters defined above
  78. //      EnableADC10(); // Enable the ADC
  79.  
  80.         // Configure the proper PB frequency and the number of wait states
  81.         int     pbClk;
  82.         pbClk = SYSTEMConfigPerformance(SYSTEM_FREQUENCY);
  83.        
  84.  
  85.  
  86.         // Open UART2 with config1 and config2
  87.         OpenUART2( config1, config2, pbClk/16/DESIRED_BAUDRATE-1);      // calculate actual BAUD generate value.
  88.                
  89.         // Configure UART2 RX Interrupt with priority 2
  90.         ConfigIntUART2(UART_INT_PR2 | UART_RX_INT_EN);
  91.        
  92.         // Must enable glocal interrupts - in this case, we are using multi-vector mode
  93.     INTEnableSystemMultiVectoredInt();
  94.  
  95.         // this will store the values sent over RS232
  96.         char RS232_Out_Buffer[64];
  97.  
  98.         putsUART2("*** Hello From the Mechatronics Lab ***\r\n");
  99.  
  100.         // start the infinite loop
  101.         while(1)
  102.     {
  103.                 AD1CON1SET = 0x0002;
  104.                 Wait_ms(100);
  105.                 AD1CON1CLR = 0x0002;
  106.                 while (!(AD1CON1 & 0x0001));
  107.                 ADCValue = ADC1BUF0;
  108.                 putcUART2(ADCValue);
  109.  
  110.                 // wait for the first conversion to complete so there will be valid data in ADC result registers
  111. //              while ( ! mAD1GetIntFlag() ) { }
  112.  
  113.                 // read the ADC
  114. //              offset = 8 * ((~ReadActiveBufferADC10() & 0x01));  // determine which buffer is idle and create an offset
  115. //              channel4 = ReadADC10(offset);           // read the result of channel 4 conversion from the idle buffer
  116.                
  117. //              sprintf(RS232_Out_Buffer, "Analog Input %d\r\n", channel4); // make the string
  118. //              putcUART2(RS232_Out_Buffer);
  119.  
  120.                 //Wait_ms(1500);
  121. //              mAD1ClearIntFlag();
  122.  
  123.         } // end while(1)
  124. }  // end main
  125.  
  126.  
  127. void Wait_ms(WORD delay) {
  128.  
  129.         WORD i;
  130.  
  131.         while(delay > 0){
  132.  
  133.                 for( i = 0; i < 8000; i ++){
  134.                         ;;
  135.                 }
  136.                 delay--;
  137.         }
  138. }
(#) tamibandy válasza tamibandy hozzászólására (») Máj 14, 2010 /
 
Két fajta módszerrel is próbálkoztam, az egyik ki van commentálva.
(#) watt válasza tamibandy hozzászólására (») Máj 14, 2010 /
 
  1. putcUART2(ADCValue);

Ez csak egy bájtot fog elküldeni.
Helyette ilyesmi kéne:
  1. putcUART2(ADCValue);
  2. putcUART2(ADCValue >> 8);

(Már régen progiztam C-ben, remélem jól írtam a >>-t )
A terminálban csak a hex kódokat fogod látni, ahhoz, hogy ott szám legyen a PIC-ben ASCII kódokká kell konvertálnod a mért értéket és azokat elküldeni sorban.

Máskor, ha ilyen hosszú a kód, inkább txt-be másold és azt csatold.
(#) vilmosd válasza tamibandy hozzászólására (») Máj 14, 2010 /
 
Nem tudom milyen forditot hasznalsz es nem ismerem a Te putcUART2() fuggvenyedet, de pl normal printf () fvenynel ezt igy lehet megcsinalni:
  1. printf("%d ",ADCValue);
Aholis maga a printf fv. atalakitja decimalissa a szamot egyszeruen es fajdalommentesen.
Udv Vili
(#) watt válasza vilmosd hozzászólására (») Máj 14, 2010 /
 
Na jó, de egy 16bites számot hiába alakít decimálissá, vagy ez ASCII kódokká alakítja helyiértékenkén és úgy küldi ki sorban?
(#) trudnai válasza vilmosd hozzászólására (») Máj 14, 2010 /
 
A "fajdalom mentes" kifejezes amugy relativ -- printf eleg sok program memoriat fel tud emeszteni. Neha jobb az itoa hasznalata...
(#) szilva válasza watt hozzászólására (») Máj 14, 2010 /
 
Igen, karakterekként írja ki, mintha pl. egy konzolra írnál ki egy számot. A printf az adott nyelvi környezettől függően valamilyen karakterküldő "primitívet" (pl. putch, putchar) fog meghívogatni minden egyes kiírandó karakterrel, azt, hogy ezt milyen néven és hogy kell megírni, hogy működjön is, az adott fordító manualjából kell kilesni.
(#) watt válasza szilva hozzászólására (») Máj 14, 2010 /
 
Aha, köszi, én nem használtam még ilyen beépített dolgot. Ez biztosan az ASM miatt van.
(#) vilmosd válasza trudnai hozzászólására (») Máj 14, 2010 /
 
Hali
Ezt tudjuk, de a kezdok szempontjabol, es ha van eleg nagy memoriad sokkal egyszerubb. Majd ha 98 % lesz a memoria telitettsege lehet gondolkodni mikent csokkentsuk a progi meretet. (vagy veszunk eggyel nagyobb PIC-et) De ha itoa fv-t hasznalsz akkor is kell printf, putc vagy valami amivel a terminalra kuldod.
Udv Vili
(#) icserny válasza watt hozzászólására (») Máj 14, 2010 /
 
Egy übergagyi eljárással így lehet egy legfeljebb 16 bites számot hexában kiküldeni:

  1. void out4hex(unsigned int t)
  2.  {
  3.    char c;
  4.    c=(char)((t>>12) & 0x0F);
  5.    if (c>9) c+=7;
  6.    putcUART2(c+'0');
  7.    c=(char)((t>>8) & 0x0F);
  8.    if (c>9) c+=7;
  9.    putcUART2(c+'0');
  10.    c=(char)((t>>4) & 0x0F);
  11.    if (c>9) c+=7;
  12.    putcUART2(c+'0');
  13.    c=(char)(t & 0x0F);
  14.    if (c>9) c+=7;
  15.    putcUART2(c+'0');
  16.  }
(#) tamibandy válasza vilmosd hozzászólására (») Máj 14, 2010 /
 
Szia,

Használtam ezt de ezzel sem müködik :
  1. sprintf(RS232_Out_Buffer, "Analog Input %d\r\n", ADCValue)
  2. putcUART2(RS232_Out_Buffer);


gondolom ez is ugyanaz mint a printf csak itt átrakja ebbe a változóba, ami ki tudok küldeni rs232-esen

Amúgy nekem a terminálon megjelenik hexában is meg rendesen is. Pl. ha kiküldok a putcUART2("Hello world!") akkór azt ki tudom olvasni a terminálon.

Megpróbálom watt ötletét hátha azzal menni fog.
(#) vilmosd válasza tamibandy hozzászólására (») Máj 14, 2010 /
 
Hali
Mert strig-kent kellene kikuldeni.
  1. sprintf(RS232_Out_Buffer, "Analog Input %d\r\n", ADCValue)
  2. putcUART2("%s",RS232_Out_Buffer);
a Te programodban a string hexa ertekeit kuldi ki nem ASCII-kent.
(#) tamibandy válasza vilmosd hozzászólására (») Máj 14, 2010 /
 
Jaj Köszi szépen, megoldódott.
Most kijön szépen a 0 és az 1023

  1. ADCValue = ADC1BUF0;
  2.                 sprintf(RS232_Out_Buffer, "Analog Input %d\r\n", ADCValue); // make the string
  3.                 putsUART2(RS232_Out_Buffer);


ez a jó megoldás ha valaki még belebotlik ebbe a problémába.
(#) tamibandy hozzászólása Máj 14, 2010 /
 
Ha már itt vagyok, az lenne a következő kérdésem, hogy mért van az hogy van 4 darab PWM motor vezérlőm, külön külön szépen megy mindenik, de ha egyszerre akarom öket müködtetni akkór nem kapnak áramot a motrok. A HBridge az megkapja a teljes feszültséget, de mikór mind a 4 motórt akarom futtatni (egyszerre) akkór nem engedi át a HBridgen a feszültséget csak nagyon keveset, amitől a motrok éppen csak morrognak.

Van erre valami ötletetek? Ugyancsak PIC32-es, és minden ugyanaz mint az elöbb.

Kódrészlet:
  1. unsigned int Pwm = 0;
  2. unsigned char Mode = 0;
  3.  
  4. void    Wait_ms(WORD ms);
  5.  
  6. int main(void)
  7. {
  8.         /* Enable OC | 32 bit Mode  | Timer2 is selected | Continuous O/P   | OC Pin High , S Compare value, Compare value*/
  9.         OpenOC1( OC_ON | OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE, 0, 0 );              // JH Port 7-12
  10.         OpenOC2( OC_ON | OC_TIMER3_SRC | OC_PWM_FAULT_PIN_DISABLE, 0, 0 );              // JD Port 1-6
  11.         //OpenOC3( OC_ON | OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE, 0, 0 );            // JD Port 7-12
  12.         //OpenOC4( OC_ON | OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE, 0, 0 );            // JE Port 7-12
  13.  
  14.         /* Open Timer2 with Period register value */
  15.         OpenTimer2(T2_ON | T2_PS_1_1 | T2_SOURCE_INT, 0x2710);                                  // PWM period = (PR2+1) x Prescale / SYS_FRECV
  16.                                                                                                                                                         // PWM period = (39999+1) x 1 / 80000000
  17.         OpenTimer3(T3_ON | T3_PS_1_1 | T3_SOURCE_INT, 0x2710);                                  // PWM period = (PR2+1) x Prescale / SYS_FRECV
  18.                                                                                                                                                         // PWM period = (39999+1) x 1 / 80000000
  19.         /*
  20.           The expected output looks like the diagram below with approximately 6% duty-cycle
  21.  
  22.            ||      ||      ||
  23.          ______||______||______||______
  24.  
  25.         */
  26.         while (1)
  27.         {
  28.                 if ( Mode )
  29.                 {
  30.                         if ( Pwm < 10000 )                      // ramp up mode
  31.                         {
  32.                                 Pwm++;                                  // If the duty cycle is not at max, increase
  33.                                 SetDCOC1PWM(Pwm);               // Write new duty cycle
  34.                                 SetDCOC2PWM(Pwm);               // Write new duty cycle
  35.                                 //SetDCOC3PWM(Pwm);             // Write new duty cycle
  36.                                 //SetDCOC4PWM(Pwm);             // Write new duty cycle
  37.                                 Wait_ms(1);
  38.                         }
  39.                         else
  40.                         {
  41.                                 Mode = 0;                               // PWM is at max, change mode to ramp down
  42.                         }
  43.                 }                                                               // end of ramp up
  44.                 else
  45.                 {
  46.                         if ( Pwm > 0 )                                  // ramp down mode
  47.                         {
  48.                                 Pwm--;                                  // If the duty cycle is not at min, decrease
  49.                                 SetDCOC1PWM(Pwm);               // Write new duty cycle
  50.                                 SetDCOC2PWM(Pwm);               // Write new duty cycle
  51.                                 //SetDCOC3PWM(Pwm);             // Write new duty cycle
  52.                                 //SetDCOC4PWM(Pwm);             // Write new duty cycle
  53.                                 Wait_ms(1);
  54.                         }
  55.                         else
  56.                         {
  57.                                 Mode = 1;                               // PWM is at min, change mode ro ramp up
  58.                         }
  59.                 }                                                               // end of ramp down
  60.         }
  61.  
  62.         /* Close Output Compare */
  63.         CloseOC2();
  64.  
  65.         return (0);
  66. }
(#) Attila86 hozzászólása Máj 14, 2010 /
 
Mitől resetel a PIC-em? A watchdog ki van kapcsolva. Ráadásul olyan helyről resetel ahol eddig minden probléma nélkül továbbment. A gyakorlatban és a szimulátorban is resetel. Mi okozhatja ezt?

Szerk.: Van egy "delay100ms" nevű időzítő szubrutinom. Ezt egy helyen közvetlen egymás után háromszor hívom meg és a második meghíváskor resetel a PIC.
(#) Attila86 válasza Attila86 hozzászólására (») Máj 14, 2010 /
 
Hohóóó... ha a szubrutint visszamásolom az inc fájlomból az asm fájlba és az inc-ben kikommentezem akkor nem resetel a PIC! Ez így elég rossz dolog... Mitől van ez?

Szerk.: Sajnos így is resetel csak később, egy későbbi rutin-hívásnál.
(#) vilmosd válasza Attila86 hozzászólására (») Máj 14, 2010 /
 
Stack overflow ? Esetleg.
(#) Attila86 válasza vilmosd hozzászólására (») Máj 14, 2010 /
 
Mi az a stack?
(#) vilmosd válasza Attila86 hozzászólására (») Máj 14, 2010 /
 
Veremtar. A PIC-nel (18F) 31 szintu lehet. Ebben tarolja a szubrutinhivaskor es a megszakitaskor a visszateresi cimeket. Ha sok az egymasbaagyazott szubrutinhivas es meg 2 szintu megszakitast is hasznalsz, tul lehet lepni a hatart es akkor csinal hibakat. A STKFUL es a STKUNF biteket kell lesni a STPTR regiszterben. Magasabb szintu programnyelveknel a fordito automatikusan figyeli, de ASM-nel Neked kell figyelni ra.
UdV Vili
(#) Attila86 válasza vilmosd hozzászólására (») Máj 14, 2010 /
 
Ja akkor tudom mi az. Megnéztem és igen, a veremtár telítődése miatt resetel a PIC. Viszont erre nincs semmi oka! Van a programomban ez a három sor:
  1. call    delay100ms
  2.         call    delay100ms
  3.         call    delay100ms

Az elsőn még átmegy rendesen, aztán belép a másodikba és ott elkezdi dekrementálni az egyik regisztert (időzítés) aztán egyszercsak hirtelen a semmiből az STKPTR legfelső bitje H lesz és a PIC resetel. Mindezt mondom úgy, hogy az előző "call delay100ms" szubrutinból még hibátlanul visszatért. Sőt, nem hogy a veremtár 31. szintjét, de még csak a másodikat sem éri el a PIC mert ez a szubrutin-hívás a főprogramban történik (a legfelső szinten).

De ahogy nézem a probléma a megszakítás okozhatja valahogyan mert ha a GIE bitet nullára állítom az inicializáció után akkor már nem resetel a PIC (de nem is lép be soha a megszakításba). A megszakításból akárhova vissza tud ugrani a PIC, ugye?
(#) tamibandy hozzászólása Máj 14, 2010 /
 
hogy mért van az hogy van 4 darab PWM motor vezérlőm, külön külön szépen megy mindenik, de ha egyszerre akarom öket müködtetni akkór nem kapnak áramot a motrok. A HBridge az megkapja a teljes feszültséget, de mikór mind a 4 motórt akarom futtatni (egyszerre) akkór nem engedi át a HBridgen a feszültséget csak nagyon keveset, amitől a motrok éppen csak morrognak.

Van erre valami ötletetek? Ugyancsak PIC32-es, és minden ugyanaz mint az elöbb.
(#) vilmosd válasza Attila86 hozzászólására (») Máj 14, 2010 /
 
Hali
Idézet:
„A megszakításból akárhova vissza tud ugrani a PIC, ugye?”
termeszetesen. A keslelteteseket probald meg maskepp megoldani. Pl TMR0 IT-vel. Ha sok az egymasba agyazott szubrutin akkor eloferdulnek ezek a problemak. At kell szervezni a programot, hogy ne legyen annyi szubrutin hivas. Kesleltetest pl IT-ben flag billegtetessel is el lehet erni, es akkor nincs Delay100ms szubrutin, csak varsz egyhelyben a flag visszabillentesere.
Udv Vili
(#) Attila86 válasza vilmosd hozzászólására (») Máj 14, 2010 /
 
Szia!

Nézegetem a kódot de egyszerűen elképzelhetetlennek tartom hogy eljut 31 szintig a verem! Szerintem még csak 10-ig sem de 31-ig az tényleg lehetetlen! Ennyire azért nem komplex a programom.
Azt ki lehet valahogyan deríteni hogy hol éri el a 31. szintet?

Szerk.: Végignéztem a programot az összes call utasításra rákeresve hogy mik lehetnek egybe ágyazva és arra jutottam, hogy a legeslegrosszabb esetben is a verem mélysége 5 lehet.
(#) vilmosd válasza Attila86 hozzászólására (») Máj 14, 2010 /
 
A szimulaciokor bekapcsolod a Hardware Stack ablakot es voila lathato a stack mozgasa.
(#) vilmosd válasza Attila86 hozzászólására (») Máj 14, 2010 /
 
Hali
Esetleg meg lehet ilyen hiba a tablazatok olvasasakor is. Tulcimzed a tablazatot, vagy laphataron atnyul a tablazat.
(#) Attila86 válasza vilmosd hozzászólására (») Máj 14, 2010 /
 
Ez sem lehet mert dcfsnz és retlw párossal van megoldva mindhárom táblázatom, tehát nem a PC-hez adok hozzá.
(#) Attila86 válasza vilmosd hozzászólására (») Máj 14, 2010 /
 
Köszönöm, így már mindjárt látom a dolgokat! A reset vektorra ugrás előtt a verem tényleg a 31. szinten van!
De érdekes ez a verem, mert a 0. szintjéhez azt van írva hogy "Empty", az 1.-höz 0007FA, a 2.-hoz 000F62. A 3. és a 29. köztiekhez egyöntetűen 0006FE, a 30.-hoz 00007E és a 31.-hez 000DAE. Na ezt én nem értem. Hogyan lehet az hogy a 3. és a 29. szinteken ugyan az a cím van?
(#) vicsys válasza Attila86 hozzászólására (») Máj 14, 2010 /
 
A szimulációnál nézd meg, hol jár a progid amikor arra részre pakol. Lehet, hogy véletlenül bennmaradt egy sor ami többször fut.
(#) pixels válasza Attila86 hozzászólására (») Máj 14, 2010 /
 
A verem alulcsordulásakor is resetel a proci, ha van egy kallódó return, vagy "függvény hívást" csinálsz goto utasítással call helyett. mindkettő okozhat ilyet, és ilyenkor lehet hogy a hibás rész nem is ott van, ahol kifagy a program
Következő: »»   740 / 1320
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