Bonjour à tous,
Je cherche à réaliser une double PWM en hard sur un attiny 2313. Je me suis inspiré d'un exemple donné ici qui le fait pour une sortie (OCOA). J'ai tenté de doubler le code pour pouvoir utiliser une deuxième sortie, OC1A.
J'ai du malheureusement me planter dans les noms de registre car la seconde ne fonctionne pas. J'ai pourtant bien lu et relu la page de la datasheet du tiny qui en parle (page 72) mais je me mélange un peu les pinceaux entre les différents registres à initialiser, aux bonnes valeurs...
Si un pro pourrais me mettre sur la piste, voici mon code (qui compile très bien au passage)
J'ai sans doute fait une erreur sur les WGM00 et autres seuils de comparaison...Code:#include <stdlib.h> #include <stdio.h> #include <stdint.h> #include <avr/io.h> #define F_CPU 1000000UL #include <util/delay.h> void init_timer() { //pin de sortie premiere MLI : PB2 #14 OC0A la seconde PB3 #15 OC1A //premiere MLI : fonctionne // set fast PWM mode TCCR0A |= (1<<WGM00) | (1<<WGM01); // clear 0C0A (la sortie) on compare TCCR0A |= (1<<COM0A1); // start timer, no prescaling TCCR0B |= (1<<CS00); //duty cycle 0% OCR0A =0; //deuxieme MLI : ne fonctionne pas. Les noms de registre ne doivent pas être bons. TCCR1A |= (1<<WGM00) | (1<<WGM01); TCCR1A |= (1<<COM0A1); TCCR1B |= (1<<CS00); OCR1A =0; } void init_led() { DDRB |= (1<<PB2); // PB2 DDRB |= (1<<PB3); // PB3 //DDRB = 0b00001100; //sens sorties } int main(int argc, char *argv[]) { int i; init_led(); init_timer(); while(1) { //modification du duty cycle en boucle for (i=0;i<255;i++) { OCR0A=i; //premier rapport cyclique OCR1A=i; //deuxieme rapport cyclique _delay_ms(10); } for (i=255;i>0;i--) { OCR0A=i; OCR1A=i; _delay_ms(10); } } return 0; }
Pour mon test, les 2 rapports cycliques sont identiques (OCR0A et OCR1A). La boucle est simple, juste une augmentation puis une diminution du rapport. Mais seule la led branchée sur la première pin fonctionne correctement...?
Merci d'avance !
-----