Nach einer neu Installation von AVR studio lief es habe es geschafft auf den chip zu brennen, jetzt ist die hälfte erledigt und jetzt ist die PC seite dran.
Danke Leute für die Hilfe.
Wenn du dir die usbconfig.h durchliest, dann steht da drinnen das man die usbconfig_prototype.h verwenden soll.
In meiner Konfiguration habe ich diese in usbconfig.h umbenannt.
Nach einer neu Installation von AVR studio lief es habe es geschafft auf den chip zu brennen, jetzt ist die hälfte erledigt und jetzt ist die PC seite dran.
Danke Leute für die Hilfe.
So nach dem dem ganzen streß läuft es auch nur fasst, Daten kommen vom dem PC auch an. Da wollte ich mich jetzt an den Internen AD-Wandler heran wagen,
am PC bekomme ich 1023 also 10-bit was ja eigentlich richtig ist.
Nur der wert ändert sich nicht wenn ich nochmal den Befehl schicke zum lesen.
Hier mal der Auszug, weil der Rest läuft ja.
Danke für die TippsCode:uint16_t adc_Value = 0; uchar Buffer[11]; void adc_init(void) { //ReferenzSpannung AVcc | Kanal 0 ADC0(PC0) //ADC enable| Singel Mode| Frequenzvorteiler F_CPU/128 uint16_t result; ADMUX = (1<<REFS0); ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); ADCSRA |= (1<<ADSC); while (ADCSRA & (1<<ADSC) ) {} result = ADCW; } /*ADC-channel-Funktion*/ uint16_t ADC_Read( uint8_t channel ) { ADMUX = (ADMUX & ~(0b00001111)) | (channel & 0b00001111); ADCSRA |= (1<<ADSC); while (ADCSRA & (1<<ADSC) ) {} return ADCW; } case USB_ADC: adc_Value = ADC_Read(0); itoa(ADCW, Buffer, 10); usbMsgPtr = Buffer; return sizeof(Buffer);
MfG exkluski
Welchen µC verwendest du ? Die neueren haben eine interne 1,1 V Referenz.
Des Weiteren würde ich den ADC per IRQ betreiben und den Wert nach jeder Messung in einer globalen uint16 Variable (hast du ja schon) speichern. Wenn vom PC die Anfrage kommt, wird diese nur mit dem Inhalt der Variable beantwortet und nicht eine separate Messung gestartet.
itoa brauchst du im Übrigen gar nicht. Es reicht doch das obere und das untere Byte zu senden und beide am PC zusammen zu bauen.
Geändert von ePyx (21.02.2012 um 16:48 Uhr)
Grüße,
Daniel
Ich nutzte den Atmega8 mit 12 MHz Quarz und einem Poti.
ein adc Interrupt ist glaube ich Überflüssig, die itoa wird doch gebraucht um ein int in char zu wandeln. hatte die mal weg gelassen und adc_Value direkt in usbMsgPtr geschrieben es kommt aber nichts an.
fastAn welchen Anschlüssen hängt dein Poti ? 5V und Masse ? Schleifer an ADC0 ?
2.5V, masse und adc0
Hast du schon mal versucht :
Also die Referenzspannung auf intern zu setzen ? Dann sollten 2,56 V am AREF-Pin anliegen. Die dann mit masse ans Poti und den Schleifer wie gehabt an deinen ADC0. Bei deiner Einstellung wird AVCC genommen, der auf 5V liegen sollte (plus 100nF Kerko)Code:ADMUX |= (1<<REFS0) | (1<<REFS1)
Grüße,
Daniel
der Poti war defekt, habe in getauscht und es läuft wie es soll.
danke für die Hinweiße.
MfG exkluski
habe da nochmal eine frage bezüglich der Übertragung, weil ich bekomme die werte auf abfrage angezeigt.
würde sie gern aber als wert von 0.00Volt bist X volt. dacjte ich könnte das so machen wie bei UART mit weil läuft es ja auch
libprintf_flt.a
libm.a und -Wl,-u,vfprintf
eingebunden aber die nachkommastellen sind null.
beim UART benutzte ich sprnitf hier hatte ich dtostrf gedacht ist ja kleiner als die sprintf.Code:case USB_ADC DDRB |= (1<<PB0);//Ausgang PORTB |= (1<<PB0);//High ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten adc_Value = ADCW; adc_wert = adc_Value*faktor; dtostrf(adc_wert,7,4, Buffer); usbMsgPtr = Buffer; PORTB &= ~(1<<PB0);//Low return sizeof(Buffer);
Lesezeichen