Salut, à tous.
Je travail sur un projet ou je dois créé 3 signaux de même période et décalé les uns par rapport aux autres le tout déclenchées sur le front montant d'un signal de référence.
Un petit schéma pour mieux vous expliquer:
Pour se faire j'utilise le Timer 1 pour compter les front montants de mon signal de référence et le Timer 0 pour créé mes trois autres signaux. (Les deux timers sont utilisé en Interruptions.)
Voici mon Programme:
Code://Biblothèques #include <mega8535.h> #include <lcd.h> #include <delay.h> #include <stdlib.h> //Accès au registre de capture en 16 bits (non présent dans le fichier .h de l'atmega8535) sfrw ICR1=0x26; #asm .equ __lcd_port=0x15//Afficheur sur PORTC #endasm //Déclaration des variables bit FrontDetecte,debordementDetecte; float N,Tredt,Tsynchro,Tclk; char texte[16],texte2[16],Oscr_test; //Initialisation des ports void init_ports(void) { DDRD = 0xB8; PORTD= 0x00; } void init_timers(void) { TCCR0=0x05; TCCR1B=0xC2;//Pré diviseur par 8; front montant; Réducteur de bruit: en fonction TIMSK=0x25; //Valide la génération des interruptions de l'OVF et de l'entré ICP SREG=0x80; // Autorisation globale des interruptions } /*//Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { debordementDetecte=1; }*/ //Timer 1 input capture interrupt service routine interrupt [TIM1_CAPT] void timer1_capt_isr(void) { FrontDetecte = 1; TCNT1=0; //RAZ du compteur du timer TCNT0=Oscr_test; PORTD.5=1; PORTD.3=0; } interrupt [TIM0_OVF] void timer0_ovf_isr(void) { TCNT0=Oscr_test; if(PIND.5) { PORTD.5=0; PORTD.4=1; } if(PIND.4) { PORTD.4=0; PORTD.3=1; } } //Programme principal void main(void) { init_ports(); init_timers(); lcd_init(16); Tclk=1.28/10000; #asm("sei") //Autorise les interruptions while(1) { if(FrontDetecte) { N=10000000/ICR1; //Conversion période/vitesse Tsynchro=10/N; Tredt=Tsynchro/3; Oscr_test=256-(Tredt/Tclk); ftoa(N,0,texte); lcd_gotoxy(0,0); lcd_puts(texte); ftoa(Oscr_test,9,texte2); lcd_gotoxy(0,1); lcd_puts(texte2); } } }
Le Problème est que mon programme ne fonctionne pas complétement en effet le timer 1 compte bien le nombre d'impulsions, mais le souci est dans la génération des 3 signaux, quand je le simule sous Proteus, j'obtiens les chronogrammes suivant:
Voila, merci par avance pour votre aide.
-----