Forum: Compiler & IDEs pin auswahl in funktion funktioniert nicht


von Sebastian (Gast)


Lesenswert?

Hallo,
ich hab gerade ein Programm geschrieben wo ich jetzt aber immer nur den 
PA2 benutzen kann jedoch wollt ich wenn ich in der Funktion Pin 1 
schreib den PA1 haben und bei Pin 5, PA5. Jedoch hab ich da bestimmt 
einen Fehler und ich weiß nicht welchen da ich mich mit der Sprache von 
AVR-Studio auch nicht so ganz auskenn.

Ich hoff ihr könnts mir hierbei helfen.

unsigned int ADCA_Conversion(ADC_CH_t *Channel, char Pin)
{
  Channel->CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;   //Single Ended Mode 
einstellen
  Channel->MUXCTRL = (Pin << 3);                    //Pin ausw�hlen

  Channel->CTRL |= ADC_CH_START_bm;        //Messung starten und 
Input-Mode auf Singleended stellen
  while(!Channel->INTFLAGS);
  return Channel->RES;                  //Inhalt des Datenregisters 
auslesen
}

von Sebastan (Gast)


Lesenswert?

Sebastian schrieb:
> unsigned int ADCA_Conversion(ADC_CH_t *Channel, char Pin)
> {
>   Channel->CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
>   Channel->MUXCTRL = (Pin << 3);
>
>   Channel->CTRL |= ADC_CH_START_bm;
>   while(!Channel->INTFLAGS);
>   return Channel->RES;
> }

sorry hab jetzt eine besser version ohne den Kommentaren so kann mans 
leichter lesen.

von Patrick (Gast)


Lesenswert?

Okay,

1.: Was ist jetzt eigentlich Deine Frage?

2.: Das ist kein vollständiges Programm. Woher sollen wir wissen, was z. 
B. ADC_CH_t ist?

3.: Die "Sprache von AVR-Studio" ist bei mir Englisch. Bei Dir könnte es 
evtl. Deutsch sein - das sollte aber recht offensichtlich sein...

von Sebastan (Gast)


Lesenswert?

Dann mal den ganzen code:

