<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=8&amp;t=18556&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-06-09T14:41:25+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=18556&amp;mode</id>
<entry>
<author><name><![CDATA[owocowy1111]]></name></author>
<updated>2017-06-09T14:41:25+01:00</updated>
<published>2017-06-09T14:41:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18556&amp;p=190477#p190477</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18556&amp;p=190477#p190477"/>
<title type="html"><![CDATA[Re: XMEGA - problem z uruchomieniem ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18556&amp;p=190477#p190477"><![CDATA[
Dla wszystkich zainteresowanych: udało się uruchomić ADC. Inicjalizację wykonałem nastepującym kodem<br />[syntax=c]PORTA.DIR = 0x00;// wejście ADC_A<br />PORTA.OUTCLR = PIN0_bm|PIN1_bm; // stan niski pinów<br />/* Wczytanie danych kalibracyjnych */<br />ADCB.CALL = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCBCAL0) );<br />ADCB.CALH = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCBCAL1) );<br />ADCB.CALL = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCBCAL0) );<br />ADCB.CALH = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCBCAL1) );<br /><br />    ADCA_CTRLB = ((1 &lt;&lt; ADC_IMPMODE_bp) | ADC_CURRLIMIT_NO_gc | (0 &lt;&lt; ADC_CONMODE_bp) | ADC_RESOLUTION_12BIT_gc); //tryb unsigned, 12bit do prawej<br />    ADCA_PRESCALER = ADC_PRESCALER_DIV64_gc; // 0x04 - preskaler ADC 64 (500kHz dla 32Mhz)<br /><br />    ADCA_CMP = 0x0000; //wyzerowanie rejestru<br />    ADCA_CH0_CTRL = ((0 &lt;&lt; ADC_CH_START_bp) | ADC_CH_GAIN_1X_gc | ADC_CH_INPUTMODE_SINGLEENDED_gc); //Wybranie trybu i uruchomienie kanału<br />    ADCA_CH0_MUXCTRL = ADC_CH_MUXPOS_PIN1_gc; //Wybór pinu wejscia<br />    ADCA_EVCTRL = (ADC_SWEEP_0_gc | ADC_EVACT_NONE_gc); //Wydarzenia systemowe wyłączone<br />    ADCA_CH0_INTCTRL = (ADC_CH_INTMODE_COMPLETE_gc | ADC_CH_INTLVL_OFF_gc); //CH0 daje flagę po ukończeniu konwersji<br />    ADCA_CH1_INTCTRL = ADC_CH_INTLVL_OFF_gc; //pozostałe kanały wył.<br />    ADCA_CH2_INTCTRL = ADC_CH_INTLVL_OFF_gc;<br />    ADCA_CH3_INTCTRL = ADC_CH_INTLVL_OFF_gc;<br />    ADCA_CTRLA |= ADC_ENABLE_bm;<br />    _delay_ms(9);[/syntax]<br /><br />Następnie odczyt:<br />[syntax=c]ADCA.CH0.CTRL|=ADC_CH_START_bm; //uruchomienie 1 pomiaru<br />while(!(ADCA_CH0_INTFLAGS &amp; ADC_CH_CHIF_bm));<br />ADCA_CH0_INTFLAGS = ADC_CH_CHIF_bm;<br />return ADCA_CH0_RES;[/syntax]<br /><br />Funkcja odczytująca bity kalibracyjne:[syntax=c]uint8_t ReadCalibrationByte(uint8_t index) {<br />uint8_t result;<br />NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;<br />result = pgm_read_byte(index);<br />NVM_CMD = NVM_CMD_NO_OPERATION_gc;<br />return(result);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11012">owocowy1111</a> — 9 cze 2017, o 14:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[owocowy1111]]></name></author>
<updated>2017-06-04T00:07:03+01:00</updated>
<published>2017-06-04T00:07:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18556&amp;p=190258#p190258</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18556&amp;p=190258#p190258"/>
<title type="html"><![CDATA[XMEGA - problem z uruchomieniem ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18556&amp;p=190258#p190258"><![CDATA[
Witam!<br />Od dwóch dni walczę z Xmegą i nie mogę sobie poradzić. Cel jest prosty - odczytać wartość przez ADC z PA1 (sygnał 0.5-2.5V) i wyświetlić ją na LCD. Na wyświetlacz wysyłam tylko pierwsze 8b wyniku, ale później będę korzystał z pełnej rozdzielczości. Tryb unsigned single-ended odpowiada moim potrzebom.<br />Pracując z datasheet'em i poradnikami w necie (strony embedded-lab i sunduino) napisałem taki program:<br />Inicjalizacja ADC<br />[syntax=c]void adc_init(void){<br />OSC.PLLCTRL = OSC_PLLSRC_RC2M_gc | OSC_PLLFAC3_bm; // 0x08 - 2Mhz RC jako źródło, mnożnik PLL = 8 (16Mhz)<br />OSC.CTRL |= OSC_PLLEN_bm; // 0x10 - Włączamy PLL<br />while (0 == (OSC.STATUS &amp; OSC_PLLRDY_bm)); // Stabilizacja PLL<br />CLK.CTRL = CLK_SCLKSEL2_bm;// 0x04 - PLL jako źródło taktowania<br />CLK.PSCTRL = CLK_PSADIV0_bm; // Clk_per4 = Clk_sys/2  = 16MHz/2 = 8MHz<br />ADCA.PRESCALER = ADC_PRESCALER2_bm;// 0x04 - preskaler ADC 64 (125kHz)<br /><br />ADCA.CH0.INTCTRL=ADC_CH_INTMODE_COMPLETE_gc | ADC_CH_INTLVL_OFF_gc; // Bez przerwań<br />        ADCA.EVCTRL=ADC_EVACT_NONE_gc; //uruchamianie tylko z programu<br />ADCA.CTRLB = ADC_RESOLUTION_LEFT12BIT_gc;; // 0x00 - wybór trybu unsigned, 12b do lewej<br />ADCA.CH0.CTRL = ADC_CH_INPUTMODE0_bm; // 0x01 - wzmocnienie = 1<br />ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS0_bm; // 0x08 - PA1 wejscie dodatnie<br />ADCA.REFCTRL = ADC_REFSEL1_bm; // 0x10 - wybór Vref na PA<br />ADCA.CTRLA = ADC_ENABLE_bm;// 0x01 - włączenie ADC_A<br /><br />PORTA.DIR &amp;= ~ PIN1_bm;// wejście ADC_A<br />}[/syntax]<br />Pomiar:<br />[syntax=c]int adc_read(void){<br />ADCA.CH0.CTRL|=ADC_CH_START_bm; //uruchomienie pomiaru<br />while(!(ADCA.CH0.INTFLAGS &amp; ADC_CH_CHIF_bm)); //oczekiwanie na zakończenie<br />ADCA.CH0.INTFLAGS=ADC_CH_CHIF_bm; //reset flagi<br />int result = ADCA.CH0RESH; //pobranie wyniku bez końcówki<br />return result;<br />}[/syntax]<br />W pętli głównej:<br />[syntax=c]while (1)//Pętla główna<br />{<br />lcd_cls();<br />lcd_str(&quot;Wynik:&quot;);<br />lcd_int(adc_read());<br />_delay_ms(100);<br />}[/syntax]<br /><br />Jak widać, nic skomplikowanego, na ATmegę to parę linijek i śmiga. A tu rwę włosy z głowy i nie działa - Pętla się nie blokuje (LCD się ciągle odświeża i dioda kontrolna miga), ale ciągle widzę &quot;Wynik:0&quot; na wyświetlaczu. Połączenia są ok, zresztą nawet gdyby nie, to powinienem dostawać wynik offsetu ~200.<br /><br />Nie mam już pomysłu co może być nie tak. Większość poradników przedstawia konfigurację signed mode, więc nie mam odniesienia. Może ktoś spojrzy świeżym okiem i znajdzie błąd - albo przynajmniej nakieruje gdzie szukać...<br /><br />Mój zestaw: Xmega256A3U + Atmel studio 7.0.<br /><br />Będę wdzięczny za każdą pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11012">owocowy1111</a> — 4 cze 2017, o 00:07</p><hr />
]]></content>
</entry>
</feed>