ADC Mega8 vratenie hodnoty (C) – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ADC Mega8  vratenie hodnoty (C) – Mikrokontroléry – Fórum – Programujte.comADC Mega8 vratenie hodnoty (C) – Mikrokontroléry – Fórum – Programujte.com

 

Teddy
~ Anonymní uživatel
2 příspěvky
8. 8. 2014   #1
-
0
-

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;

}


Nahlásit jako SPAM
IP: 178.41.188.–
KIIV
~ Moderátor
+43
God of flame
8. 8. 2014   #2
-
0
-

Pomoci preruseni musis mit zapnute to ADIE a definovanou obsluhu a pak akorat zapnout globalni preruseni pomoci sei().

Vyhoda je, ze to nijak neblokuje zbytek programu. Nejlepsi je taky mit k dispozici nejaky flag, ze se ta hodnota nacetla.

Nacteni resit nemusis, ADC se bere jako 16bitova hodnota a hlavne se nacte v poradi jak ma, takze staci neco=ADC.

Dulezity je akorat procist datasheet, co a jak se nastavuje. Jestli chces treba automaticky startovat dalsi prevod pri dokonceni predchoziho (free running) nebo jestli to chces spoustet na zaklade preteceni timeru, ci nejake externi udalosti na pinu...

ADLAR je jen nastaveni jak bude presne ta 10b hodnota umistena v 16b promenne

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Teddy
~ Anonymní uživatel
2 příspěvky
9. 8. 2014   #3
-
0
-

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

Nahlásit jako SPAM
IP: 178.41.188.–
KIIV
~ Moderátor
+43
God of flame
10. 8. 2014   #4
-
0
-

sei je instrukce procesoru pro globalni zapnuti preruseni (v c je sei() a udela to same - protoze se ta instrukce zavola), ale funguji jen ty, ktere jsou zapnuty taky jeste ve vlastnich registrech (coz je to ADIE - AD Interrupt Enable), a pak musis mit interrupt handler (neco co to preruseni zpracuje) - to je to ISR(ADC_vect) {  .. }

kdyz bys zapl globalni preruseni, nastavil preruseni od AD, ale nedal tam ISR, tak by program vypadal, jako by se pri preruseni resetoval (ale to je jen proto, ze jsou tam "BAD ISR" handlery, co proste skoci na zacatek pameti jako po restartu

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

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