Hi Willa,
was genau meinst du den mit Mini Bolt? Noch kleiner als der jetzige?
Ich würde deine Ergebnisse gerne mal bestaunen, wenns dir keine Umstände macht
Gruß
Chris
Hi,
ich bin mit dem MLF Package noch nicht weiter. Und doppelseitig mache ich auch zum ersten Mal. Dauert also noch ein bisschen...
Aber dafür habe ich soeben den ersten xMega meines Lebens zum Leben erweckt :-D Herrlich, 32MHz bei 3.3V X-D
Leider funktioniert mein AVRISP mkII noch nicht in Bascom. Unter AVRstudio geht er, aber Bascom (2.0.7.3) behauptet der Chip würde nicht gefunden. Muss ich da noch irgendwas besonderes beachten? Ich habe nichts gemacht außer AVRstudio 5.1 mit allen geforderten Komponenten zu installieren und danach Bascom.
Ein 0.6mm Bohrer geht übrigens perfekt, habe ich grad probiert. Wovor mir noch graust sind meine ersten MLF Gehversuche mit einem 20€ teuren IC...
Ist das ne gute Vorgehensweise...: Pads verzinnen, überschüssiges Lot mit Entlötlitze entfernen. Löthonig drauf, IC aufsetzen, 1 Pin anlöten. Mit Lötkolben und wenig Lötzinn auf der Spitze an den Seiten entlangziehen (also ca. so wie bei TQFP). Mein Lötkolben hat ne Bleistiftspitze mit 1mm Spitzendurchmesser. Das ist schon etwas "grob". Geht das wohl...? Allein das Ausrichten des ICs kommt ja schon ans Auflösungslimit meiner Augen...
Dazu habe ich noch nichts unternommen... Mit bleibt noch eine Woche das Gerät zum fliegen zu bringen, dann wird die Zeit wieder knapper.Hast du denn deinen Code schon angepasst?
Viele Grüße, William
-> http://william.thielicke.org/
Hallo,
um den AVRISP MK2 in Bascom einzubinden, bin ich nach der Anleitung von MCS vorgegangen (finde den Link gerade nicht).
Das wichtigste ist, dass du den LIBUSB Treiber als "filter driver" konfigurierst (und überhaupt installiert hast?!). Somit kannst du beide Programme (BASCOM & AVRStduio) verwenden. Wie genau du das einstellen musst, steht wie gesagt iwo auf der MCS-Help Seite, aber im Endeffekt ist eh alles selbsterklärend, wenn man diese Info hat
Unter Bascom musst du als Programmer "USBProg Programmer / AVRISP mkII" einstellen.
Also meine Vorgehensweise ist folgende:
1. ich verzinne ein Pad
2. ich richte den Chip aus und verbinde ihn anschließend mit dem einen Pad
3. ich kontrolliere nochmals die korrekte Ausrichtung
4. ich löte ein zweites Pad auf der gegenüberliegenden Seite an
5. ich gebe einiges an Flußmittel auf jede Seite des Chips (eigentlich reicht es auf einer Seite, da des durch den Sog unter den Chip gezogen wird und auf jeder Seite wieder rauskommt)
6. ich gebe etwas Lötzinn auf die Lötkolbenspitze und fahre damit zügig (bei etwas höherer Temperatur, ca. 380°, damits schneller geht) über alle Pins einer Seite
7. ich mache eine kurze Pause, um den Chip nicht zu überhitzen
8. das gleiche für die anderen Seiten
Das geht auch mit einer 1.5mm Spitze, hab ich schon gemacht
Beim Entfernen des Lots von den Pads wäre ich vorsichtig, da dabei schnell mal ein kurzes Pad an der Entlötlitze hängen bleibt.
Den Code habe ich schon ziemlich weit angepasst, momentan stimmen schon alle Werte in der Gui.
Da es bei den Timern keinen 128 Prescalewert gibt, kommt für das Auslesen der Summensignalwerte nur ein 16Bit Timer in Frage. Somit reichen die Werte von 65116 bis 65268 (Mitte bei 65192). Dadurch werden die Empf-Werte verdoppelt, also anstatt von -37 bis +37 reichen sie jetzt von -76 bis +76. Ich denke, das kommt der Regelung nur zu Gute, da man dann auch noch etwas präziser Steuern kann.
Deswegen müssen zwar einige Zeilen Code angepasst werden, aber das war ja sowieso von Anfang an klar.
Gruß
Chris
EDIT:
Hier der Link: http://avrhelp.mcselec.com/index.htm...programmer.htm
Was mir noch einfällt:
Bei mir hatte der Programmer anfangs auch nicht funktioniert, obwohl er vom PC erkannt wurde. Dann habe ich ihn an der Rückseite des PCs angeschlossen (vorher war er an der Vorderseite, das sind aber meistens nur USB-Hubs) und schon gings.
Geändert von Che Guevara (29.03.2012 um 22:35 Uhr)
Hi William,
nur mal so zur Auffrischung meiner grauen Zellen: Was ist denn das MLF-Gehäuse?
In meinem Datenblatt gibt es den XMega32 im TQFP-Gehäuse, das ist das gleiche wie beim Mega328p. Dann im (V)QFN-Gehäuse, das ist das gleiche wie beim MPU-6000. Und dann noch das (VF)BGA-Gehäuse, mit den Balls auf der ganzen Unterseite verteilt.
Wenn du das QFN-Gehäuse des MPU meinst (das legt zumindest der angegebene Preis des Chip nahe , dann ist die von dir beschriebene Vorgehensweise zumindest schon mal nicht vollkommen abwegig.
Leider (oder zum Glück ) musste ich bisher solche Chips noch nie auf eine Platine ohne Lötstopplack auflöten, so dass ich (noch) nicht mit Erfahrungswerten dienen kann. Chris dürfte mehr dazu sagen können, der macht das schon sein ganzes Leben lang so .
Auf einer mit Stopplack und Verzinnung versehenen Platine kann man sich das initiale Verzinnen der Pads sparen. Deine Methode (vorher verzinnen und mit Litze Überschuss entfernen) klingt richtig.
...
Ah, ich sehe gerade, Chris hat sich schon gemeldet, ich spare mir also erst mal das Weitere...
Ich schreibe jetzt lieber nochmal einen neuen Post, nicht dass das noch überlesen wird
Die Pads vorher zu verzinnen und das überschüssige Lot wieder mit Entlötlitze zu entfernen würde ich nicht machen, da die Gefahr sehr groß ist, dass dir ein paar Pads an der Entlötlitze hängen bleiben.
Was man aber machen sollte, ist: Die Pads vom UV-Lack befreien (z.b. mit Flußmittel, da ist meistens Alkohol drin oder mit Spiritus) und nur ein Pad verzinnen. Den Vorgang, wie ich es mache, habe ich in meinem vorigen Post beschrieben.
Wie gesagt, mit meiner Methode gehts fast wie von selbst, ich hatte keinerlei Brücken o.ä.
Gruß
Chris
Danke für die Tipps :-D Den AVRISP mkII Programmer habe ich jetzt zum laufen bekommen. In der Bascom Hilfe steht tatsächlich die genaue Vorgehensweise für diesen Programmer (LIBUSB usw.). Ich werde heute nachmittag versuchen die MPU zu löten.
meiner Meinung nach ist das eine Art Überbegriff für (V)QFN etc. Also für "Fummelkram". Sander hat übrigens ab nächster Woche den ATXMEGA32A4-MH (MLF bzw VQFN) vorrätig für 4.96 Euro. Und die MPU6050 ist auch vorrätig.Was ist denn das MLF-Gehäuse?
Ich konnte den Bolt nicht so klein bauen wie mechanisch möglich, da meine Steuerplatine zu groß war. Dadurch wäre ein großer Teil im Luftstrom der propeller gewesen. Jetzt könnte man eine platine mit 20x20mm verbauen, d.h. ich könnte bei der Gesamtgröße des Copters 3cm sparen. Das gibt bei der IMAV2012 ganze 3.4% mehr Punkte ;-D. Mir macht es Spaß neue Copter zu konstruieren, aber das Konzept vom Bolt ist für meine Zwecke optimal (schnell, klein, wendig, windunempfindlich, 50g Payload), daher werde ich wohl nichts komplett neues machen.was genau meinst du den mit Mini Bolt? Noch kleiner als der jetzige?
Viele Grüße, William
-> http://william.thielicke.org/
Ich habe die MPU nun gelötet. Beim Lötvorgang selber sind mir leider schon Pads der Platine abgeflogen. Vielleicht ist mein Platinenreiniger (Kontakt LR) zu aggressiv? Sofern ich das erkennen kann sind aber nur unwichtige Pads abgeflogen. Aber die ganze Sache sieht nicht gut aus. Ich habe es trotzdem einfach mal versucht und den Code von Chris verwendet, bzw. angepasst (richtig...?)
@chris: Du hast A0 von der MPU auf Masse gelegt, richtig?Code:Dim Twi_start As Byte Open "twie" For Binary As #2 'twic Config Twie = 400000 'twic I2cinit #2 $lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI Config Scl = Porte.1 ' we need to provide the SCL pin name Config Sda = Porte.0 ' we need to provide the SDA pin name Const Mpuaddw = &B11010000 Const Mpuaddr = &B11010001
Wenn ich den Code laufen lasse, bekomme ich für Tmp_gyrox(1) und Tmp_gyrox(2) den Wert 114. Das ist auch bei allen anderen Achsen so. Ich würde gerne feststellen ob die MPU funktioniert, aber es gibt für mich noch zu viele Dinge im Bascom Code die ich nicht verstehe. Kann da jemand helfen?
Viele Grüße, William
-> http://william.thielicke.org/
Hi,
ich würde die Platinen lieber mit Spiritus reinigen
Zu deinem Code:
Die "i2c_twi.lbx" ist beim XMega unnötig, die I2C Kommunikation ist schon in der "xmega.lib" integriert.
Hier mal mein Testcode nur für den MPU und COM2 (portc.6/7) (ungetestet):
Die Test-Ausgabe sollte einen Wert von 104 (glaube ich) haben.Code:$regfile = "xm32a4def.dat" $crystal = 32000000 $framesize = 100 $hwstack = 100 $swstack = 100 $lib "xmega.lib" $external _xmegafix_clear $external _xmegafix_rol_r1014 Config Osc = Disabled , 32mhzosc = Enabled Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1 Declare Sub Init_mpu() Declare Sub Read_mpu() Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'Config Serialout1 = Buffered , Size = 200 Open "COM2:" For Binary As #1 Dim Twi_start As Byte Open "twie" For Binary As #2 Config Twie = 400000 Const Mpuaddw = &B11010000 'AD0 auf Masse Const Mpuaddr = &B11010001 Dim Test As Byte Dim Gyrox As Integer Dim Gyroy As Integer Dim Gyroz As Integer Dim Tmp_gyrox(2) As Byte At Gyrox Overlay Dim Tmp_gyroy(2) As Byte At Gyroy Overlay Dim Tmp_gyroz(2) As Byte At Gyroz Overlay Dim Accx As Integer Dim Accy As Integer Dim Accz As Integer Dim Tmp_accx(2) As Byte At Accx Overlay Dim Tmp_accy(2) As Byte At Accy Overlay Dim Tmp_accz(2) As Byte At Accz Overlay I2cinit #2 Call Init_mpu() Config Priority = Static , Vector = Application , Lo = Enabled , Med = Enabled Enable Interrupts Do Call Read_mpu() Print #1 , Gyrox Waitms 100 Loop End Sub Init_mpu() I2cstart #2 'start condition I2cwbyte Mpuaddw , #2 'write adress of MPU-6050 I2cwbyte 117 , #2 'Register 117 "Who am I" I2crepstart #2 'repeated start I2cwbyte Mpuaddr , #2 'read adress of MPU-6050 I2crbyte Test , Nack , #2 'read byte WHO_AM_I (Reg 117) I2cstop #2 'stop condition Print #1 , Test I2cstart #2 'start condition I2cwbyte Mpuaddw , #2 'write adress of MPU-6050 I2cwbyte 25 , #2 'Register 25 Sample Rate Divider (1..8 kHz) I2cwbyte &B00000000 , #2 'Divider set to 1 (soll) I2cstop #2 'stop condition I2cstart #2 'start condition I2cwbyte Mpuaddw , #2 'write adress of MPU-6050 I2cwbyte 26 , #2 'Register 26 DLPF_CFG (digital lowpass filter) Configuration I2cwbyte &B00000000 , #2 'Bits 0..2 = 000 - ACC:260Hz, 0.0ms; Gyro:256Hz, 0.98ms ( &B00000000 ) I2cstop #2 'stop condition I2cstart #2 'start condition I2cwbyte Mpuaddw , #2 'write adress of MPU-6050 I2cwbyte 27 , #2 'Register 27 Gyro Configuration I2cwbyte &B00000000 , #2 'Bits 3+4 = 00 - Full Scale Range: +/-250°/s I2cstop #2 'stop condition I2cstart #2 'start condition I2cwbyte Mpuaddw , #2 'write adress of MPU-6050 I2cwbyte 28 , #2 'Register 28 ACC Configuration I2cwbyte &B00000000 , #2 'Bits 3+4 = 00 - Full Scale Range: +/-2g / No High Pass Filter I2cstop #2 'stop condition I2cstart #2 'start condition I2cwbyte Mpuaddw , #2 'write adress of MPU-6050 I2cwbyte 107 , #2 'Register 107 Power Management 1 I2cwbyte &B00001011 , #2 'No Reset / No Sleep / No Cycle / Temp_Sens: Dis / Clock Source: Z-Gyro I2cstop #2 End Sub Sub Read_mpu() I2cstart #2 'X ACC I2cwbyte Mpuaddw , #2 I2cwbyte 59 , #2 I2crepstart #2 I2cwbyte Mpuaddr , #2 I2crbyte Tmp_accx(2) , Ack , #2 I2crbyte Tmp_accx(1) , Nack , #2 I2cstop #2 I2cstart #2 'Y ACC I2cwbyte Mpuaddw , #2 I2cwbyte 61 , #2 I2crepstart #2 I2cwbyte Mpuaddr , #2 I2crbyte Tmp_accy(2) , Ack , #2 I2crbyte Tmp_accy(1) , Nack , #2 I2cstop #2 I2cstart #2 'Z ACC I2cwbyte Mpuaddw , #2 I2cwbyte 63 , #2 I2crepstart #2 I2cwbyte Mpuaddr , #2 I2crbyte Tmp_accz(2) , Ack , #2 I2crbyte Tmp_accz(1) , Nack , #2 I2cstop #2 I2cstart #2 'X GYRO I2cwbyte Mpuaddw , #2 I2cwbyte 67 , #2 I2crepstart #2 I2cwbyte Mpuaddr , #2 I2crbyte Tmp_gyrox(2) , Ack , #2 I2crbyte Tmp_gyrox(1) , Nack , #2 I2cstop #2 I2cstart #2 'Y GYRO I2cwbyte Mpuaddw , #2 I2cwbyte 69 , #2 I2crepstart #2 I2cwbyte Mpuaddr , #2 I2crbyte Tmp_gyroy(2) , Ack , #2 I2crbyte Tmp_gyroy(1) , Nack , #2 I2cstop #2 I2cstart #2 'Z GYRO I2cwbyte Mpuaddw , #2 I2cwbyte 71 , #2 I2crepstart #2 I2cwbyte Mpuaddr , #2 I2crbyte Tmp_gyroz(2) , Ack , #2 I2crbyte Tmp_gyroz(1) , Nack , #2 I2cstop #2 End Sub
Gruß
Chris
Hi William,
die Basisadresse des MPU ist immer 68H oder 69H (Hex).
Wenn A0 auf low liegt also 68H (&H68 in BASCOM).
Um die Schreibadresse (Bit 0 gelöscht) zu erhalten musst du diese 68H 1 Bit nach links shiften und dadurch das Bit 0 mit Null auffüllen.
Da kommt dann D0H (&HD0 = &B11010000) als Wert raus.
Die Leseadresse hat das Bit 0 gesetzt, also eins mehr als die Schreibadresse, macht &HD1 (= &B11010001).
Die Werte, die du oben eingestellt hast, stimmen also.
Lesezeichen