#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;
}