Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Test colloquio di lavoro
Forum - C/C++ - Test colloquio di lavoro - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 7:19
Mercoledì, 02/12/2015
Ciao, anche se c'è gente più esperta di me qui sul forum, volevo suggerirti qualcosa,
Intanto la soluzione del problema mi sembra più complessa di quella adottata da te, ad esempio parli di 6 display, mentre a me sembra che la funzione Start_Display() stampi unicamente su un unico display, infatti i pin sono sempre gli stessi, io prevederei una matrice di 6 righe per ogni display e 7 colonne uno per ogni pin, dichiarata globalmente e in cui inserirai i valori dei pin, alla funzione Start_Display passerai come parametro il numero display da usare e  tramite un ciclo for assegnerai a variabili locali i numero pin contenuti nella matrice nel numero display voluto.
Poi, le funzioni che usi nel tuo programma non sono di certo contenute negli header che hai incluso, forse potrebbero avere qualcosa da ridire, visto che cosi il programma non potrebbe in nessun modo funzionare.

Per quanto riguarda l'algoritmo, tu inconsciamente lo conosci, scrivi su un foglio di carta, in italiano cosa faresti TU, per muovere manualmente quei numeri.

Esempio, indicativo da approfondire e completare, solo per farti un idea del ragionamento:
1 stampo sul primo display il primo numero della stringa
2 stampo il punto decimale
3 Per quanti numeri dovrò stampare userò un uguale numero di display fino ad arrivare a 6 display
4 successivamente scorrerò la stringa a passo uno, e visualizzerò sui sei display 6 cifre a partire dal valore del contatore


Se i consigli  li troverai inutili chiedo venia :D

PM
Avatar
pocho183 (Normal User)
Rookie


Messaggi: 30
Iscritto: 22/02/2013

Segnala al moderatore
Postato alle 8:33
Mercoledì, 02/12/2015
Grazie....torn24
vorrei utilizzare la tua soluzione, ma non riesco a capire, come accendere i pin e poi scorrerli.
potresti inviarmi la tua email che ti faccio vedere il file che mi hanno mandato, qui non riesco ad allegarlo.

Stavo pensando cosi:

int m[9][6]={
   {1A,2A,3A,4A,5A,6A}
   {............................}
   {1G,2G,3G,4G,5G,6G}
altre due righe per il puntino(la virgola) e i due punti(orologio)
}

Poi non sono in grado di Utilizzare la funzione ad esempio Dio_WriteChannel(DIO_PA_0, STD_HIGH); in relazione alla matrice


PM
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 9:02
Mercoledì, 02/12/2015
Ciao, come ti ho accennato non sono di certo il più esperto, però del tuo codice modificherei la funzione stampa, e penserei a rifare il main(), con due cicli for, il primo ha il compito di stampare i primi 6 caratteri uno in ogni display, il secondo di fare scorrere la stringa, partendo dal secondo carattere.


Per la matrice, la dichiari a livello globale "non mi sembra un grosso difetto usare in questo caso variabili globali", le costanti dei pin dovrebbero essere alla fin fine valori interi, VERIFICA IL TIPO byte-char o int accettati dalla funzione , sono a digiuno di elettronica e non so se per il punto decimale o due punti presenti
nel display, ci sia un pin apposito, se si potresti aggiungere una colonna alla matrice 6x8 o 9, per quante informazioni ti servono.

Non sono disponibile a dare la mail, la mia di certo non era una soluzione ma solo un indicazione, che voleva darti qualche idea,
comunque ti posto cosa avevo pensato per la funzione Start_Display();


