Dobry den všem programatorom
Mam taky dotaz už par dni sa trapim s takym lahkym programem kde si vytvorim funkciu na inicializaciu A/D prevodniku v atmega 8 s taktem 1 MHz nech len zadam pin s kereho chcem čitat hodnotu nech možem čitat z viacerych skoro naraz už sa mi to skoro podarylo len nejak sem zamotany v tom že vysledna hodnota je uložena v dvoch registroch ADCL a ADCH kere su 16 bitove a jak mam prečitat z teho 8 bitovu hodnotu?? každy na nete to rieši inak niedko ma
volatile unsigned int adc;
ISR(ADC_vect)
{
adc=ADCL
}
// ale maju zadane ADLAR je 0
ale potom je zada aj plno ludi co to riešia jak navratovu hodnotu
asi takto
unsigned int adc_start_conversion(uint8_t channel)
{
ADMUX &= 0x40;
ADMUX |= channel;
ADCSRA |= (1 << ADSC);
//ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | (1 << ADIE) |(1<<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);
while(ADCSRA & (1 << ADSC));
return ADC;
}
podla moji skusenosti funguje aj to aj to druhe len by sem chcel vediet nazor niekoho kdo ma skusenosti a vie jak to využit priložim ešte jeden taky celistvejši kod či to je formalne dobre spravene alebo či by niekdo skusenejši vytkol nejaku chybyčku krasy DEKUJU MOC
#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h"
#include "adc.h"
volatile unsigned int adc;
/*
ISR(ADC_vect)
{
adc=ADCL;
}
*/
int main()
{
char text_1[16];
char text_2[16];
sei();
lcd_init(LCD_DISP_ON);
lcd_clrscr();
adc_init();
lcd_puts("skuska\nTEST");
_delay_ms(1000);
lcd_clrscr();
while(1)
{
adc=adc_start_conversion(0);
lcd_clrscr();
sprintf(text_1,"ADC-1:%d",adc);
lcd_puts(text_1);
_delay_ms(100);
adc=adc_start_conversion(1);
sprintf(text_2," \nADC-2:%d",adc);
lcd_puts(text_2);
_delay_ms(100);
}
return 0;
}
a tady je hlavičkovy subor adc.c
#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "adc.h"
#include "lcd.h"
void adc_init(void)
{
ADMUX |= (1 << REFS0); //Referenciu predstavuje napájacie napätie na pine AVcc (vnútorne sa piny AVcc a AREF prepoja). Na pin AREF pripájame blokovací kondenzátor
ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | (1 << ADIE) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);
// ADEN= log.1 zap. AD prevodnik
// ADSC = log.1 ak pracuje v rednorazovem režime tak treba vždy zapisat
// ADFR = log.1 free run tzn. opakuje sa stale meranie
// ADIF = ked je tam log.1 tak je v ADCH a ADCL zapisany vysledek
// ADIE = povolene dokončenie prevodu
// ADPS2 = nejaka preddelička nejak nechapem načo
// ADPS1 = -//-
// ADPS0 = -//-
sei();
}
/*
void adc_start_conversion(uint8_t channel)
{
ADMUX=(ADMUX&0b01000000)|channel;
ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | (1 << ADIE) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);
sei();
}
*/
unsigned int adc_start_conversion(uint8_t channel)
{
ADMUX &= 0b01000000;
ADMUX |= channel;
ADCSRA |= (1 << ADSC);
//ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | (1 << ADIE) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);
while(ADCSRA & (1 << ADSC));
return ADC;
}