Upgrade-Probleme Uno -> Mega2560

so - jetzt kommen Upgrade-Probleme Uno -> Mega2560...

müssen die folgenden Timer-Routinen für den Mega umgeschrieben werden?
Ich habe das Gefühl, jetzt werden die Encoder nicht mehr richtig gezählt!

// Encoder functions courtesy of / entnommen aus: http: //www.meinDUINO.de //


// Die beiden Schritt-Tabellen für 1/1, 1/2 oder 1/4-Auflösung/resolution
// 1/1 Auflösung/resolution
//int8_t schrittTab[16] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};

// 1/2 Auflösung/resolution
  int8_t schrittTab[16] = {0, 0,0,0,1,0,0,-1, 0,0,0,1,0,0,-1,0};

// 1/4 Auflösung/resolution
//int8_t schrittTab[16] = {0,0,0,0,0,0,0,-1,0,0,0,0,0,1,0,0};

//*************************************************************
// Interrupt Service Routine: wenn Interrupt ausgelöst wird
//*************************************************************
ISR(TIMER1_COMPA_vect) {
  ISRab[0] <<= 2;
  ISRab[0] &= B00001100;
  ISRab[0] |= (digitalRead(pinmenc0A) << 1) | digitalRead(pinmenc0B);
  motenc[0] += schrittTab[ISRab[0]];           //
 
  ISRab[1] <<= 2;
  ISRab[1] &= B00001100;
  ISRab[1] |= (digitalRead(pinmenc1A) << 1) | digitalRead(pinmenc1B);
  motenc[1] += schrittTab[ISRab[1]];           //
}

//************************************************************************************
byte pinmotdir[MAXMOTORS][2]={ {pinmot0d1, pinmot0d2},
                               {pinmot1d1, pinmot1d2} };
                                         
int  pinmotpwm[MAXMOTORS]={pinmot0pwm, pinmot1pwm}; 

//************************************************************************************

void setup()
{
  
   Serial.begin(115200);
 
   //...
   // time interrupt for encoder readings
   noInterrupts(); // Jetzt keine Interrupts / disable
   
       TIMSK1 |= (1<<OCIE1A);  // Timer 1 PIDOutput Compare A Match Interrupt Enable
       TCCR1A = 0;             // "Normaler" Modus
       // WGM12: CTC-Modus einschalten (Clear Timer on Compare match)
       //        Stimmen OCR1A und Timer überein, wird der Interrupt ausgelöst
       // Bit CS12 und CS10 setzen
            
       // => Prescaler=8:
       TCCR1B = (1<<WGM12) | (1<<CS11);
       // Frequenz = 16,000,000 / 8 / 512 = rd. 4 kHz
       OCR1A =511;
       
   interrupts(); // Interrupts wieder erlauben / enable
  //...
}

Nein. Du kannst vielleicht Timer1 auf Timer 3, 4 oder 5 ändern. Dann hast du weniger potentielle Konflikte mit anderen Libs. Aber prinzipiell geht es auch so.

1, 3, 4 und 5 sind dabei exakt gleich aufgebaut. Timer2 funktioniert allerdings anders.

Dazu musst du überall bei den Register-Namen die Nummer ändern. z.B. TIMSK1 = TIMSK4 und OCIE1A = OCIE4A. Und natürlich TIMER1_COMPA_vect -> TIMER4_COMPA_vect

Und bei den Bit-Namen die erste Nummer: WGM12 -> WGM42 und CS11 -> CS41
Wobei das bei den Bits theoretisch nicht nötig ist, da die an der gleichen Stelle sind.

hmm -
das komische ist: mit dem Uno wird korrekt PID für Motoren 1+2 ausgeführt, beide Motoren drehen sich auf Sollstellung 360°.

Beim mega wird PID nur für Motor 1 gestartet, mot 2 bewegt sich nicht, allerdings werden die Encoder korrekt bei passiver Verdrehung gezählt + angezeigt.

Kabel ntl überprüft, ich stecke nur ein Screw-Shield um vom einen Arduino auf den anderen - und wieder zurück.

Verwendest du PWM Pins die auf Timer1 liegen? Die gehen natürlich nicht mehr

UNO Timer1 PWM Pins: 9 und 10
Mega Timer1 PWM Pins: 11 und 12

http://playground.arduino.cc/Main/TimerPWMCheatsheet

Da sieht du auch die anderen PWM Pins die nicht mehr gehen wenn du den Timer änderst

ich verwende beim Uno pwm pins 6+11:

// set motor pins
// motor 0
#define pinmenc0A  2  // enc0A yellow
#define pinmenc0B  3  // enc0B blue
#define pinmot0d1  4  // dir01    <<
#define pinmot0d2  5  // dir02
#define pinmot0pwm 6  // enable01 <<
// motor 1
#define pinmenc1A  7  // enc1A yellow
#define pinmenc1B  8  // enc1B blue
#define pinmot1d1  9  // dir11    <<
#define pinmot1d2  10 // dir12
#define pinmot1pwm 11 // enable11 <<

(der Link ist allerdings nicht sehr verständlich für mich)

also muss ich jetzt
pinmot1pwm 12
setzen, korrekt?

12 geht genauso wenig, da auch Timer1!