/*
* Formel f�r die Baudrate. BSEL ist der Wert der in die 
Baudratenregister kommt.
* (Takt / (2^0 * 16*Gew�nschte Baudrate)) - 1 = BSEL
*
*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stddef.h>
#include <avr/pgmspace.h>
#include <stdlib.h>

// Funktionen
unsigned int ADCA_Conversion(ADC_CH_t *Channel, char Pin);

//Variablen
volatile int ADC_Value = 0;
char Ergebnis[5];
int i;

int main(void)
{
  Init(&USARTF1, &PORTF, 0x80);                                //USART 
C0 und die dazu geh�rigen Pins vom Port setzen - bei dir USARTF1, PortF 
und 0x80
  ADCA_init();
  TimerC0_init();
  TimerC0_Freq(0x7A12);                                    //Timer f�r 1 
Sekunde warten

  Send_UART(&USARTF1, "ADC TEstprogramm");

  while(1)                                          //while(1) ist die 
Mainloop
  {

  }
}

void Send_UART(USART_t *USART, char data[])
{
  char Counter;
  char lenght = 0;

  lenght = strlen(data);

  while(Counter < lenght)
  {
    while (!(USART->STATUS & USART_DREIF_bm));
    USART->DATA = data[Counter];
    Counter++;
  }

  Counter = 0;
  while (!(USART->STATUS & USART_DREIF_bm));
  USART->DATA = 0x0A;
  while (!(USART->STATUS & USART_DREIF_bm));
  USART->DATA = 0x0D;
}

void Init(USART_t *USART, PORT_t *Port, char Value)
{
  //Takt auf 32MHz setzen
  OSC_CTRL |= OSC_RC32MEN_bm;
  while(!(OSC_STATUS & OSC_RC32MRDY_bm));
  CCP = CCP_IOREG_gc;
  CLK_CTRL = CLK_SCLKSEL_RC32M_gc;                            // 0x01 
ersetzt durch den Ausdruck

  //Konfiguration der USART F1
  USART->BAUDCTRLB = 0;  //Baudrate auf 19200@32MHz ge�ndert 
//Baudrateneinstellung
  USART->BAUDCTRLA = 0x68; 
//Baudrateneinstellung f�r gro�e Werte 2 register
  USART->CTRLA = USART_RXCINTLVL_HI_gc; 
//Interruptpriorit�t (RX Interrupt H�chste)
  USART->CTRLB = USART_TXEN_bm | USART_RXEN_bm; 
//USART aktivieren RX und TX
  USART->CTRLC = USART_CHSIZE_8BIT_gc;                          //8bit 
�bertragung
  Port->DIR = Value;                                    //PF7 als 
Ausgang, UART TX
}

//ADC initialisieren
void ADCA_init()
{
  ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; 
//Unsigned Mode / 8 Bit
  ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | 0x02; 
//Interne 1V Referenz
  ADCA.PRESCALER = ADC_PRESCALER_DIV512_gc; 
//Prescaler auf 512 stellen
  ADCA.CTRLA = ADC_ENABLE_bm;                                //ADC 
Enable
  PORTA.DIR = 0x00;                                    //Port A als 
Eingang setzen
}

//Messung starten
unsigned int ADCA_Conversion(ADC_CH_t *Channel, char Pin)
{
  Channel->CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; 
//Single Ended Mode einstellen
  Channel->MUXCTRL = (Pin << 3);                              //Pin 
ausw�hlen

  Channel->CTRL |= ADC_CH_START_bm;                            //Messung 
starten und Input-Mode auf Singleended stellen
  while(!Channel->INTFLAGS);
  return Channel->RES;                                  //Inhalt des 
Datenregisters auslesen
}

void TimerC0_init()
{
  TCC0.CTRLA = TC_CLKSEL_DIV1024_gc; 
//Vorteiler einstellen
  TCC0.CTRLB = 0x00;                                    //Timer in 
Normalmodus stellen
  TCC0.INTCTRLA = 0x03;                                  //Interrupt 
konfigurieren

  //Interrupts freigeben
  PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; 
//Interrupts (Highlevel, Mediumlevel und Lowlevel freigeben)
  sei();
}

void TimerC0_Freq(int TTW)
{
  TCC0.PER = TTW; 
//Timer-Topwert(TTW) einstellen
}

//ISR von TimerC0
ISR(TCC0_OVF_vect)
{
  ADC_Value = ADCA_Conversion(&(ADCA.CH0), 0);
  itoa(ADC_Value, Ergebnis, 10);
  Send_UART(&USARTF1, Ergebnis);
  TimerC0_Freq(0x7A12);                                  //Timerwert neu 
laden
}

und meine frage ist wenn ich bei "ADCA_Conversion(&(ADCA.CH0), 0);" 
hinschreibe hab ich trotzdem PA2 und nicht PA0

von Karl H. (kbuchegg)


Lesenswert?

Ehe ich dich jetzt frage, für welchen µC das ganze überhaupt sein soll:

>   Channel->MUXCTRL = (Pin << 3);

WIe ist denn, laut Datenblatt, der Zusammenhang zwischen dem, was man in 
das MUXCTRL Register schreiben muss und dem Pin an dem gemessen wird?

(Und was soll das <<3 da drinnen? Das sieht schon mal nicht richtig aus)

von Sebastian (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ehe ich dich jetzt frage, für welchen µC das ganze überhaupt sein soll:
>
>>   Channel->MUXCTRL = (Pin << 3);
>
> WIe ist denn, laut Datenblatt, der Zusammenhang zwischen dem, was man in
> das MUXCTRL Register schreiben muss und dem Pin an dem gemessen wird?
>
> (Und was soll das <<3 da drinnen? Das sieht schon mal nicht richtig aus)

Ist auf einem ATXmega 128a1, das Board ist selbst entwickelt.

Also ganz ehrlich das mit dem <<3 weiß ich nicht was es bedeutet weil 
ich mit Atmel erst beim einstieg bin, mir das ein Freund gesagt hat, und 
bei PIC hab ich das vorher noch nie gesehen.
Hab das aber schon ein paar mal so gemacht und hat funktioniert, 
vielleicht war es aber auch bis jetzt immer nur zufall.

Ich hoff ich darf hier einen link vom Datenblatt posten und dann die 
Seitenzahl wo der ADC beginnt.

http://www.atmel.com/Images/doc8077.pdf
Seite 296

von Karl H. (kbuchegg)


Lesenswert?

Sebastian schrieb:

> Hab das aber schon ein paar mal so gemacht und hat funktioniert,
> vielleicht war es aber auch bis jetzt immer nur zufall.

Kann sein.
Denn 0 mal 8 ergibt wieder 0.

ALso: Wenn du Pin 1 haben willst, was musst du ins MUXCTRL Register 
schreiben. Das ist doch nicht so schwer rauszufinden mit dem Datenblatt.


WEnn dir <<3 nichts sagt, dann wirf es weg und fang von vorne an

   Channel->MUXCTRL = .....

was muss an die Stelle der Punkte treten, damit du einen bestimmten Pin 
einstellst. Diese Frage lässt sich ganz sicher mit dem Datenblatt bzw. 
der Beschreibung der ADC_CH_t Struktur beantworten.

von Sebastian (Gast)


Lesenswert?

also binär wär zum Beispiel für:
PA1 0b0001 0000
PA2 0b0001 1000

laut seite 304
Aber wie kann ich das jetzt machen damit ich das einfach in der Funktion 
deklarieren kann immer?

von Karl H. (kbuchegg)


Lesenswert?

Sebastian schrieb:
> also binär wär zum Beispiel für:
> PA1 0b0001 0000
> PA2 0b0001 1000
>
> laut seite 304


Jau. Hab ich auch gesehen. Das ist also einfach die Pinnummer um 3 
Stellen nach links verschoben. Das erklärt die <<3, denn das ist dann 
genau diese Operation.

So gesehen müsste das eigentlich stimmen.

von Sebastian (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Sebastian schrieb:
>> also binär wär zum Beispiel für:
>> PA1 0b0001 0000
>> PA2 0b0001 1000
>>
>> laut seite 304
>
>
> Jau. Hab ich auch gesehen. Das ist also einfach die Pinnummer um 3
> Stellen nach links verschoben. Das erklärt die <<3, denn das ist dann
> genau diese Operation.
>
> So gesehen müsste das eigentlich stimmen.

das heißt wenn ich oben 2 hineinschreib, verschiebt er das um 3stellen 
und schreibt 0b0001 0000??
also wenn das tatsächlich so ist, dann stimmt der Teil von Code. Aber 
was kann es sonst noch sein?? Das ich immer nur den selben Pin hab??

von amateur (Gast)


Lesenswert?

Nur mal eine Zwischenfrage!

Wie lang ist eigentlich die Liste der Fehlermeldungen?

Nicht nur bei:

  ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; //Unsigned Mode / 8 Bit
und
  Channel->MUXCTRL = (Pin << 3);        //Pin ausw�hlen

klappt’s mir die Zehennägel hoch.

von Sebastian (Gast)


Lesenswert?

es gibt überhaupt keine fehlermeldungen.
Wenn es welche geben würde wär es für mich einfacher.

von Sebastian (Gast)


Lesenswert?

Es zeigt gar keine Fehler an, wenn es welche anzeigen würde, wär es für 
mich einfacher.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.