Interruptions Atmega 8535
Répondre à la discussion
Affichage des résultats 1 à 1 sur 1

Interruptions Atmega 8535



  1. #1
    invite4679d287

    Interruptions Atmega 8535


    ------

    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.

    -----
    Images attachées Images attachées

Discussions similaires

  1. Durée instrucion C µC atmel 8535
    Par invitebf3096af dans le forum Électronique
    Réponses: 3
    Dernier message: 11/02/2009, 15h32
  2. Programmation ATMEL 8535
    Par invite199eaed0 dans le forum TPE / TIPE et autres travaux
    Réponses: 1
    Dernier message: 10/07/2008, 09h03
  3. can atmega 8535
    Par invitea2f29347 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 25/04/2008, 13h47
  4. Vref de l'ATMEGA 8535
    Par invite7e9cb89a dans le forum Électronique
    Réponses: 2
    Dernier message: 15/04/2005, 13h02
  5. AVR 8535 et Port
    Par zanzeoo dans le forum Électronique
    Réponses: 6
    Dernier message: 30/07/2004, 16h30
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...