PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : V-USB wie muss ich es ändern?



ExKluski
08.02.2012, 17:35
Hy zusammen,
ich wollte mal das beispiel

http://rn-wissen.de/index.php/V-USB:_Ein_Firmware_USB-Treiber_f%C3%BCr_AVR
ausprobieren.
Habe auch alles versucht wie es in der anleitung steht, bekomme aber 1Error raus weis aber nicht wie ich es lössen soll bzw.
weicht der Compiler ab benutzte AVRstudio 4.18 mit winavr. Weiß aber nicht was ich in der makefile ändern soll.

Bedanke mich für jeden hinweiss.

Exkluski

askazo
09.02.2012, 10:39
Es wäre sehr hilfreich zu wissen, welche Fehlermeldung der Compiler ausgibt....

Gruß,
askazo

ePyx
09.02.2012, 11:09
Oder auch was du dir genau heruntergeladen hast. Ein Beispiel ? Wenn ja, welches. Nur die Lib ? Und am Wichtigsten wäre eigentlich, welches Protokoll du abbilden willst.

ExKluski
10.02.2012, 09:47
Habe die Anleitung 1 zu 1 übernohmmen wollte und später für meine Bedürfnisse ändern weil es doch gut erklärt ist.
der fehler ist:

make: *** No rule to make target `usbdrv/usbdrv.o', needed by `main.bin'. Stop.

Also nichts geändert so wie es dort steht habe ich auf ein neues Projekt gestartet.

gruß exkluski

ePyx
10.02.2012, 10:23
Füg zu deinem Projekt die Dateien usbdrv.(h und c) hinzu.

ExKluski
10.02.2012, 10:56
Hatte ich, das einzige was ich nicht habe ist die usbdrv.o was dort steht. den .h und .c ist drin. deswegen wundert mich die fehlermeldung.

ePyx
10.02.2012, 11:07
Na die wird ja aus der usbdrv.c erst durch den Compiler erzeugt.

ExKluski
10.02.2012, 11:21
Ok danke habe es immer mit build gemacht,nach dem compile hat er die usbdrv.o erstellt, es kommt aber trotzdem der selbe fehler.

ePyx
10.02.2012, 12:32
Benutzt du das Makefile aus dem Beispiel ? Also bei AVRStudio gab es ja die Einstellung, dass man ein externes Makefile nutzen konnte. Wenn du die gesetzt hast, ist es vollkommen egal, ob und welche Dateien du zum Projekt hinzufügst.
Wenn dann der Fehler noch auftritt, dass wird er die Datei einfach nicht finden und du müsstest im Makefile die Pfade kontrollieren.

ExKluski
10.02.2012, 13:29
ja genau die nutze ich auch habe sie im main Project Options als external Makefile hinzugefügt.
die Makefile ist auch im Projekt Ordner mit allen anderen datein.
habe jetzt die meldung

make: *** No targets. Stop.

Hubert.G
10.02.2012, 14:25
Ich habe mal das Projekt kopiert entpackt und im AVRStudio geöffnet. Es hat sich fast auf Anhieb fehlerlos compilieren lassen, hatte nur auf die main.c vergessen. Ich habe das Makefile auf dem Beispiel nicht verwendet.

ExKluski
10.02.2012, 14:54
Hatte ich auch schon gemacht, bekomme 3 errors

usbdrv.c:537: undefined reference to `usbCrc16Append'
main.c:44: undefined reference to `eeprom_read_byte'
main.c:20: undefined reference to `eeprom_write_byte'

und mit der makefile nur 1
make: *** No targets. Stop.

Hubert.G
10.02.2012, 15:17
In die Sourcefiles gehört: main.c, oddebug.c, usbdrv.c, usbdrvasm.S,
In die Headerfiles gehört: oddebug.h, usbdrv.h, usbconfig.h, usbportability.h
Im gleichen Ordner müssen auch die *.inc Dateien sein.

ExKluski
10.02.2012, 16:51
Habe ich auch alles, aber diesmal ohne makefile der seite. Da habe ich die wahl bei denn error


#if USB_CFG_CHECK_CRC /* separate dispatcher for CRC type modules */
# if USB_CFG_CLOCK_KHZ == 18000
# include "usbdrvasm18-crc.inc"
# else
# error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!"
# endif

bekomme ich denn fehler

../usbdrvasm.S:375:9: error: #error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!"

wenn ich aber 18000 auf 12000 und die include "usbdrvasm18-crc.inc" in include "usbdrvasm12.inc"
bekomme ich das

../asmcommon.inc:107: Error: unknown opcode `crc_cleanu'

Hubert.G
10.02.2012, 18:56
Du musst unter Project / Configuration Options die Frequenz des Quarz eintragen.

ExKluski
13.02.2012, 19:28
So habe das Projekt mal neu angelegt, um fehler die ich vorher durch hin und her kopieren von Makefiles verursacht haben könnte.
=>In die Sourcefiles gehört: main.c, oddebug.c, usbdrv.c, usbdrvasm.S,
=>In die Headerfiles gehört: oddebug.h, usbdrv.h, usbconfig.h, usbportability.h
=>Im gleichen Ordner müssen auch die *.inc Dateien sein.
=>Project / Configuration Options 12000000Hz eingestelt
Bin alles durchgegangen komme zum selben Ergenbinss wie vorher.
1 Error:
../usbdrvasm.S:375:9: error: #error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!"

2 Warnings:
../main.c:20: warning: implicit declaration of function 'eeprom_write_byte'
../main.c:20: warning: implicit declaration of function 'eeprom_read_byte'

hatte auch die usbconfig.h von 18000 auf 12000 geändert kommt, aber der selbe fehler raus
#define USB_CFG_CHECK_CRC (USB_CFG_CLOCK_KHZ == 12000)

ePyx
13.02.2012, 19:42
Bei AVRStudio nutzt die Configuration nichts. Zumal es richtig 12000000UL heißen muss.

Füge mal vorn in den Hauptprogramm das folgende ein:



#ifndef F_CPU
#define F_CPU 12000000UL
#endif


Zu den 2 Warnings:
../main.c:20: warning: implicit declaration of function 'eeprom_write_byte'
../main.c:20: warning: implicit declaration of function 'eeprom_read_byte'

du hast die Header-Datei vergessen ?

#include <avr/eeprom.h>

ExKluski
13.02.2012, 20:17
Danke die beiden warnings sind weg, war doch die eeprom.h vergessen :(

wenn ich damit schreiben und es aus der config raus nehme kommt der selbe error raus
../usbdrvasm.S:375:9: error: #error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!"
[code]
#ifndef F_CPU
#define F_CPU 12000000UL
#endif
[\code]

avr-gcc -mmcu=atmega8 -Wl,-Map=USB-PWM.map main.o oddebug.o usbdrv.o usbdrvasm.o -o USB-PWM.elf
avr-gcc: CreateProcess: No such file or directory
make: *** [USB-PWM.elf] Error 1

Vieleicht hilft es wennn ich mal die vorletzten drei build-message zeige. Die main.o oddebug.o usbdrv.o usbdrvasm.o sind da (default-ordner)

ePyx
13.02.2012, 21:29
Nicht schön aber funktional :

Entferne



#ifndef F_CPU
#define F_CPU 12000000UL
#endif


aus deinem Hauptprogramm und füge es unter #define __usbconfig_h_included__ in die Datei usbconfig.h ein. Das Problem ist, dass zur Berechnung von USB_CFG_CLOCK_KHZ (Zeile 43 ) F_CPU benötigt wird.

Keine Ahnung ob es bei dir funktioniert, aber probieren schadet nicht.

ExKluski
13.02.2012, 21:50
danke werde ich versuchen so bald alles wieder läuft wollte, etwas in einem alten Porjekt nachschauen und ich bekomme überall die Fehler Meldung.

avr-gcc: CreateProcess: No such file or directory

weiss gerade echt nicht mehr weiter.

Hubert.G
14.02.2012, 09:34
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.

ExKluski
15.02.2012, 20:19
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.

ExKluski
21.02.2012, 14:28
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.


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);


Danke für die Tipps

MfG exkluski

ePyx
21.02.2012, 15:39
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.

ExKluski
22.02.2012, 09:23
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.

ePyx
22.02.2012, 09:28
die itoa wird doch gebraucht um ein int in char zu wandeln

Nöö nur wenn du den int in ein char-Buffer hauen willst, also Eine Dezimalzahl (z.B. 10) in Ascii 0x40 umzuwandeln. An welchen Anschlüssen hängt dein Poti ? 5V und Masse ? Schleifer an ADC0 ?

ExKluski
22.02.2012, 09:42
An welchen Anschlüssen hängt dein Poti ? 5V und Masse ? Schleifer an ADC0 ?
fast
2.5V, masse und adc0

ePyx
22.02.2012, 09:49
Hast du schon mal versucht :



ADMUX |= (1<<REFS0) | (1<<REFS1)


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)

ExKluski
22.02.2012, 10:59
der Poti war defekt, habe in getauscht und es läuft wie es soll.

danke für die Hinweiße.
MfG exkluski

ExKluski
23.02.2012, 11:49
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.



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);



beim uart benutzte ich sprnitf hier hatte ich dtostrf gedacht ist ja kleiner als die sprintf.

ePyx
23.02.2012, 12:56
Du musst die Berechnung entweder als float speichern oder aber innerhalb von dtostr machen. Sonst werden die Nachkommastellen ( die Mantisse) abgeschnitten, da das Ergebnis als uint16 interpretiert wird.