Go Down

Topic: Registres PWM & timer ATmega 328 (Read 1 time) previous topic - next topic

RICOprod

merci pour les liens. je me suis penché sur la question et j'ai réussie a obtenir la fréquence de découpage voulue (10Khz) mais il y a plusieurs petites choses que je ne comprend pas:
j'ai utilisé le mode "fast pwm" du timer 2:               
  TCCR2A = 0x23;               
  TCCR2B = 0x0A;  ====> pré-diviseur a 8  :   16Mhz/8=2Mhz
  OCR2A = 200;     ====> registre pour la comparaison avant débordement:  2Mhz/200=10Khz
  OCR2B =100;      ====> rapport cyclique = 100/200=50%
Le problème est qu'il me faut 3 sorties pwm (à 10Khz de découpage) et qu'avec ce mode seul une sortie sur deux peux fonctionner
(par timer) car l'autre sert de comparaison (ici seul la broche 3(oc2b)fonctionne et pas la 11(oc2a) ) ...
Quelqu'un a-t-il une autre idée ?

RICOprod

j'ai enfin trouvé ce que je voulais mais a taton donc je ne serais pas trop expliquer pourquoi cette fréquence de 7.8khz:

void setup()
{
  TCCR2A = 0b10100011;
  TCCR2B = 0b00000010;     // mode fast pwm du timer 2 :: prediviseur 8 
 
  TCCR1A = 0b10100001;
  TCCR1B = 0b00001010;    // mode fast pwm du timer 1 :: prediviseur 8
   
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
 
  OCR1A = x;        // pin 9
  OCR1B = x;         // pin 10
  OCR2A = x;        // pin 11   
// x rapport cyclique de 0 à 255 ( je crois que c'est de la que viens la deuxième division par 255 par défaut cf datasheet: 16Mhz/8=2Mhz/255 =7.8khz)
}

voila si sa peux aider quelqu'un...


RICOprod

Re-bonjour tout le monde désolé de déterrer un peu le sujet mais c'est encore une question de registre que j'avais à poser:
Voila mon (nouveau) problème : je ne sais pas comment lire les valeurs sur un port entier.. je pensais qu'en écrivant:
int val;
val = PORTC;
cela marchais mais la valeur "val" obtenues prenait le valeur du portc mais rien ne ce passe,j'ai beau changer la valeur aux broches rien
j'ai aussi essayé:
int val;
val = PORTC & 0b11111111;
rien non plus.... comment faire ? le registre DDRC doit être à 0 ou à 1?

barbudor

PORTC c'est pour la sortie
PINC pour l'entrée
et DDRC pour la direction

Voir le Users Manual de l'ATmega dispo sur le site Atmel
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

RICOprod

merci de répondre aussi vite!

Donc si je veux prendre la valeur de 4 broches du portc je doit mettre le registre DDRC à 0 pour les broches dont je veux lire l'état et utilisé le registre PIN pour lire les broches les unes après les autres ? J'avais crue comprendre que le registre PORTx était accessible en écriture et en lecture...
donc
val = Pin(14) | (pin(15)<<2) | (pin(16)<<3) ;
devrait fonctionner?

Go Up