PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GBCam Problem



avrrobot
29.11.2011, 16:29
Hallo,

nach einigen leider fehlgeschlagenen Experimenten :( mit der Game Boy Camera melde ich mich wieder.
Ich verwende (noch) einen Atmega16, später soll dann ein 32 mit höherer Taktrate rein, der 16er ist nur
für die Experimente zur Ansteuerung. Dieser läuft im Moment mit 1 Mhz.
Im Moment verwende ich noch eine Abwandlung von dem Code dieser Seite (http://www.kreatives-chaos.com/artikel/gameboykamera-modul), er ist noch nicht
Mega16 kompatibel, außerdem lasse ich dass Messen der Werte und warte dafür einfach ein paar hundert Millisekunden.
Das Signal, welches von der Kamera kommt, sieht im normalen Modus ( nicht edge extracted) ungefähr so aus:
Eine kurze Zeit ist eine Gerade an GND, dann eine etwas längere Gerade etwas höher, dann eine ca. vier mal so lange Gerade so auf 3 Volt.
Danach höhrt das Signal dann auf, bis ich die Register neu schreibe und die Kamera neu starte.
EDIT: Ich hatte noch vergessen zu erwähnen, dass READ immer auf LOW bleibt.
Hat von euch schon mal jemand mit der GBCam gearbeitet?
Hat jemand eine Idee was da falsch sein könnte?
Elektrisch scheint alles richtig verbunden zu sein.

MfG avrrobot

avrrobot
03.12.2011, 14:44
Schade, ich hatte gedacht, dass hier schon mal Leute mit der Kamera gebastelt haben.
Sonst muss ich mich wohl um was andres bemühen.

Martinius11
03.12.2011, 23:04
Hier mal zwei links die helfen sollten:

http://www.angelfire.com/de3/juliprograms/amr/gbcam.htm

http://www.triplay.de/zeigeprojekt.php?id=17

avrrobot
04.12.2011, 12:02
Falls jemand darin Fehler findet, hier ist mein aktueller Quellcode:


#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
void delay_us(uint16_t us);
void gbcam_load_register(uint8_t address, uint8_t data);

void ports_init()
{
DDRB |= (1<<PB0);
DDRB |= (1<<PB1);
DDRB |= (1<<PB5);
DDRB |= (1<<PB6);
DDRB |= (1<<PB7);
DDRB &= ~(1<<DDB4);
PORTB |= (1<<PB4);
}

void cam_reset(void)
{
PORTB &= ~(1<<PB0);
delay_us(2);
PORTB |= (1<<PB6);
delay_us(11);
PORTB |= (1<<PB0);
delay_us(2);
PORTB &= ~(1<<PB6);
delay_us(2);
}

void delay_us(uint16_t us)
{
uint16_t zaehler;
while (us)
{
zaehler = F_CPU / 5000000;
while (zaehler)
{
asm volatile ("nop");
zaehler--;
}
us--;
}
}

static uint8_t gbcam_register[8];

void gbcam_load_register(uint8_t address, uint8_t data)
{
uint8_t i;
address &= 0x07;
gbcam_register[address] = data;
for (i=0;i<3;i++)
{
if ( ( address & 0x04 ) > 0 ) {
PORTB |= (1<<PB5);
}
address <<= 1;

PORTB |= (1<<PB6);
delay_us(11);
PORTB &= ~(1<<PB6);
delay_us(2);
PORTB &= ~(1<<PB5);
delay_us(2);
}
for (i=0;i<8;i++)
{
if ( ( data & 0x80 ) > 0 )
PORTB |= (1<<PB5);
data <<= 1;
PORTB |= (1<<PB6);
delay_us(6);
if (i == 7) {
PORTB |= (1<<PB7);
}
delay_us(6);
PORTB &= ~(1<<PB6);
delay_us(2);
PORTB &= ~((1<<PB5)|(1<<PB7));
delay_us(2);
}
}
void gbcam_init(void)
{
cam_reset();
gbcam_load_register( 0,0x80);
gbcam_load_register( 1,0x04);
gbcam_load_register( 2,0x06);
gbcam_load_register( 3,0x00);
gbcam_load_register( 4,0x01);
gbcam_load_register( 5,0x00);
gbcam_load_register( 6,0x01);
gbcam_load_register( 7,0x2A);
}
void gbcam_start(void)
{
PORTB |= (1<<PB1);
delay_us(2);
PORTB |= (1<<PB6);
delay_us(10);
PORTB &= ~(1<<PB1);
delay_us(2);
PORTB &= ~(1<<PB6);
delay_us(2);
}

int main()
{
ports_init();
gbcam_init();
gbcam_start();
while(1)
{
}
}


Wenn ich das gbcam_init und gbcam_start auch noch mit warten in die Schleife schreibe,
dann kommt zwar das im ersten Beitrag beschriebene Signal,
aber READ geht nie auf High,
auch nicht beim obigen Quelltext.
Ach ja, der Quelltext ist natürlich nicht von mir, ich hab nur angeglichen.