Sto sviluppando un programma da inserire nel microcontrollore ATMega 2560, in poche parole si tratta di comandare un motore passo passo con una pwm generata dal micro e allo stesso tempo devo comunicare tramite una porta seriale i vari comandi del motore. Ho creato la PWM con il timer0 usando anche l'interrupt. Per crearla ho agito direttamente sui registri del micro. Una volta aggiunto questo programma ad un altro programma con all'interno la comunicazione seriale, quest'ultima però ha smesso di funzionare. Funziona tutto tranne la seriale. Ho fatto un po' di test e ho notato che non esce mai dalla funzione isr sia della pwm che della seriale. Ho provato anche a disabilitare gli interrupt ma rimane dentro ancora. Potrebbe esserci un conflitto con le allocazioni di memoria?
Ho provato a commentare i vari settaggi sui registri della pwm (praticamente ho tolto la pwm) e la seriale riprende a funzionare. Con la seriale mando blocchi da 4 byte (uno per volta) e non mi legge neanche il primo. Per la seriale ho usato le funzioni di default di arduino (serial.h).
'''
if(Serial.available( )>=nBytes)
{
if(Serial.read( )==HEADER) // Header is detected
{
in1=Serial.read( ); // Regiter value is read
in2=Serial.read( ); // MSB value is stored
in3=Serial.read( ); // LSB value is stored
val=in2*256+in3;
switch(in1)
{
case USBIN: if(!UI.page){ sendUSB(DEVRDY,0); USBmode( ); } else sendUSB(DEVBSY,val); break;
default: sendUSB(DEVBSY,val); break;
}
}
}
'''
questo è dove io leggo il dato, nBytes vale 4.
Timer0.setWGM(MODE02);
Timer0.setCOM(COMNPO,COMTOG);
Timer0.setDIV(CLK3); //ero CLK3
Timer0.setOCR(200,0);
Timer0.enableINT(INTOCB);
}
ISR (TIMER0_COMPB_vect){
passo = passo + 1;
if (passo > 200){
Timer0.setDIV(CLKOFF);
}
}
qui invece sono le varie funzioni per la pwm, le prime servono per settare i registri del micro. quando tolgo questa parte di programma la seriale funziona, quando l'ha aggiunto la seriale smette di funzionare.