Anonymní profil Teddy – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Teddy – Programujte.comAnonymní profil Teddy – Programujte.com

 

Příspěvky odeslané z IP adresy 178.41.188.–

Teddy
Mikrokontroléry › ADC Mega8 vratenie hodnoty…
9. 8. 2014   #192822

dik ale nejak nechapem to  ADIE a jaky je rozdiel medzi sei(); a ISR()  sem s teho v P*dely vic jak predtym

Teddy
Mikrokontroléry › ADC Mega8 vratenie hodnoty…
8. 8. 2014   #192800

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;

}


 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý