Hola. Veia esto un poco dormido y queria enseñar alguna cosa nueva o ver si estais metidos en algun proyecto
Recuerdo que en algun post anterior se puso una imagen hecha con un programa de diseño de microelectronica y aprovechando que en clase hemos hecho un diseño, os lo voy a enseñar.
Hemos empleado la herramienta Cadence IC y se trata de un contador BCD full custom (hecho desde cero, cada transistor). El esquematico no es gran cosa, 4 flip-flops y logica adicional para estimular sus entradas (se ha implementado con un decodificador NOR Domino, es decir, logica dinamica). Pero el diseño fisico es lo que realmente tiene importancia y queda asi:

Se pueden observar los 4 flip-flops apilados en la parte izquierda de la imagen y a la derecha el decodificador, generador de reloj y el carry.
La verdad es que se aprende mucho haciendo lo sencillo, pero desde cero. Os animo a preguntar cualquier cosa y que compartais lo que sepais
Ademas estoy metido en otro proyecto para el PIC 18F2550: un adaptador de mando de Gamecube a USB. El protipo ya es funcional, aunque queda pulirlo añadiendole vibracion, los gatillos analogicos L y R, diseñar una PCB y mejorar el codigo.
Esta basado en el ejemplo que proporciona Microchip para hacer un joystick HID y en la web siguiente con informacion del protocolo empleado en el mando:
http://www.int03.co.uk/crema/hardware/gamecube/gc-control.htmlEl codigo principal para recibir los datos del mando es este (tiene partes en ensamblador):
- Código: Seleccionar todo
void pollController(void){
index=0;
while( index < 64 ){
if( DATA==1 ){
index++;
}
else{
index=0;
}
}
count = 0;
index = 64;
pointer = &bits_buffer[0];
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_4);
INTCONbits.GIE = 1; //enable interrupts
timer_flag = 0;
//Poll command
if(padRumble==1){
sendController(0b01000000);
sendController(0b00000011);
sendController(0b00000001);
}
else{
sendController(0b01000000);
sendController(0b00000011);
sendController(0b00000010);
}
sendHigh(); //stop bit
/*
while( DATA != 0 ){ //wait until bit start
if( timer_flag != 0 ){
goto exit_polling;
}
}
*/
w1:
_asm
BTFSC timer_flag, 0x0, ACCESS
GOTO exit_polling
BTFSC 0xf81, 0x3, ACCESS
GOTO w1
_endasm
loop:
do{
/*
while( DATA == 0 ){ //count DATA=0
if( timer_flag != 0 ){
goto exit_polling;
}
count--;
}
*/
w2:
_asm
DECF count, 1, ACCESS
BTFSC timer_flag, 0x0, ACCESS
GOTO exit_polling
BTFSS 0xf81, 0x3, ACCESS
GOTO w2
_endasm
/*
while( DATA != 0 ){ //count DATA=1
if( timer_flag != 0 ){
goto exit_polling;
}
count++;
}
*/
w3:
_asm
INCF count, 1, ACCESS
BTFSC timer_flag, 0x0, ACCESS
GOTO exit_polling
BTFSC 0xf81, 0x3, ACCESS
GOTO w3
_endasm
if( count >= 0 ){
*(pointer) = 1;
}
else{
*(pointer) = 0;
}
//pointer++;
_asm INCF pointer, 1, ACCESS _endasm
count = 0;
//index--;
_asm
DECFSZ index, 1, ACCESS
GOTO loop
_endasm
}
while( index != 0 );
INTCONbits.GIE = 0; //disable interrupts
timer_flag = 0;
mask0 = 0x7f;
mask1 = 0x80;
for(index=0; index<64; index++){
if( bits_buffer[index] == 1 ){
bytes_buffer[index/8] |= mask1;
}
else{
bytes_buffer[index/8] &= mask0;
}
//mask1 = (mask1 >> 1);
_asm RRNCF mask1, 1, ACCESS _endasm
//mask0 = (mask0 >> 1);
_asm RRNCF mask0, 1, ACCESS _endasm
}
return;
exit_polling:
INTCONbits.GIE = 0; //disable interrupts
timer_flag = 0;
for(index=0; index<8; index++){
bytes_buffer[index] = 0xff;
}
return;
}
Una foto:

Si las imagenes no se ven, decidmelo y las subo a otro sitio. Saludos!!