//*****************************************************************************
// File Name	: basiciotest.c
// 
// Title		: example usage of basic input and output functions on the AVR
// Revision		: 1.0
// Notes		:
// Target MCU	: Atmel AVR series
// Editor Tabs	: 4
// 
// Revision History:
// When			Who			Description of change
// -----------	-----------	-----------------------
// 02-Feb-2003	pstang		Created the program
//*****************************************************************************

 
//----- Include Files ---------------------------------------------------------
#include <avr/io.h>		// include I/O definitions (port names, pin names, etc)
#include <avr/interrupt.h>	// include interrupt support

#include "global.h"		// include our global settings
//#include "uart.h"		// include uart function library
//#include "rprintf.h"	// include printf function library
//#include "timer.h"		// include timer function library (timing, PWM, etc)
//#include "vt100.h"		// include VT100 terminal support
//#include "encoder.h"	// include encoder driver


//----- Begin Code ------------------------------------------------------------
int main(void)
{
	// initialize our libraries
	// initialize the UART (serial port)
//	uartInit();
	// set the baud rate of the UART for our debug/reporting output
//	uartSetBaudRate(9600);
	// initialize the timer system
//	timerInit();
	// initialize rprintf system
//	rprintfInit(uartSendByte);
	// initialize vt100 library
//	vt100Init();

	// clear the terminal screen
//	vt100ClearScreen();

	u08 a;

	// All AVR processors have I/O ports which each contain up to 8
	// user-controllable pins.  From a hardware perspective, these I/O pins
	// are each an actual physical pin coming out of the processor chip.
	// The voltage on the pins can be sensed or controlled via software,
	// hence their designation as Input/Output pins.

	// While I/O pins are actual wires in the real world, they also exist
	// inside the processor as special memory locations called registers.
	// The software-controlled contents of these registers is what
	// determines the state and operation of I/O pins and I/O ports.

	// Since AVR processors deal naturally with 8 bits at a time, I/O pins
	// are grouped into sets of 8 to form I/O ports.  Three registers
	// are assigned to each I/O port to control the function and state of
	// that port's pins.  The registers are 8-bits wide, and each bit (#0-7)
	// determines the operation of the corresponding number pin (pin 0-7).
	// The three registers are:

	// DDRx  - this register determines the direction (input/output) of the pins on port[x]
	//			A '0' bit in the DDR makes that port pin act as input
	//			A '1' bit in the DDR makes that port pin act as output

	// PORTx - this register contains the output state of the pins on port[x]
	//			A '0' bit makes the port pin output a LOW  (~0V)
	//			A '1' bit makes the port pin output a HIGH (~5V)

	// PINx  - this register contains the input state of the pins on port[x]
	//			A '0' bit indicates that the port pin is LOW  (at ~0V)
	//			A '1' bit indicates that the port pin is HIGH (at ~5V)

	// The x should be replaced with A,B,C,D,E,F, or G depending on the
	// desired port.  Note that not all AVR processors have the same set
	// or number of ports.  Consult the datasheet for your specific processor
	// to find out which ports it has.

	// in the AVR-GCC C language, ports can be accessed using two kinds of
	// commands:
	// inb() and outb()		-	in-byte and out-byte
	// cbi() and sbi()		-	clear-bit and set-bit

	// inb() and outb() should be used when you intend to read or write
	// several bits of a register at once.  Here are some examples:

	outb(DDRA, 0x00);	// set all port A pins to input
	a = inb(PINA);		// read the input state of all pins on port A
	
	outb(DDRB, 0xFF);	// set all port B pins to output
	outb(PORTB, 0xF0);	// set PB4-7 to HIGH and PB0-3 to LOW
	
	// Often you may wish to change only a single bit in the registers
	// while leaving the rest unaltered.  For this, use cbi() and sbi().
	// For example:

	sbi(DDRC, 0);		// sets PC0 to be an output
	sbi(DDRC, 1);		// sets PC1 to be an output

	cbi(PORTC, 1);		// sets PC1 to output a LOW without altering any other pin
	
	// the lines below will cause PC0 to pulse twice,
	// but will leave all other port C pins unchanged
	cbi(PORTC, 0);		// sets PC0 to output a LOW
	sbi(PORTC, 0);		// sets PC0 to output a HIGH
	cbi(PORTC, 0);		// sets PC0 to output a LOW
	sbi(PORTC, 0);		// sets PC0 to output a HIGH
	cbi(PORTC, 0);		// sets PC0 to output a LOW
	
	
	return 0;
}

