USBasp-Klon

Aus Wiki CCC Göttingen
Zur Navigation springen Zur Suche springen

Hier wird ein Board fuer den USBasp [1], ein AVR In System Programmer, der V-USB fuer USB direkt am AVR verwendet.

Achtung: Das Board ist aus Platzgruenden nicht mit der Originalfirmware kompatibel! Nur die gepatchte Firmware aufspielen!

Board

Das Board ist in platzsparender Stickform und verwendet beinahe nur SMD-Komponenten in handbestueckbaren Grössen.

Bestückung

Da die meisten Bauteile nichts besonderes sind, aber doch immermal was fehlt, habe ich noch zu jedem Bauteil, das nicht unbedingt funktionskritisch ist, noch eine Alternativbestückung dazugeschrieben. Die Bauteile haben natürlich einen Sinn und ein Fehlen schränkt in der einen oder anderen Weise die Funktionalität des Programmers ein.

Bezeichner Bestückung Alternativbestückung
L1 Spule 1210: 10uH, 100 mA Widerstand, 1206: 0 Ohm
C1 Kondensator, 0805: 10uF, 16 V freilassen
B0, B1, B2, B3, B4, B5 Widerstand, 1206: 0 Ohm -
D1, D2 Zener-Diode, MiniMELF: 3.6V Zener-Spannung -
R1, R2 Widerstand, 0805: 68 Ohm -
R3 Widerstand, 0805: 2.2 kOhm Widerstand mit ähnlichem Wert
C2, C3, C4 Keramikkondensator 0603: 100nF, 16V Keramikkondensator mit ähnlichem Wert
C6, C7 Keramikkondensator 0603: 22pF, 16V -
Y1 Quarz, HC49 SMD: 12MHz -
U1 ATmega8, TQFP ATmega48, TQFP oder ähnlich
R4, R5 Widerstand, 0805: 1kOhm Widerstand mit ähnlichem Wert
LD1, LD2 Leuchtdiode 0805 freilassen
T1, T2 Taster freilassen
(unbenannt) 10-poliger Wannenstecker freilassen
(unbenannt) 6-poliger Wannnenstecker freilassen

Firmware

Der Programmer selbst muss einmal geflasht werden, bevor er verwendet werden kann, wofür ein bereits funktionierender AVR ISP benötigt wird.

Patch

--- main.c.old	2010-09-26 12:17:50.460872001 +0200
+++ main.c	2010-09-26 18:03:05.670872002 +0200
@@ -222,7 +222,11 @@
 	PORTD = 0;
 	PORTB = 0;
 	/* all outputs except PD2 = INT0 */
-	DDRD = ~(1 << 2);
+	//DDRD = ~(1 << 2);
+	/* switch PD0, PD3, PD4 and PD5 to input, as they are used
+	 * routing and PD2 to input as it is used for INT0
+	 */
+	DDRD &= ~((1 << 0) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5));
 
 	/* output SE0 for USB reset */
 	DDRB = ~0;
@@ -238,8 +242,10 @@
 	DDRB = 0;
 
 	/* all inputs except PC0, PC1 */
-	DDRC = 0x03;
-	PORTC = 0xfe;
+	DDRC = (1 << 0) | (1 << 1);
+	/* activate pullups on all other pins, except those that were 
+	 * re-used for routing */
+	PORTC = ~((1 << 0) | (1 << 1) | (1 << 3) | (1 << 4) | (1 << 5));
 
 	/* init timer */
 	clockInit();