Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
#include <avr/io.h>
#include <math.h>
#include <util/delay.h>
#include <avr/interrupt.h>
/* Function Definitions */
void ioinit(void);
void display(int number, int digit);
display(dig0, 0);
_delay_ms(1);
display(dig1, 1);
_delay_ms(1);
display(dig2, 2);
_delay_ms(1);
display(dig3, 3);
_delay_ms(1);
PORTB = PORTB & 0b11100000;
}
mode++;
if (mode == 4) mode = 1;
// Update Display
for (int i = 0; i<125; i++)
{
DPStatus = 0xFF;
display(mode, 0);
_delay_ms(1);
display(mode, 1);
_delay_ms(1);
display(mode, 2);
_delay_ms(1);
display(mode, 3);
_delay_ms(1);
display(mode, 4);
_delay_ms(1);
PORTB = 0b00111111;
_delay_ms(1);
}
DPStatus = 0x00;
int main()
{
float adResult = 0;
float voltage = 0;
float resistance = 0;
double current = 0;
int buzzPeriod = 200;
ioinit();
while(1)
{
/*
*/
if (mode == 1)
// Voltage mode
{
voltage = adResult/1024;
dig0 = trunc(voltage*3.281);
dig1 = trunc(voltage*32.81) -10*dig0;
dig2 = trunc(voltage*328.1) - 100*dig0 - 10*dig1;
dig3 = trunc(voltage*3281) - 1000*dig0 - 100*dig1 - 10*dig2;
if (mode == 2)
// Current mode
{
current = adResult/1024;
dig0 = trunc(current*0.484);
dig1 = trunc(current*4.84) - 10*dig0;
dig2 = trunc(current*48.4) - 100*dig0 - 10*dig1;
dig3 = trunc(current*484) - 1000*dig0 - 100*dig1 - 10*dig2;
}
if (mode == 3)
// Resistance mode
{
resistance = (1024000/(adResult+1)) - 1000;
if (resistance < 10000) resDP = 0;
if ((resistance >= 1000000)&&(resistance < 200000))
{
resDP = 0b00000111;
resistance /= 1000;
}
else if ((resistance >= 100000)&&(resistance < 200000))
{
resDP = 0b0000100;
resistance /= 100;
}
else if ((resistance >= 10000)&&(resistance < 200000))
{
resDP = 0b00000010;
resistance /= 10;
}
else
resDP = 0b00001000;
if ((resistance < 10000)&&(resistance < 200000))
{
dig0 = trunc(resistance/1000);
dig1 = trunc(resistance/100) - 10*dig0;
dig2 = trunc(resistance/10) - 100*dig0 - 10*dig1;
dig3 = trunc(resistance) - 1000*dig0 - 100*dig1 - 10*dig2;
}
else
{
resDP = 0x00;
dig0 = 10;
// -
dig1 = 0;
// 0
dig2 = 11;
// L
dig3 = 10;
// -
// Buzzer if Resistance = 0
if (resistance == 0)
{
cli();
in V anc I modes
PORTC = 0b0001000;
}
return 0;
}
void ioinit(void)
{
sei();
DDRD = 0xFF;
DDRB = 0b00011111;
DDRC = 0x78;
/* Set up ADC */
ADCSRA = (1<<ADEN);
// Enable ADC
TIMSK1 = _BV(OCIE1A);
TIMSK0 = _BV(OCIE0A);
}
// Turn on Digit
sbi(PORTB, digit);
switch(number)
{
case 0:
PORTD = 0b11000000;
break;
case 1:
PORTD = 0b11111001;
break;
case 2:
PORTD = 0b10100100;
break;
case 3:
PORTD = 0b10110000;
break;
case 4:
PORTD = 0b10011001;
break;
case 5:
PORTD = 0b10010010;
break;
case 6:
PORTD = 0b10000010;
break;
case 7:
PORTD = 0b11111000;
break;
case 8:
PORTD = 0b10000000;
break;
case 9:
PORTD = 0b10011000;
break;
case 10:
PORTD = 0b10111111;
break;
case 11:
PORTD = 0b11000111;
break;
}
if (DPStatus != 0)
{
// Turn on decimal points depending on DPStatus
if ((DPStatus & (1<<0))&&(digit==0))
{
cbi(PORTD, 7);
}
if ((DPStatus & (1<<1))&&(digit==1))
{
cbi(PORTD, 7);
}
if ((DPStatus & (1<<2))&&(digit==2))
{
cbi(PORTD, 7);
}
if ((DPStatus & (1<<3))&&(digit==3))
{
cbi(PORTD, 7);
}
}
}