Hallo,
Ich habe die Kamera jetzt recht gut am laufen. Ein Bild mit 40K bei voller Auflösung braucht leider noch 18 Sekunden.
Bei mir arbeitet ein ATMEGA 644P 20PU (Date:0741) mit 22.1184 MHz fehlerfrei.
in Cam.c habe ich folgendes geändert:
//Speichert ein neues Bild im Kameraspeicher
unsigned long cam_picture_store (char mode)
{
unsigned long bytes = 0;
unsigned long timeout = 300000;
cam_command_send (0x08,0x01,0x00,0x00,0x00);
****das alles braucht die Kamera nicht siehe Datenblatt OV 528 ****
// cam_command_send (0x10,0x01,0x00,0x00,0x00);
// cam_command_send (0x12,0x00,0x00,0x00,0x00);
// cam_command_send (0x18,0x01,0x00,0x00,0x00);
// cam_command_send (0x17,0x00,0x00,0x00,0x00);
// cam_command_send (0x21,0x03,0x00,0x00,0x00);
Ulrich weist Du was die oberen 5 Zeilen für eine Funktion haben sollen ? Bei mir gehts auch ohne - wäre Nett wenn Du das mal überprüfen könntest
****************************************************************
//Auflösung 160x120
if (mode == 0)
{
**************** Richtiger Code für 160x120 *********************
cam_command_send (0x01,0x01,0x07,0x09,0x03);
}
//Auflösung 320x240
if (mode == 1)
{
cam_command_send (0x01,0x01,0x07,0x09,0x05);
}
//Auflösung 640x480
if (mode == 2)
{
cam_command_send (0x01,0x01,0x07,0x09,0x07);
in cam.h:
#define DAT_BUFFER_SIZE 1500
und in stack.h
#define MTU_SIZE 1500
das funktioniert grade noch kann aber bei Aktivierung von Zusatzfunktionen zu Fehlern führen.
Um das Bild zu übertragen ruft der AVR die Bilddaten von der Kamera ab, wartet bis die richtigen Daten gesendet werden und füllt den cam_dat_buffer. Bei 40kByte und 1,5K cam_dat_buffer wiederholt sich der Vorgang 27 mal um das gesamte Bild zu übertragen. Von der Kamera werden also 1080kByte gesendet was ca 12 Sekunden dauert. Wenn man die gesamten Bilddaten zwischenspeichern würde könnte man nochmal 6 Sekunden (nur die halbe Zeit, weil am Anfang nicht oder nur kurz auf die Daten gewartet werden muß die man braucht) sparen. Bleibt halt nur die Frage wohin mit den Daten? der AVR-RAM ist leider zu klein, SPI-Flash ist zu langsam beim schreiben und hält nicht ewig, SPI-RAM hab ich nicht gefunden.
Aber der gute ENC hat ja 8kByte Ram wenn man hier einfach vom Empfangspuffer 2-3K abzwackt und da zusätzlich Kameradaten reinschreibt könnte man ca 4 Sekunden sparen. Alternativ zum Lötkolben greifen und einfach ein SPI-RAM basteln und volle 6 Sekunden einsparen. Wobei man die Kamera sicher gleich mit auf das Modul draufbasteln kann um mit der Quarzfrequenz des ETH_32 variabler zu werden.
Und wenn wir schon beim Löten sind ein Kameramodul basteln mit Serieller Anbindung (38KBaud sollten reichen) AVR mit 4KRam, 14,..MHz, Kamera und MAX232 fertig ist das ganze. Im AVR 2 cam_dat_buffer anlagen, einer zum füllen mit Kamerdaten, der andere wird solang übertragen.
Im Datenblatt habe ich auch ein Befehl gefunden um die Firmware der Kamera zu ändern. Optimal wäre es natürlich die Kamera würde die Bilddaten Stückchenweise senden. Leider hab ich davon keine Ahnung wie ich das der Kamera beibringen kann.
Hab ich da was wesentliches übersehen oder ist das so in etwa realisierbar um die Bildübertragung noch etwas zu beschleunigen.
mfg
Klaus
Anhang:
Datenblatt OV528, meine Änderungen in Cam.c, Cam.h und Stack.h