Go Down

Topic: Problema comunicacion puerto serie en ubuntu (Read 1 time) previous topic - next topic

akompe

Hola a todos!
Os comento el problemiya que tengo. He realizado un programa para controlar unos motores segun el caracter que se le envie por el puerto serie activara un motor u otro.
El caso es que le envio un caracter para activar un motor y funciona,  si vuelvo a enviarlo para activar el mismo motor o activar otro diferente, a veces funciona y a veces no, pero siempre acaba "petando" la comunicacion. He probado a utilizar el mismo programa pero sin los motores, simplemente conectando leds en vez de los motores y asi funciona siempre. Resulta que cuando da el error en la comunicacion el SO (ubuntu 12.04) me crea otro puerto diferente tty/ACM1 y si intento cargarle el programa de nuevo me dice que ya no esta en el puerto ACM0 que ahora esta en el ACM1, y asi todas las veces.
Lo unico que se me ocurre es que fuese algo relacionado con los motores, porque con los leds funciona perfectamente.
┬┐Alguien sabe cual podria ser el problema?
Os dejo aqui el programita que tengo para las pruebas.

Code: [Select]
#include <avr/interrupt.h>
#include <avr/sleep.h>

volatile int cont;

char entrada;
boolean mem_PET;
boolean mem_Al;
boolean envase;
int entradaAluminio = 4;
int entradaPet = 3;


void setup(){
  cli();
  TCCR2A=0; 
  TCCR2B=(0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(1<<0); // Preescaler a clock/1024
  TIMSK2=(0<<2)|(0<<1)|(1<<0);   // Bit 0.- Overflow
  SMCR=(0<<3)|(0<<2)|(0<<1)|(0<<0); //Power Save Mode
  //Turn off ADC
  ADCSRA=0;
  // TWI | TIMER2 | TIMER0 | VOID | TIMER1 | SPI | USART | ADC
  PRR=(1<<7)|(0<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);  // un "1" apaga el modulo un "0" deja en marcha el modulo
                                                                //activamos: ADC, USART, TIMER2
  // start serial port at 9600 bps:
  Serial.begin(9600);

  //Salidas
  pinMode(7,OUTPUT);  // Motor 2
  pinMode(6,OUTPUT);  // Motor 1
  pinMode(5,OUTPUT);  // Motor 3
  pinMode(4,OUTPUT);  // Motor 4
  pinMode(3,OUTPUT);  //Motor 5
 
  mem_PET = true;
  mem_Al = true;
  envase=false;       
  sei();
}

ISR(TIMER2_OVF_vect){    //vector interrupcion overflow timer2
cont++;
}
/*==========================*/
void loop()
{
//Serial.println("loop");
  if(Serial.available()>0){
     entrada = ' ';
     
     entrada = Serial.read();
   
     if(entrada == 'b'){
     
       entrada_pet();
     
     }else
     if(entrada == 'c'){
       
       ent_al();
     
       
     }else
     if(entrada == 'd'){
       
         exit();
         
         Serial.println("ok");

     }
  }


}//LOOP
void retardo(int segundos){
  segundos=segundos*61;
  sleep_enable();
  //sei();
  while (cont < segundos)
   {
   sleep_mode();
   }
  cli();
  sleep_disable();
  cont=0;
  sei();
 
}

void exit() {
    Serial.println("exit");
   envase=true; 
   retardo(1);
   digitalWrite(5,HIGH);   
   retardo(3);   
   digitalWrite(5,LOW);   
   envase=false; 

}


void ent_al() {

    envase=true;    //hay envase en entrada
       Serial.print('A');     
       Serial.write('0');
       retardo(1);
       digitalWrite(6,HIGH);         
   
       retardo(3);
       digitalWrite(6,LOW);   
       retardo(1);
       digitalWrite(7,HIGH);   
       retardo(5);       
       digitalWrite(7,LOW);   
       
       envase=false;       
       Serial.println(" fin ");      //fin proceso
       Serial.write('0');
  // }//else
}//


void ent_pet(){

   envase=true; 
       Serial.print('P');     
       Serial.write('0');
       retardo(1);
         digitalWrite(6,HIGH);     
 
       retardo(3);
       digitalWrite(6,LOW);
       digitalWrite(7,HIGH);
       retardo(5);     
       digitalWrite(7,LOW);
   
   envase=false;
   Serial.println("  fin_Pet");      //fin proceso
     

} //funcion



Go Up