Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Programmazione ascensore in Linguaggio C
Forum - C/C++ - Programmazione ascensore in Linguaggio C

Avatar
43210 (Normal User)
Newbie


Messaggi: 1
Iscritto: 20/05/2014

Segnala al moderatore
Postato alle 16:19
Martedì, 20/05/2014
Come da titolo devo programmare un ascensore elettrico in linguaggio C
il programma viene inserito in arduino 2009
vengono utilizzati tre sensore reed(ingressi) uno per piano
tre pulsanti a pressione(ingressi) uno per piano
due motori( due uscite ciascun motore)
tre piani di lavoro dell'ascensore: piano terra, primo piano, secondo piano

funzionamento: l'ascensore dovrebbe salire o scendere in base al piano in cui si trova (indicato dai sensori) e in base al piano da cui viene chiamato (scelto dal pulsante premuto). Il motore principale fa andare l'ascensore al piano richiesto fermandosi quando il sensore del piano desiderato si setta con l'arrivo della cabina, dopo di che le porte dell'ascensore vengono aperte dal motore secondario, quello della porta, che in seguito le richiuderà.

piedini utilizzati:
pinc0 = sensore piano terra
pinc1 = sensore primo piano
pinc2 = sensore secondo piano
pinc3 = tasto piano terra
pinc4 = tasto primo piano
pinc5 = tasto secondo piano
pinb3 = input 1 driver porta
pinb4 = input 2 driver porta
pinb5 = input 1 driver motore principale
pinb6 = input 2 driver motore principale
ho già buttato giù il programma ma ho un problema: i motori non girano quando vengono premuti i pulsanti di richiamo dell'ascensore posizionati su ogni piano, mentre nel caso in cui l'ascensore si trovi al piano terreno (e quindi sensore piano terreno settato) i motori iniziano a girare per conto loro
qualcuno che riesce ad aiutarmi?

