nickcam.pwp


//
// PicoWeb Project File for "NickCam"
//
// A Web camera bases on Mattel Nickelodeon/Barbie digital cameras.
//
//  The August 2000 Circuit Cellar Magazine article which describes
//  this PicoWeb project, titled "Look Ma, No PC! A $55 Webcam"
//  can be found in PDF format at...
//  
//  http://www.chipcenter.com/circuitcellar/august00/pdf-0800/c0800blpdf.pdf
//
#define NET_CONFIG_IP     /* allow IP address reconfiguration via net */
#define ENABLE_WATCHDOG   /* use Atmel watchdog timer hardware */
#undef DEBUGGER           /* no debugger firmware */

#define CLOCK 7372000     /* need this clock rate to get 57600 baud rate! */
#define BAUD_RATE 57600   /* serial port baud rate */

// HTML and Java class file
nickcam.htm      // default page
nickcam.class
readcam.htm      application/octet-stream
resetcam.htm     application/octet-stream
grabcam.htm      application/octet-stream

// public CGI routines
reset_image.cgi
grab_image.cgi
upload_image.cgi

//------------------ included AVR assembly language follows ---------------
#avr_reset

#avr_slow

#define putchar_serial pmovbi putc_b,0
#define putchar_net    pmovbi putc_b,1
#define serial_binary  pser_mode 1
#define serial_normal  pser_mode 0
;
; keep camera power on my sending ETX about one per second
;
    pbegin
    putchar_serial                      ; switch putchar to serial port
    serial_binary                       ; put serial port in binary mode
    pputc 0x03                          ; send ETX to camera to keep it on
    pend

#avr_fast

#avr_asm

.data
SD_CHAR:  .skip 1
SD_TEMP:  .skip 2
SD_TMO:   .skip 2

#define SER_TMO        15000     /* about one second with pcode in .cseg */

.section seeprom
;
;  reset_image
;
;   reset camera image counter
;
reset_image:
    putchar_serial                      ; switch putchar to serial port
    serial_binary                       ; put serial port in binary mode
    pputc 0x02                          ; send STX
    pputc 'A'                           ; send reset image counter
    pputc 0                             ; reset to image 0
    pputc 0x03                          ; send ETX
get_response:
    pmovwi SD_TMO,SER_TMO               ; select the timeout period
    putchar_net                         ; switch putchar back to net
    pcall serdev_copynet                ; copy serial port input to net
    pret
;
;  grab_image
;
;   command camera to grab image (i.e., take photo)
;
grab_image:
    putchar_serial                      ; switch putchar to serial port
    serial_binary                       ; put serial port in binary mode
    pputc 0x02                          ; send STX
    pputc 'G'                           ; send grab image
    pputc 0                             ; must be null
    pputc 0x03                          ; send ETX
    pjump get_response

;
;  upload image
;
;   upload image from camera
;
upload_image:
    putchar_serial                      ; switch putchar to serial port
    serial_binary                       ; put serial port in binary mode
    pputc 0x02                          ; send STX
    pputc 'U'                           ; send upload image
    pputc 0                             ; must be null
    pputc 0x03                          ; send ETX
    pjump get_response
;
; serdev_copynet
;
;  loop reading chars from the serial buffer and writing to net until  
;  timeout
;
;  SD_TMO (word) = timeout loop count.
;
.text
serdev_nextchar:
    pser_getc SD_CHAR                   ; get a char into buf
    pjumpeq serdev_empty                ; no more chars!
#if 1
    pputcb SD_CHAR                      ; put char to the net
#else
    phexbi [SD_CHAR]                    ; put hex char value to the net
    pputc ' '
#endif

serdev_copynet:
    pmovwi SD_TEMP,[SD_TMO]             ; reset timeout
    pwdr                                ; reset hardware watchdog timer too
    pjump serdev_nextchar               ; go get another one
serdev_empty:
    psubwi SD_TEMP,1                    ; decrement timeout
    pjumpne serdev_nextchar             ; not yet timed out
serdev_copydone:
    pret


Back