Codice sorgente - presumibilmente C#

  1. // Sei righe quanti sono i display 9 quanti sono i pin a display
  2. int m[6][9]={
  3.    {1A,2A,3A,4A,5A,6A}
  4.    {............................}
  5.    {1G,2G,3G,4G,5G,6G}
  6.  
  7.   }
  8.  
  9. /*PIU O MENO QUELLO CHE AVEVO IN MENTE*/
  10.  void Start_Display(int n, int display)
  11. {
  12.        int A0,A1,A2,A3,A4,A5,A6;
  13.        A0=m[dispay][0];
  14.        A1=m[dispay][1];
  15.        A2=m[dispay][2];
  16.        A3=m[dispay][3];
  17.        A4=m[dispay][4];
  18.        A5=m[dispay][5];
  19.        A6=m[dispay][6];
  20.      
  21.         switch(n)
  22.         {
  23.         case 0:
  24.                 Dio_WriteChannel(A0, STD_HIGH);
  25.                 Dio_WriteChannel(A1, STD_HIGH);
  26.                 Dio_WriteChannel(A2, STD_HIGH);
  27.                 Dio_WriteChannel(A3, STD_HIGH);
  28.                 Dio_WriteChannel(A4, STD_HIGH);
  29.                 Dio_WriteChannel(A5, STD_HIGH);
  30.                 Dio_WriteChannel(A6, STD_LOW);
  31.                 break;
  32.         case 1:


Ultima modifica effettuata da torn24 il 02/12/2015 alle 9:11
PM
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 9:37
Mercoledì, 02/12/2015
Essendo a digiuno di elettronica, ho guardato un po su google, bisogna considerare prima di tutto il componente elettronico che utilizzerai, visto che esistono display singoli che richiedono 7-8 pin per la loro gestione o componenti più complessi che richiedono 1 pin di selezione,uno per ogni display, e 7-8 pin per il carattere, tu dovresti sapere che tipo di componente stai usando e come si usa!! Io no :D

PM
Avatar
pocho183 (Normal User)
Rookie


Messaggi: 30
Iscritto: 22/02/2013

Segnala al moderatore
Postato alle 11:07
Mercoledì, 02/12/2015
Utilizzo display singoli, a 9 pin, 7 per i numeri uno per la virgola e uno per accendere i due punti.

La stringa si ripete all'infinito, finisce con '__'e poi riparte, del tipo 3.1415__3.1415__ecc avrei problemi a mostrare la virgola e ad accendere il trattino basso.Potresti suggerirmi un'idea.

Mi hanno dato la funzione void OS_Wait(uint32 delayMs), che introduce un ritardo per i numeri, potresti controllarla se l'ho inserita bene.

Posto il codice:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <iostream> //system pause
  3.  
  4. void OS_Wait(uint32_t delayMs) {
  5.         static uint32_t delayMs= 1000;
  6. }
  7.  
  8. int m[9][6]= {
  9.    {1A,2A,3A,4A,5A,6A }
  10.    {1B,2B,3B,4B,5B,6B}
  11.    {1C,2C,3C,4C,5C,6C}
  12.    {1D,2D,3D,4D,5D,6D}
  13.    {1E,2E,3E,4E,5E,6E}
  14.    {1F,2F,3F,4F,5F,6F}
  15.    {1G,2G,3G,4G,5G,6G}
  16.    {1COLON,2COLON,3COLON,4COLON,5COLON,6COLON} // i : per l'orario
  17.    {1DP,2DP,3DP,4DP,5DP,6DP} // Virgola
  18.   };
  19.  
  20.  void Start_Display(int n, int display)
  21. {
  22.        int DIO_PA_0,DIO_PA_1,DIO_PA_2,DIO_PA_3,DIO_PA_4,DIO_PA_5,DIO_PA_6,DIO_PA_7,DIO_PA_8;
  23.            DIO_PA_0=m[0][display];
  24.        DIO_PA_1=m[1][display];
  25.        DIO_PA_2=m[2][display];
  26.        DIO_PA_3=m[3][display];
  27.        DIO_PA_4=m[4][display];
  28.        DIO_PA_5=m[5][display];
  29.        DIO_PA_6=m[6][display];
  30.            DIO_PA_7=m[7][display];
  31.        DIO_PA_8=m[8][display];
  32.      
  33. switch(n)
  34.         {
  35.         case 0:
  36.                 Dio_WriteChannel(DIO_PA_0, STD_HIGH);
  37.                 Dio_WriteChannel(DIO_PA_1, STD_HIGH);
  38.                 Dio_WriteChannel(DIO_PA_2, STD_HIGH);
  39.                 Dio_WriteChannel(DIO_PA_3, STD_HIGH);
  40.                 Dio_WriteChannel(DIO_PA_4, STD_HIGH);
  41.                 Dio_WriteChannel(DIO_PA_5, STD_HIGH);
  42.                 Dio_WriteChannel(DIO_PA_6, STD_LOW);
  43.                 Dio_WriteChannel(DIO_PA_7, STD_LOW);
  44.                 Dio_WriteChannel(DIO_PA_8, STD_LOW);
  45.                 break;
  46.         case 1:
  47.                 Dio_WriteChannel(DIO_PA_0, STD_LOW);
  48.                 Dio_WriteChannel(DIO_PA_1, STD_HIGH);
  49.                 Dio_WriteChannel(DIO_PA_2, STD_HIGH);
  50.                 Dio_WriteChannel(DIO_PA_3, STD_LOW);
  51.                 Dio_WriteChannel(DIO_PA_4, STD_LOW);
  52.                 Dio_WriteChannel(DIO_PA_5, STD_LOW);
  53.                 Dio_WriteChannel(DIO_PA_6, STD_LOW);
  54.                 Dio_WriteChannel(DIO_PA_7, STD_LOW);
  55.                 Dio_WriteChannel(DIO_PA_8, STD_LOW);
  56.                 break;
  57.         case 2:
  58.                 Dio_WriteChannel(DIO_PA_0, STD_HIGH);
  59.                 Dio_WriteChannel(DIO_PA_1, STD_HIGH);
  60.                 Dio_WriteChannel(DIO_PA_2, STD_LOW);
  61.                 Dio_WriteChannel(DIO_PA_3, STD_HIGH);
  62.                 Dio_WriteChannel(DIO_PA_4, STD_HIGH);
  63.                 Dio_WriteChannel(DIO_PA_5, STD_LOW);
  64.                 Dio_WriteChannel(DIO_PA_6, STD_HIGH);
  65.                 Dio_WriteChannel(DIO_PA_7, STD_LOW);
  66.                 Dio_WriteChannel(DIO_PA_8, STD_LOW);
  67.                 break;
  68.         case 3:
  69.                 Dio_WriteChannel(DIO_PA_0, STD_HIGH);
  70.                 Dio_WriteChannel(DIO_PA_1, STD_HIGH);
  71.                 Dio_WriteChannel(DIO_PA_2, STD_HIGH);
  72.                 Dio_WriteChannel(DIO_PA_3, STD_HIGH);
  73.                 Dio_WriteChannel(DIO_PA_4, STD_LOW);
  74.                 Dio_WriteChannel(DIO_PA_5, STD_LOW);
  75.                 Dio_WriteChannel(DIO_PA_6, STD_HIGH);
  76.                 Dio_WriteChannel(DIO_PA_7, STD_LOW);
  77.                 Dio_WriteChannel(DIO_PA_8, STD_LOW);
  78.                 break;
  79.         case 4:
  80.                 Dio_WriteChannel(DIO_PA_0, STD_LOW);
  81.                 Dio_WriteChannel(DIO_PA_1, STD_HIGH);
  82.                 Dio_WriteChannel(DIO_PA_2, STD_HIGH);
  83.                 Dio_WriteChannel(DIO_PA_3, STD_LOW);
  84.                 Dio_WriteChannel(DIO_PA_4, STD_LOW);
  85.                 Dio_WriteChannel(DIO_PA_5, STD_HIGH);
  86.                 Dio_WriteChannel(DIO_PA_6, STD_HIGH);
  87.                 Dio_WriteChannel(DIO_PA_7, STD_LOW);
  88.                 Dio_WriteChannel(DIO_PA_8, STD_LOW);
  89.                 break;
  90.         case 5:
  91.                 Dio_WriteChannel(DIO_PA_0, STD_HIGH);
  92.                 Dio_WriteChannel(DIO_PA_1, STD_LOW);
  93.                 Dio_WriteChannel(DIO_PA_2, STD_HIGH);
  94.                 Dio_WriteChannel(DIO_PA_3, STD_HIGH);
  95.                 Dio_WriteChannel(DIO_PA_4, STD_LOW);
  96.                 Dio_WriteChannel(DIO_PA_5, STD_HIGH);
  97.                 Dio_WriteChannel(DIO_PA_6, STD_HIGH);
  98.                 Dio_WriteChannel(DIO_PA_7, STD_LOW);
  99.                 Dio_WriteChannel(DIO_PA_8, STD_LOW);
  100.                 break;
  101.         case 6:
  102.                 Dio_WriteChannel(DIO_PA_0, STD_HIGH);
  103.                 Dio_WriteChannel(DIO_PA_1, STD_LOW);
  104.                 Dio_WriteChannel(DIO_PA_2, STD_HIGH);
  105.                 Dio_WriteChannel(DIO_PA_3, STD_HIGH);
  106.                 Dio_WriteChannel(DIO_PA_4, STD_HIGH);
  107.                 Dio_WriteChannel(DIO_PA_5, STD_HIGH);
  108.                 Dio_WriteChannel(DIO_PA_6, STD_HIGH);
  109.                 Dio_WriteChannel(DIO_PA_7, STD_LOW);
  110.                 Dio_WriteChannel(DIO_PA_8, STD_LOW);
  111.                 break;
  112.         case 7:
  113.                 Dio_WriteChannel(DIO_PA_0, STD_HIGH);
  114.                 Dio_WriteChannel(DIO_PA_1, STD_HIGH);
  115.                 Dio_WriteChannel(DIO_PA_2, STD_HIGH);
  116.                 Dio_WriteChannel(DIO_PA_3, STD_LOW);
  117.                 Dio_WriteChannel(DIO_PA_4, STD_LOW);
  118.                 Dio_WriteChannel(DIO_PA_5, STD_LOW);
  119.                 Dio_WriteChannel(DIO_PA_6, STD_LOW);
  120.                 Dio_WriteChannel(DIO_PA_7, STD_LOW);
  121.                 Dio_WriteChannel(DIO_PA_8, STD_LOW);
  122.                 break;
  123.         case 8:
  124.                 Dio_WriteChannel(DIO_PA_0, STD_HIGH);
  125.                 Dio_WriteChannel(DIO_PA_1, STD_HIGH);
  126.                 Dio_WriteChannel(DIO_PA_2, STD_HIGH);
  127.                 Dio_WriteChannel(DIO_PA_3, STD_HIGH);
  128.                 Dio_WriteChannel(DIO_PA_4, STD_HIGH);
  129.                 Dio_WriteChannel(DIO_PA_5, STD_HIGH);
  130.                 Dio_WriteChannel(DIO_PA_6, STD_HIGH);
  131.                 Dio_WriteChannel(DIO_PA_7, STD_LOW);
  132.                 Dio_WriteChannel(DIO_PA_8, STD_LOW);
  133.                 break;
  134.         case 9:
  135.                 Dio_WriteChannel(DIO_PA_0, STD_HIGH);
  136.                 Dio_WriteChannel(DIO_PA_1, STD_HIGH);
  137.                 Dio_WriteChannel(DIO_PA_2, STD_HIGH);
  138.                 Dio_WriteChannel(DIO_PA_3, STD_HIGH);
  139.                 Dio_WriteChannel(DIO_PA_4, STD_LOW);
  140.                 Dio_WriteChannel(DIO_PA_5, STD_HIGH);
  141.                 Dio_WriteChannel(DIO_PA_6, STD_HIGH);
  142.                 Dio_WriteChannel(DIO_PA_7, STD_LOW);
  143.                 Dio_WriteChannel(DIO_PA_8, STD_LOW);
  144.                 break;
  145.                 }
  146.         OS_Wait(delayMS);
  147.         };
  148.  
  149. int main()
  150. {
  151.         static uint32_t delayMs= 1000;
  152.         char inputSeq[] = ("3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489");
  153.         char Time[]="22:11:08";
  154.         int i;
  155.         char value;
  156.         i=sizeof(inputSeq)/sizeof(char);
  157.         inputSeq[i++] = ("_");
  158.         inputSeq[i++] = ("_");
  159.         //printf("%d\n",i);
  160.         while(1){
  161.                 int x=0; //dichiarandolo qui garantisce la ripetizione della stringa
  162.                 for(x; x<6; x++){// carico i primi caratteri accendendo i 6 display
  163.                                 value=inputSeq[x];
  164.                                 Start_Display(value,x);
  165.                         }
  166.                 for(int z=x; z<i; z++){// Scorro tutta la stringa
  167.                                 value=inputSeq[z-5];
  168.                                 Start_Display(value,0);
  169.                                 value=inputSeq[z-4];
  170.                                 Start_Display(value,1);
  171.                                 value=inputSeq[z-3];
  172.                                 Start_Display(value,2);
  173.                                 value=inputSeq[z-2];
  174.                                 Start_Display(value,3);
  175.                                 value=inputSeq[z-1];
  176.                                 Start_Display(value,4);
  177.                                 value=inputSeq[z];
  178.                                 Start_Display(value,5);
  179.                         }
  180.         }
  181.                 OS_Wait(delayMs);
  182.                 //OS_GetActualTime();
  183.     printf("This is a native C program.\n");
  184.         system("pause");
  185.     return 0;
  186. }



PM
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 15:15
Mercoledì, 02/12/2015
Ciao, mi sembra che ti sei avvicinato molto alla soluzione, e io francamente ti ho dato solo qualche suggerimento.
Usi la matrice in modo "personale", in quanto secondo me molti avrebbero usato le colonne per memorizzare i pic, tu usi in vece le righe, ma penso poco male.

Per la funzione ritardo, puoi trovare esempi su picmicro, in pratica la funzione ritardo è un for o un while, che si ripete tante volte e quindi perde tempo, esempio, invii alla funzione delay-ritardo 1000 msecondi, esegue per dire 10000 iterazioni del while, e facendolo crea un ritardo, dipende anche dalla velocità del processore, quindi per avere un microsecondo di ritardo potrebbero servire 10000 interazioni su un processore o molte di più, ti consiglio di recuperare la funzione delay di microcontrollori pic, troverai il sorgente.


per quanto riguardo il trattino da stampare "_" lo gestirei come una qualunque altra cifra, crei nella funzione stampa la sequenza di pin da accendere per avere il trattino, quando trovi nella stringa il trattino, invierai alla funzione stampa il trattino, Start_Display(value,0); dove value è '_' perfettamente ammesso in uno switch()



per quanto riguarda il punto .... penso a qualcosa del genere NON SO SE PUO' ANDARE BENE...


Codice sorgente - presumibilmente C/C++

  1. bool PuntoTrovato==false;
  2.  for(x=0; x<=6; x++){// carico i primi caratteri accendendo i 6 display
  3.                                 value=inputSeq[x];
  4.                                 if(value=='.' && PuntoTrovato==false )
  5.                                  {
  6.                                       //Torno indietro col contatore, in quanto il punto appartiene al display precedente x-1
  7.                                       Dio_WriteChannel(m[9][x-1], STD_HIGH); //Accendo il pin del punto memorizzato nella matrice
  8.                                       PuntoTrovato=true;
  9.                                       x--;
  10.                                      
  11.                                  }
  12.                                  else{
  13.                                       if(PuntoTrovato==false)
  14.                                            Start_Diplay(value,x);
  15.                                        else
  16.                                             Start_Diplay(value,x-1);
  17.                                  }
  18.                         }





Ultima modifica effettuata da torn24 il 02/12/2015 alle 15:37
PM
Avatar
pocho183 (Normal User)
Rookie


Messaggi: 30
Iscritto: 22/02/2013

Segnala al moderatore
Postato alle 16:49
Mercoledì, 02/12/2015
Non te l'ho detto prima, ma utilizzo la matrice in quel modo, perchè ho seguito una tabella presente nel documento che mi hanno inviato, e rispecchia fedelmente la posizione di tutti i pin dei sei dispaly.

Ho risolto con la virgola, modificando(in parte) la tua idea, rimane un piccolo bug, ma lo lascerò indietro, perchè come ho fatto rileverà la virgola solo se capita tra i primi sei caratteri.

P.S potresti vedere se la funzione del ritardo OS_Wait l'ho fatta come intendevi tu?

Mi rimane l'ultimo punto :  Dopo aver premuto il tasto CLOCK il display deve essere in grado di modificare l'ora corrente nel formato HH: SS: MM. Dopo aver premuto nuovamente il tasto CLOCK il display deve tornare a visualizzare la sequenza numerica spostamento. Costruendo la funzione void OS_GetActualTime(uint8_t hour uint8_t minute uint8_t second). Il pulsante è DIO_CLOCK_BTN.

Allora è abbastanza complicata, non riesco a trovare una connessione tra una funzione che calcoli l'ora e la funzione GetActualTime, come ho fatto io non va bene perchè ho fissato un orario, invece dovrebbe scorrere in qualche modo, non so come

Codice sorgente - presumibilmente C++

  1. int main ...
  2.         int h[1],m[1],s[1];
  3.  
  4. ...
  5.  
  6.                                 while(DIO_CLOCK_BTN==STD_HIGH){// Se viene premuto un pulsante, mostra l'orario; per tornare alla sequenza si attende un altra pressione
  7.                                                 int Time[]=("21 13 59");
  8.                                                 h[0]=Time[0];
  9.                                                 h[1]=Time[1];
  10.                                                 m[0]=Time[3];
  11.                                                 m[1]=Time[4];
  12.                                                 s[0]=Time[6];
  13.                                                 s[1]=Time[7];
  14.                                                 OS_GetActualTime(h,m,s);
  15.                                 }      
  16.  
  17.  
  18. ....
  19. void OS_GetActualTime(uint8_t hour, uint8_t minute, uint8_t second){ // Restituisce il tempo corrente
  20.         int value;
  21.         DIO_PA_7=m[7][1];// seleziono il display che deve tenere i : accesi
  22.         Dio_WriteChannel(DIO_PA_7, STD_HIGH);
  23.         DIO_PA_7=m[7][3];// seleziono il display che deve tenere i : accesi
  24.         Dio_WriteChannel(DIO_PA_7, STD_HIGH);
  25.         for(int k=0;k<2;k++){
  26.                 value=hour[k];
  27.                 Start_Display(value,k);
  28.         }




questo è il ritardo

Codice sorgente - presumibilmente C/C++

  1. void OS_Wait(uint32_t delayMs) { //Ritardo
  2.         static uint32_t delayMs= 1000;
  3.         while (delayMs!=0) {
  4.                 delayMs--;
  5.         }
  6. }


Ultima modifica effettuata da pocho183 il 02/12/2015 alle 18:31
PM
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 7:01
Giovedì, 03/12/2015
Ciao, non posso proseguire nel suggerirti, uno perché forse non sono la persona indicata, due perché è meglio che il risultato sia merito o colpa :asd: tua e non mia, se si deve sbagliare non vorrei mai che fosse per colpa di qualcuno che non sia io :D


Ti ho detto che esistono esempi on line dell'implementazione di funzioni delay() credo che è meglio se guardi
"delay function implementation on microchip ".



Codice sorgente - presumibilmente C/C++

  1. void OS_Wait(uint32_t delayMs) { //Ritardo
  2.        // uint32_t è il tipo delayMs è il parametro
  3.        // un iterazione di 1000 o 2000 non è una pausa apprezzabile
  4.         while (delayMs!=0) {
  5.                 delayMs--;
  6.         }
  7. }


PM
Pagine: [ 1 2 3 ] Precedente | Prossimo