Codice sorgente - presumibilmente C++

  1. /*
  2.  * pr.c
  3.  *
  4.  * Created: 10/05/2014 09:25:48
  5.  *  Author: utente
  6.  */
  7.  
  8. #include <avr/io.h>
  9. #include <avr/interrupt.h>
  10.  
  11. #define TOGGLEBIT(ADDRESS,BIT) (ADDRESS^=(1<<(BIT)))
  12. #define CHECKBIT(ADDRESS,BIT) (ADDRESS&=(1<<(BIT)))
  13. #define SETBIT(ADDRESS,BIT) (ADDRESS|=(1<<(BIT)))
  14. #define CLEARBIT(ADDRESS,BIT) (ADDRESS&=~(1<<(BIT)))
  15.  
  16. #define sali 1
  17. #define scendi 2
  18. #define fermo 0
  19.  
  20. #define aperta 1
  21. #define chiusa 0
  22.  
  23. char tasto_primo_piano_old=0; //vecchia lettura tasto primo piano
  24. char tasto_secondo_piano_old=0; //vecchia lettura tasto secondo piano
  25. char tasto_piano_terra_old=0; //vecchia lettura tasto piano terra
  26.  
  27. char piano_ascensore =128; // livello del piano; 3 valori possibili: 0,1,2 se non siamo al piano il valore è 128
  28. char piano_selezionato =128;
  29.  
  30. char stato_porta = chiusa; //indica se la porta è aperta o meno
  31. char apri_porta=0;
  32. char chiudi_porta=0;
  33. char conteggio=0;
  34. char motore_ascensore =0;
  35.  
  36.  
  37. void init(void)
  38. {
  39.         DDRB=0xFF;//uscite (motori)
  40.         PORTB=0x00;
  41.         DDRD=0xFF;
  42.         DDRC=0x00; //ingressi (sensori piani e tasti di chiamata)
  43.         TCCR1A=0x00;  //normal mode
  44.         TCCR1B=0x05;  //prescaler a 1024
  45.         TIMSK1|=0x01;  //abilitazione interrupt timer1
  46.         TCNT1H=0xC2;
  47.         TCNT1L=0xF6;
  48. }
  49. //si suppone che non si possano premere contemporaneamente più tasti
  50. ISR(TIMER1_OVF_vect,ISR_BLOCK)//controllo ogni 1 ms lo stato dei tasti e l'apertura della porta
  51. {
  52.         TCNT1H=0xC2;
  53.         TCNT1L=0xF6;
  54.         if((CHECKBIT(PINC,PINC4) == 1) && (tasto_primo_piano_old == 0) && (piano_selezionato == 128))
  55.         //se il tasto primo piano è premuto e prima non lo era
  56.         //fare il confronto con piano 128 serve per far sì che una volta scelto uno dei 3 piani possibili
  57.         //questi if non siano più effettuati e così servo solo il piano scelto per la prima volta
  58.         {
  59.                 piano_selezionato = 1;
  60.                 tasto_primo_piano_old=1;
  61.         }
  62.         else if((CHECKBIT(PINC,PINC5) == 1) && (tasto_secondo_piano_old == 0) && (piano_selezionato == 128))
  63.         //se il tasto secondo piano è premuto e prima nn lo era
  64.         {
  65.                 piano_selezionato=2;
  66.                 tasto_secondo_piano_old=1;
  67.         }
  68.         else if((CHECKBIT(PINC,PINC3) == 1) && (tasto_piano_terra_old == 0) && (piano_selezionato == 128))
  69.         //se il tasto piano terra è premuto e prima nn lo era
  70.         {
  71.                 piano_selezionato=0;
  72.                 tasto_piano_terra_old=1;
  73.         }
  74.         else
  75.         {
  76.                 tasto_primo_piano_old = CHECKBIT(PINC,PINC4);
  77.                 tasto_secondo_piano_old = CHECKBIT(PINC,PINC5);
  78.                 tasto_piano_terra_old = CHECKBIT(PINC,PINC3);
  79.         }
  80.        
  81.         if ((stato_porta == aperta) && (chiudi_porta==1)) //se la porta è aperta e devi chiuderla
  82.         {      
  83.                 conteggio = 500;
  84.                 if(conteggio > 0)
  85.                 {
  86.                         conteggio--;//vedi quanto tempo impieghi ad aprire la porta
  87.                         SETBIT(PORTB,PINB2);//apri la porta
  88.                         CLEARBIT(PORTB,PINB3);
  89.                 }
  90.                 else
  91.                 {
  92.                         CLEARBIT(PORTB,PINB2);//terminato il conteggio la porta rimane ferma aperta
  93.                         CLEARBIT(PORTB,PINB3);
  94.                         chiudi_porta = 0;
  95.                         stato_porta = chiusa;//ormai la porta è chiusa
  96.                 }
  97.         }
  98.         else if ((stato_porta==chiusa) && (apri_porta==1))//se la porta è chiusa e devo aprirla
  99.         {      
  100.                 conteggio = 500;
  101.                 if(conteggio > 0)
  102.                 {
  103.                         conteggio--;//vedi quanto tempo impieghi a chiudere la porta
  104.                         CLEARBIT(PORTB,PINB2);//chiudi la porta
  105.                         SETBIT(PORTB,PINB3);
  106.                 }
  107.                 else
  108.                 {
  109.                         CLEARBIT(PORTB,PINB2);//terminato il conteggio la porta rimane ferma chiusa
  110.                         CLEARBIT(PORTB,PINB3);
  111.                         apri_porta = 0;//ormai la porta è aperta
  112.                         stato_porta = aperta;
  113.                 }
  114.         }
  115.        
  116.         switch (motore_ascensore)
  117.         {
  118.                 case fermo:
  119.                         CLEARBIT(PORTB,PINB4);//ascensore fermo
  120.                         CLEARBIT(PORTB,PINB5);
  121.                         break;
  122.                 case sali :
  123.                         SETBIT(PORTB,PINB4);//ascensore sale
  124.                         CLEARBIT(PORTB,PINB5);
  125.                         break;
  126.                 case scendi :
  127.                         CLEARBIT(PORTB,PINB4);//ascensore scende
  128.                         SETBIT(PORTB,PINB5);
  129.                         break;
  130.         }
  131. }              
  132.                
  133. int main(void)
  134. {
  135.         init();
  136.         sei();
  137.         while(1)
  138.         {              
  139.                 if              (CHECKBIT(PINC,PINC0)==1)       piano_ascensore = 0;
  140.                 else if (CHECKBIT(PINC,PINC1)==1)       piano_ascensore = 1;
  141.                 else if (CHECKBIT(PINC,PINC2)==1)       piano_ascensore = 2;
  142.                 else                                                            piano_ascensore = 128;//sono fra 2 piani
  143.                
  144.                 switch(piano_selezionato)
  145.                 {
  146.                         case 0://se seleziono il piano terra
  147.                                 if ((piano_ascensore == 1) || (piano_ascensore == 2))//se sono al primo o la secondo piano
  148.                                 {
  149.                                         if (stato_porta == aperta)      chiudi_porta = 1;
  150.                                         else                                            motore_ascensore = scendi;
  151.                                         //appena la porta è chiusa l'ascensore scende
  152.                                 }
  153.                                 else if (piano_ascensore == 0)
  154.                                 {
  155.                                         motore_ascensore = fermo;//l'ascensore sta fermo
  156.                                         if (stato_porta == chiusa)      apri_porta = 1;//se la porta è chiusa la apro
  157.                                         else                                            piano_selezionato = 128;//ho gestito la richiesta di cambiamento piano
  158.                                 }
  159.                                 break;
  160.                         case 1://se seleziono il primo piano
  161.                                 if (piano_ascensore == 2)//se sono al secondo piano
  162.                                 {
  163.                                         if (stato_porta == aperta)      chiudi_porta = 1;
  164.                                         else                                            motore_ascensore = scendi;
  165.                                         //appena la porta è chiusa l'ascensore scende
  166.                                 }
  167.                                 else if (piano_ascensore == 0)
  168.                                 {
  169.                                         if (stato_porta == aperta)      chiudi_porta = 1;
  170.                                         else                                            motore_ascensore = sali;
  171.                                         //appena la porta è chiusa l'ascensore sale
  172.                                 }
  173.                                 else if (piano_ascensore == 1)
  174.                                 {
  175.                                         motore_ascensore = fermo;//l'ascensore sta fermo
  176.                                         if (stato_porta == chiusa)      apri_porta = 1;//se la porta è chiusa la apro
  177.                                         else                                            piano_selezionato = 128;//ho gestito la richiesta di cambiamento piano
  178.                                 }
  179.                                 break;
  180.                         case 2://se scelgo il secondo piano
  181.                                 if ((piano_ascensore == 1) || (piano_ascensore == 0))//se sono al primo o al piano terra
  182.                                 {
  183.                                         if (stato_porta == aperta)      chiudi_porta = 1;
  184.                                         else                                            motore_ascensore = sali;
  185.                                         //appena la porta è chiusa l'ascensore sale
  186.                                 }
  187.                                 else if (piano_ascensore == 2)
  188.                                 {
  189.                                         motore_ascensore = fermo;//l'ascensore sta fermo
  190.                                        
  191.                                         if (stato_porta == chiusa)      apri_porta = 1;//se la porta è chiusa la apro
  192.                                         else                                            piano_selezionato = 128;//ho gestito la richiesta di cambiamento piano
  193.                                 }
  194.                                 break;
  195.                         default:
  196.                                 break;
  197.                 }
  198.         }
  199. }


PM Quote