avr Xmega a/d virittäminen kuntoon

Olisiko täällä sellaista henkilöä joka on pelannut noiden atmelin xmegojen kanssa? Itse en meinaa löytää dokumentaatiosta ratkaisua seuraavaan ongelmaan -> (ja tässä siis kyseessä xmega16A4)

Elikkäs ohjelman kulku pitäisi olla seuraavan lainen:

Piirin init
ADC sämpläämään kaikki 12 kanavaa läpi, ja kun sen on tehnyt niin antaisi keskeytyksen jossa sitten tehtäisiin yksinkertainen laskutoimitus.

Eli tämmöisen löysin dokumentaatiosta:

[code]adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12, ADC_REF_AREFA);

adc_set_clock_rate(&adc_conf, 2000000UL);

adc_set_conversion_trigger(&adc_conf, ADC_TRIG_FREERUN_SWEEP, 0, 0); 

[/code]
Ja tuo “Freerun sweep” ilmeisesti tekee tämän kaikkien kanavien jatkuvan luvun.
Mutta ongelmana on tuo keskeytys joka ei ole ihan selvinnyt että miten sitä käytetään tässä tilanteessa. Keskeytyshän pitäisi tässä tapauksessa saada kun kanavat 0-11 on mitattu, eli voinko tehdä vain seuraavanlaisesti:

adcch_set_interrupt_mode(&adcch_conf, ADCCH_MODE_COMPLETE);

Mutta ilmeisesti tämä tekee sen että keskeytys annetaan joka kanavan lukemisen jälkeen,joka ei ole toivottavaa.

Eli yksinkertaistettuna ongelmani: ADC:n tarvitsee lukea kanavat 0-11 läpi ja antaa kekeytys kun kanava 11 on luettu. Jos jollakulla olisi jokin ajatus niin olisin kiitollinen.

En usko että tuosta löytyy sellaista toiminnallisuutta, että voisit lukea kaikkia kanavia yhdellä kertaa. Ei taida olla kuin 1 a/d muunninkaan koko kontrollerissa?

Yksi ADC, 12 kanavaa:

Onkin ihan sitten toinen juttu että miten tuota vehjettä ajetaan… Oletko kokeillut tuon toimivuutta käytännössä? :wink:

Eli lippu tosiaan nousee joka muunnoksen jälkeen.

Luulisi tuolla vauhdilla pystyvän. Saat 1megasamplen sekunnissa kaikkiin karvoihin jos pyörität kanavat järjestyksessä läpi.

volatile int kanava = -1; //kasvaa ekassa if lauseessa isommaksi

ISR_vector(ADC_CONVERSION_COMPLETE){ //Tsekkaa tuo avr-libc:n manuaalista
  if(++kanava == 12){
    kanava =0;
    tee_temput();
  }
  switch(kanava){
  case 0:
    //aseta kanava 0 samplettavaksi
    break;
  case 1: //jne
    break;
  }
}

Setupissa sitten aktivoit tuon ADC:n, kirjoitat switchin loppuun ja teet_temput(). Sen voi kyllä kirjoittaa tuonne sisäänkin. Kelpaisko?

Toi olisi kyllä yksi tapa, kävi nimittäin itselläkin mielessä että teen laskurin ja tosiaan joka kahdestoista kerta tehdään_temput(). Mutta selailin tuota dokumentaatiota vähän lisää ja löysin sellaisen termin kuin “event channel” liittyen funktioon jolla alustetaan adc muunnin -> adc_set_conversion_trigger. Linkki atmelin sivuille

Tuolla nimittäin asetetaan “event channel” ja voisiko se tarkoittaa sitä että tässä “freerun” modessa kaikki keskeytykset liputettaisiin vain tuossa määritellyssä kanavassa? En tiedä mutta toivon että näin olisi. Jos teoriani osoittautuu vääräksi niin sitten tarvitsee kait vain turvautua laskurikikkailuun.

Mutta kiitoksia tuosta koodinpätkästä, ihan kivasti ja jännästi sen saa varmasti noinkin tehtyä.

Edit:

Elikkäs joo tuo event homma onkin vähän eriasia kuin keskeytys. Mutta jos tuosta eventistä saa jollaintavalla tehtyä keskeytyksen tai ajamaan temput() niin problem solved.

Onko nuo xmegat samanlailla ohjelmoitavissa kuten megatkin, eli samanlainen ohjelmointiliitäntä ja -laite? Nuo eventit oli uus juttu niissä, mutta muuten ilmeisesti yhtä yksinkertaista tehdä koodia kuten muillekin 8-bittisille atmeleille?

Noissa xmega A:ssa oli jotain ongelmia ton ADC:n kanssa. U:ssa korjattu, joten ei ole itse tarvinnut murehtia enkä siksi muista. Käytössä xmega32a4u.

jos meinaat tota ASF:a käyttää niin kannattaa tutustua:
asf.atmel.com/docs/latest/xmega. … start.html

asf.atmel.com/docs/latest/xmega. … ase_1.html

xmega32a4u:n datalehdestä: “Four conversion channels with individual input control and result registers - Enable four parallel configurations and results”

Eli neljä kanavaa saa freerun mittaukseen kun laittaa adc_set_conversion_trigger(&adc_conf, ADC_TRIG_FREERUN_SWEEP, 3, 0); ja jos haluaa useammasta ADC-inputista mitata niin pitää muuttaa kanavien asetuksia välissä. Ei taida freerunista olla siinä hyötyä.

Periaatteessa samoilla laitteilla ohjelmoidaan samalla tavalla, mutta noissa on usein vain PDI-ohjelmointiliitäntä, jota ei ole vanhoissa ohjelmointilaitteissa eikä ehkä ihan kaikissa uusissakaan. Sopivan ohjelmointilaitteen saa kuitenkin parilla kympillä ja debuggaavan alle satasella.

Muiden 8-bittisten AVRien ohjelmat toimivat hyvin pienin muutoksin. Uusia ominaisuuksia (eventit, DMA, monitasoiset keskeytykset jne.) ei ole mitenkään pakko käyttää eikä usein tarpeenkaan. Ainakin minulle selkeimmät edut vanhempiin nähden ovat lukuisat portit (SPI ja UART), tarkempi ADC, tarkka sisäinen oskillaattori (riittää UART- ja USB-käyttöön), yleisesti monipuoliset konfiguroinnit ja pieni virrankulutus.