Programme final ATTiny85

#include <tiny85.h>
#include <main.h>

//On déclare nos pins
#define SCK PORTB0
#define MISO PORTB1
#define CS PORTB2

//On déclare nos variables
int etatPin;

int interruptionTimer1 = 0;

// Interruption du Timer 0
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
    //On relève l'état des pins
    etatPin = PINB & (1<<CS);

    //On regarde si CS est à l'état bas
    if(etatPin == 0) {
        //Si Oui, on toggle la clock
        PINB = (1 << SCK);
        // => Mettre à 1 un port sur PINB = Toggle (voir pièce jointe mail)

    }
}

// Interruption du Timer 1
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
    //On toggle notre flag qui va venir déclencher ou non
    //l'appel de la facontion mesure
    interruptionTimer1 = interruptionTimer1^1;

}

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=In Bit2=OUT Bit1=In Bit0=OUT
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 0,088 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0x0A;
OCR0B=0x00;


// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
// Mode: CTC top=OCR1C
// OC1A output: Disconnected
// OC1B output: Disconnected
// Timer Period: 10,24 ms
// Timer1 Overflow Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
PLLCSR=(0<<PCKE) | (0<<PLLE) | (0<<PLOCK);

TCCR1=(1<<CTC1) | (0<<PWM1A) | (0<<COM1A1) | (0<<COM1A0) | (1<<CS13) | (1<<CS12) | (0<<CS11) | (0<<CS10);
GTCCR=(0<<TSM) | (0<<PWM1B) | (0<<COM1B1) | (0<<COM1B0) | (0<<PSR1) | (0<<PSR0);
TCNT1=0x00;
OCR1A=0x26;
OCR1B=0x00;
OCR1C=0x27;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(1<<OCIE1A) | (0<<OCIE1B) | (1<<OCIE0A) | (0<<OCIE0B) | (0<<TOIE1) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=(0<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);

// USI initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR0=(0<<AIN0D) | (0<<AIN1D);

// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);


// Global enable interrupts
#asm("sei")

while (1)
      {
      //Si notre flag est à 1, on appelle la fonction mesure
      if(interruptionTimer1) {
        mesure();
      }

      }
}

unsigned int mesure() {

    //On relève l'état de la clock
     int etatPinClock = PINB & (1<<SCK);

     int etatClockPrec = etatPinClock;

     //On créé une variable qui va venir stocker l'état du MISO
     int etatMISO;

     //On créé une variable qui va compter le nombre
     //de changements d'états de la clock
     unsigned char compteurClock = 0;

     //On créé une trame vierge
     unsigned int trame = 00000000;

     //On mets CS à l'état haut puis à l'état bas
     PORTB |= (1<<CS);
     PORTB &= ~(1<<CS);

     //Tant qu'il ya moins de 24 changements de période
     while(compteurClock < 24) {
        //On relève l'état de la clock
        etatPinClock = PINB & (1<<SCK);
           //Si l'état est différent de celui du tour précedent
            if(etatPinClock != etatClockPrec) {

                //On incrémente le nombre de changements d'états
                compteurClock++;

                //Si on est sur un état haut de la clock
                if(compteurClock%2==0) {

                    //On vient relever l'état du MISO
                    etatMISO = PINB & (1<<MISO);

                    //Si c'est un 1
                    if(etatMISO==1) {
                        //On mets à 1 le bit correspondant de la trame
                        trame |= (1<<((compteurClock-1)/2));
                    }
                }

                //On stocke l'état de la clock comme état précedent
                //car on vient de traiter le bit approprié
                etatClockPrec = etatPinClock;
            }

     }

     //On mets CS à l'état haut
     PORTB |= (1<<CS);

     //On retourne la trame
     return trame;
}