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 }
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.
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...
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
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)
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
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.
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?
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.
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??
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.
es gibt überhaupt keine fehlermeldungen. Wenn es welche geben würde wär es für mich einfacher.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.