-         

Ergebnis 1 bis 7 von 7

Thema: XMega Punktschreibweise

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329

    XMega Punktschreibweise

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,

    für den ADC-Empfang möchte ich eine Funktion schreiben:
    Code:
    static uint16_t get_adcb(uint8_t channel)
    {
    	ADCB.CH1.CTRL |= 0x80;
    	while(!(ADCB.CH1.INTFLAGS && 0x01)); 
    	return ADCB.CH1.RES;
    	ADCB.CH1.INTFLAGS = 0x01;
    }
    mit channel soll der ADC-Kanal übergeben werden. Wie setzte ich den channel statt CH1 "hübsch" ein?

    Günter

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Du musst gucken, wie "ADCB" (u. ADCA) in den xmega*.h files deklariert sind.
    Sollte ja eigentlich irgendwie eine "struct" sein, die auf ADCA u. ADCB angewendet wird. (so wie das da aussieht)
    Und die übergibst du der Sub als Pointer , z.B
    Code:
           CallSub ( (struct ADC*)&ADCA);
           CallSub ( (struct ADC*)&ADCB);
    
    static uint16-t  CallSub (struct ADC* pChann)
    {
       pChann->CH1.CTRL |= 0x80; 
    etc..
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Code:
    Controller */
    #define ADCA    (*(ADC_t *) 0x0200)  /* Analog to Digital Converter A */
    #define ADCB    (*(ADC_t *) 0x0240)  /* Analog to Digital Converter B */
    Diese Stelle in iox128a1.d habe ich gefunden

    Günter

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Jetzt habe ich einfach mal &ADCB.CH1 in meinen Code eingetragen und die Fehlermeldung erhalten:

    ../xmega.c:15: warning: format '%i' expects type 'int', but argument 2 has type 'struct ADC_CH_t *'

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    So !?!

    Code:
    static uint16_t get_adc( struct ADC_t* pChan){
    pChan->CTRL |= 0x80;
       while(!(pChan->INTFLAGS && 0x01));
       return pChan->RES;
       pChan->INTFLAGS = 0x01;
    }

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Naja, frag mal den Compiler
    Btw:
    Code:
       while(!(pChan->INTFLAGS && 0x01));      // && ist logisch UND
       return pChan->RES; 
       pChan->INTFLAGS = 0x01;   // nach "return" kommt der da nichtmehr dahin
    ist suboptimal.
    Sollte wohl heissen:
    Code:
       while(!(pChan->INTFLAGS & 0x01));   // & statt &&
       pChan->INTFLAGS = 0x01;               
       return pChan->RES;                        // return als letztes
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Wie man sich an einem Feiertag nur so wüst verrennen kann

    Die ADC Channels beim XMega haben nichts mit den PINs zu tun. Diese muß man im Muxregister erst zuweisen. Dann klapps auch mit der Funktion:

    Code:
    static uint16_t get_adcb(uint8_t adc_pin){
    	ADCB.CH0.MUXCTRL = 7 + adc_pin;
    	ADCB.CH0.CTRL |= 0x80;
       	while(!(ADCB.CH0.INTFLAGS & 0x01));
       	ADCB.CH0.INTFLAGS = 0x01;
    	return ADCB.CH0.RES;
    }
    Aufruf:

    Code:
    wert = get_adcb(3);
    holt dann den Wert vom Pin ADC3 ab.

    Danke für deine Unterstützung Robert!

    Günter

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •