Rotateur autonome pour monture ALTAZ

Les montures de Dobson ALTAZ permettent la poursuite en agissant sur simultanément sur les moteurs AD et DEC.
Reste que la visue est affectuée d'un rotation qui doit etre corrigée par un rotateur placé en serie sur l’oculaire ou la camera.
les rotateurs sont souvent reliés a un PC qui gere la commande du moteur.
En admettant une bonne mise en station (MES), pour connaitre la vitesse de rotation il suffit d'indiquer l'altitude et l’azimut le l'objet. Par calcul trigo ne obtient la vitesse de rotation angulaire qu'il faut corrigée.
Cette vitesse est maximum autour de la polaire 15'/mn(siderale) ,nulle à l'ecliptique 23.6°sud et en rotation inverse sous l'ecliptique.
le pilote du moteur est un generateur d'impulsions dont la periode est variable.
c'est une sorte de DDS
les calculs sont tabulés a la MES ainsi le programme gere des pointeurs sans faire de jmp conditionel pour que la boucle generatrice ait une durée constante ; d'ou la connaisance le la frequence du quartz (post precedent sur la presicision du resonateur ceramique)
une rampe d'integration en dent de scie est incremétée/decrementée par une succession de quantum dont la moyenne correspond a la periode a generée
le but visée est la demi-seconde d'arc par minute (1/1440). soit 0.5' pour une heure de pose.
plus d'explications viendront plus tard
je cherche donc des partenaires sur ce projet.
S_D

suite
j'ai realisé sous Scilab le generateur principal.
je l' ai codé en C et teletransferé sur l'uno. c'est conforme.
pour mesurer la durée d'une boucle j'ai utilisé

void setup() {
//my setup (bla bla bla)
....
//
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600;
}
void loop() {
// my propamme
...
//
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(LED_BUILTIN, LOW);
}

en mesurant a l'oscillo, je devrais obtenir sur la pin 13 une impulsion dont l'etat bas correspond a la durée du programme+ le jump

j'obteins un signal presque carré de 3.8µs a zero et 3.6µs a 5V.:frowning_with_open_mouth:

j'ai l'impression que je mesure des interruptions et non mon programme qui est plus court!!

si j'avais le code assembleur je pourrais autentifier le pb.
S_D

Tu mesures surtout la durée de 2 digitalWrite().

Essaies d'utiliser la librairie digitalWriteFast ou écrit directement dans les registres pour minimiser l'impact de l'utilisation des librairies Arduino.

Ok fdufnews
c'est exactement ce que je mesure.
qu'est ce fait digitalWrite en 59 cycles alors qu'en assembleur 2 cycles suffisent?
comment activer en C une pin de sortie avec le minimun de cycles ?
corolaire: comment introduire du code assembleur ?

Bonjour,

Comme le dit @fdufnews, le plus simple est d'utiliser la librairie digitalWriteFast. Elle génère un code aussi optimisé que si tu l'avais fait en assembleur.

Pour accéder directement au port tu n'as pas besoin de l'assembleur. Tu peux le faire en C
Par exemple pour activer la pin 13
PORTB|=1<<5;
La aussi ça générera le même code que si tu l'avais fait en assembleur.

OK kamill
SI j'ai bien saisit PORB | = 1<< 5 veut dire mettre a 1 le cinquieme bit du port en laissant indemne les autres et PORTB |=0<<5 c'est mettre a zero.
et pour changer simultanement plusieurs bit du port b?
nota :l'utilisation des signes <> sont un peu galere car je ne les ai pas sur le clavier, je fais du copié/collé ou passe par: fn+alt+60ou62(sur le pavé bleu )+enter :frowning_with_open_mouth:.

Pour mettre un bit à 0 il faut faire un and avec 0 pour ce bit sans toucher les autres.
PORTB&=~(1<<5);

C'est étonnant que tu n'ais pas les touches <> car elle sont quand même très utilisées. Suivant les claviers elles ne sont pas forcément à la même place.
Il existe des macros qui peuvent être utilisées à la place du décalage
PORTB&=~_BV(5);

kamill
l'acces au direct port en C ne marche pas
peut etre dois je faire une declaration dans le setup?

Il faut bien sur déclarer la pin en sortie dans le setup.

comme c'est la pin de la led j'ai remis la declaration d'origne
pinMode(LED_BUILTIN, OUTPUT);

que nenni la pin reste a 5v
mon code PORTB |=1<<5; ... PORTB |=~(0<<5);
le pb des signes <> est bien connu des claviers portable DELL!

Je ne crois pas que tu ais préciser le type de carte que tu utilises.
Les exemples que je t'ai donné sont valables pour une uno ou nano.

c'est une UNO R3

Comme je te l'ai indiqué pour mettre le bit à zéro c'est
PORTB&=~(1<<5);

merci kamill
en mettant les deux instructions a la suite, j'ai une pulse de 125ns (2x62.5ns).
la fonction < ne semble pas affecté la durée du code !
je peux maintenant avancer dans programme complet :slight_smile:

C'est 2 cycles d'horloge
Bravo, bonne continuation.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.