Besser wäre es vielleicht Pins zu wählen die auf dem selben Timer liegen. z.B. 9 und 10 für Timer2. Die Timer1 Pins kannst du natürlich noch als normale digitale I/Os verwenden.

Und falls du daran denkst den Timer zu ändern, pinmot0pwm läuft auf Timer4.

Und bei dem Links geht es nur hierum:

timer 0 (controls pin 13, 4)
timer 1 (controls pin 12, 11)
timer 2 (controls pin 10, 9)
timer 3 (controls pin 5, 3, 2)
timer 4 (controls pin 8, 7, 6)

PWM wird durch Timer gemacht. Wenn du einen bestimmten PWM Pin verwendest, kannst du nicht dessen Timer mit eigenen Routinen oder Libs verwenden.

nee, wenn ich die Timer ändere, blicke ich nicht mehr durch. :zipper_mouth_face:

Ich lass das pin-Setup bis auf pwm für Motor2,
das bleibt für Uno auf 11, und für Mega kommts dann eben auf 22.

Blöd, dass ich jetzt keinen Platz auf dem Screw shield mehr dafür habe :frowning:

Hier bietet sich vielleicht bedingte Kompilierung an und den Pin je nach Prozessor auf wo anders hinlegen. Dann musst du dich um nichts mehr kümmern und es geht auf beiden :slight_smile:

Wie man mit #ifdef auf den Prozessor abfragt hatte ich schon mal erklärt

Wobei auch 5 und 6 gingen. Die laufen auf dem UNO auf Timer0 und auf dem Mega auf 3 + 4.

9 und 10 ist wie gesagt die beste Lösung. Das ist auf beiden Timer2. Du kannst dann 6 und 11 für Direction nehmen

ja - das hatte ich auch schon im Sinn.... aber die Kabel anders verschrauben muss ja dann doch - das war das, was mir jetzt eigtl wichtiger gewesen werde: keine Rumschrauberei beim Board-Wechsel, und auch dann passt ja pin 22 nicht auf den Uno-Srew-Shield mehr drauf :frowning:

naja, wie hieß es schon bei Mick Jagger....:
"you can't always get what you want..." :roll_eyes:

Habe noch mal was hingeschrieben. Nimm 9 und 10 für PWM und die anderen die du damit verdrängst für Direction (6 und 11 glaube ich). Dann sollte alles passen. Egal ob UNO oder Mega.
EDIT: Gah wieder falsch herum. Jetzt passt es hoffentlich

EDIT2: ARG! Geht so nicht

jo, so mache ichs!
danke dir ! :smiley:

ARG! Nein. Ich Idiot bin in der Zeile verrutscht. Das geht nicht, da 9 und 10 auf dem UNO auf Timer1 sind. Ich hatte gedacht die wären Timer2

Sorry :frowning: :frowning:

Was glaube ich vielleicht, eventuell geht ist 5 und 6 für PWM. Die liegen jeweils nicht auf Timer1

Timer 2 ist doch pin 9+10?

den Timer 2 brauche ich doch eh nicht, oder? dann kann ich doch 9+10 für pwm nehmen, oder nicht?

#define pinmenc0A   2  // enc0A yellow
#define pinmenc0B   3  // enc0B blue
#define pinmot0d1   4  // dir01    <<
#define pinmot0d2   5  // dir02
#define pinmot0pwm  9  // enable01 <<
// motor 1
#define pinmenc1A   7  // enc1A yellow
#define pinmenc1B   8  // enc1B blue
#define pinmot1d1   6  // dir11    <<
#define pinmot1d2  11  // dir12
#define pinmot1pwm 10 // enable11 <<

HaWe:
Timer 2 ist doch pin 9+10?

Ja, auf dem Mega. Auf dem UNO ist es aber Timer1. Der durch deine ISR überschrieben ist. 9 und 10 geht somit auf dem Mega, aber nicht mehr auf dem UNO.

UNO:
Timer0 -> 5 und 6
Timer1 -> 9 und 10
Timer2 -> 3 und 11

5 und 6 sind auf dem Mega auf Timer 3 und 4. Das geht also theoretisch so dass es auf beiden funktioniert ohne was zu ändern (im Programm oder an der Verkabelung)

was ein Schiss :frowning:

dann gehts nicht auf identische Weise, oder?
(identisch beklemmt + identische #defines )?

(als ob man beim Board-Design die Zusatz-Timer nicht auch auf pins 40-50 hätte legen können!!)

Es ist verwirrend, aber es sollte auf 5 und 6 gehen! Liegen beide auf beiden Boards nicht auf Timer1

#define pinmenc0A   2  // enc0A yellow
#define pinmenc0B   3  // enc0B blue
#define pinmot0d1   4  // dir01    <<
#define pinmot0d2   7  // dir02
#define pinmot0pwm  5  // enable01 <<
// motor 1
#define pinmenc1A   8  // enc1A yellow
#define pinmenc1B   9  // enc1B blue
#define pinmot1d1  10  // dir11    <<
#define pinmot1d2  11  // dir12
#define pinmot1pwm  6 // enable11 <<

?

Ja. Theoretisch. Ich bin jetzt mal vorsichtig mit genauen Vorhersagen :wink:

leider nein, jetzt zählt ein Encoder rückwärts!

als hätte man die Scheiß pwm und timer pins nicht hätte kompatibel machen können! ]:frowning: