-
        

Ergebnis 1 bis 4 von 4

Thema: GBCam Problem

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von avrrobot
    Registriert seit
    12.01.2011
    Beiträge
    210
    Blog-Einträge
    9

    GBCam Problem

    Anzeige

    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, 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
    Geändert von avrrobot (29.11.2011 um 17:59 Uhr)

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von avrrobot
    Registriert seit
    12.01.2011
    Beiträge
    210
    Blog-Einträge
    9
    Schade, ich hatte gedacht, dass hier schon mal Leute mit der Kamera gebastelt haben.
    Sonst muss ich mich wohl um was andres bemühen.

  3. #3

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von avrrobot
    Registriert seit
    12.01.2011
    Beiträge
    210
    Blog-Einträge
    9
    Falls jemand darin Fehler findet, hier ist mein aktueller Quellcode:
    Code:
    #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.

Ähnliche Themen

  1. ATMega32 UART problem --> Problem gelöst
    Von ChristophB im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 12.03.2010, 19:45
  2. Problem mit Atmega644P Erkennung (Bascom-Versions-Problem)
    Von Rohbotiker im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 11.08.2008, 19:52
  3. Simple Anschaltung von GBCam an AVR (Mega 32)
    Von xanadu im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 01.02.2006, 21:59

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •