ADC:n ger bara ut en massa 1 or både på höga och låga byten.
Kod: Markera allt
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
#include <lcd.h>
#include <stdlib.h>
#include <stdio.h>
#define BIT_TEST(x,b) ((x)&(1<<(b)))
void vanta(int);
void hamta_ohm_varde(void);
int main(void);
void bin2bcd(unsigned int);
void initiera_adc(void);
int main(void)
{
asm volatile ("nop");
asm volatile ("nop");
DDRB=0xFF; //PORTB= utgång
PORTB ^= 0xFF; //Växla värde på portb
LCD_init();
initiera_adc();
while(1==1)
{
LCD_command(0x01); //rensa displayen
hamta_ohm_varde();
PORTB ^= 0xFF; //Växla värde på portb
vanta(500);
}
return 1;
}
void initiera_adc(void)
{
PRR &= ~(1<<PRADC); //aktivera adomvandlaren ; NOLLA TILL PRADC
_SFR_BYTE(ADCSRB) = 0x00;
_SFR_BYTE(ADMUX) = 0x00;
_SFR_BYTE(DIDR0) = 0x00;
DIDR0 |= (1<<ADC3D);
ADCSRA |= (1<<ADEN);
}
void hamta_ohm_varde(void)
{
unsigned int varde;
_SFR_BYTE(ADMUX) = 0x00;
ADMUX |= (1<<REFS0) | (1<<REFS1) | (1<<MUX1)| (1<<MUX0); //ADC3 är ingång
asm volatile ("nop");
ADCSRA |= (1<<ADSC);
loop_until_bit_is_set(ADCSRA,ADIF);
asm volatile ("nop");
//Nu finns ett vardet i ADC
LCD_write("0:");
bin2bcd(ADCH);
LCD_write(",");
bin2bcd(ADCL);
varde=ADCH;//dummy kommando för att ADC ska gå att uppdatera
}
void bin2bcd( unsigned int val )//Funkar
{
char digit[4];
itoa(val,digit,16);
LCD_write(digit);//skriv ut på lcd
}
void vanta(int val)
{
uint16_t i;
for (i=0;i<val;i++)
{
_delay_loop_2(500);
}
}
Jag har inte anslutit kondingar på matningen till ADC:N och inte heller vid analoga ingången men det ska ju bara vara för att reducera brus som jag förstått det.
Hjälp mig har tillbringat för många timmar med att felsöka koden. :-x
Kan tillägas att jag har en lysdiod på portb