January 23, 2012
by Pr0ject
|
If you must, but be warned its in a mess at the moment since I'm still working on it. Also it has a lot of copy and pasting...
Also I deleted everything concerning the first row in order to work on other things without it interfering (except fort he part where it just puts in the first row blanks).
#define F_CPU 14745600
#include <avr/io.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdint.h> // needed for uint8_t
#include "../libnerdkits/delay.h"
#include "../libnerdkits/lcd.h"
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <math.h>
#include "../libnerdkits/uart.h"
#define MYPIN (1<<PC5)
#define SWITCH (1<<PC4)
#define LOL (MYPIN | SWITCH)
#define RAND_MAX 0x7FFF
// this code scans ADC1 for an analog signal upon request, using 8Mhz processor clock
int ADCsingleREAD(uint8_t adctouse)
{
int ADCval;
ADMUX = adctouse; // use #1 ADC
ADMUX |= (1 << REFS0); // use AVcc as the reference
ADMUX &= ~(1 << ADLAR); // clear for 10 bit resolution
ADCSRA|= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // 128 prescale for 8Mhz
ADCSRA |= (1 << ADEN); // Enable the ADC
ADCSRA |= (1 << ADSC); // Start the ADC conversion
ADCval = ADCL;
ADCval = (ADCH << 8) + ADCval; // ADCH is read so ADC can be updated again
return ADCval;
}
void adc_init() {
// set analog to digital converter
// for external reference (5v), single ended input ADC0
ADMUX = 0;
// set analog to digital converter
// to be enabled, with a clock prescale of 1/128
// so that the ADC clock runs at 115.2kHz.
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
// fire a conversion just to get the ADC warmed up
ADCSRA |= (1<<ADSC);
}
void realtimeclock_setup() {
// setup Timer0:
// CTC (Clear Timer on Compare Match mode)
// TOP set by OCR0A register
TCCR0A |= (1<<WGM01);
// clocked from CLK/1024
// which is 14745600/1024, or 14400 increments per second
TCCR0B |= (1<<CS02) | (1<<CS00);
// set TOP to 143
// because it counts 0, 1, 2, ... 142, 143, 0, 1, 2 ...
// so 0 through 143 equals 144 events
OCR0A = 143;
// enable interrupt on compare event
// (14400 / 144 = 100 per second)
TIMSK0 |= (1<<OCIE0A);
}
volatile int32_t the_time;
SIGNAL(SIG_OUTPUT_COMPARE0A) {
// when Timer0 gets to its Output Compare value,
// one one-hundredth of a second has elapsed (0.01 seconds).
the_time++;
}
int main(void){
PORTC |= LOL; // turn on pull-up resistor
realtimeclock_setup();
// start up the LCD
lcd_init();
FILE lcd_stream = FDEV_SETUP_STREAM(lcd_putchar, 0, _FDEV_SETUP_WRITE);
lcd_home();
// start up the Analog to Digital Converter
adc_init();
// start up the serial port
uart_init();
FILE uart_stream = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
stdin = stdout = &uart_stream;
sei();
int ADCvalue;
int min;
int max;
int A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X;
while (1)
{
ADCvalue = ADCsingleREAD(5);
// ADCvalue now contains an 10bit ADC read
lcd_line_one();
lcd_write_string(PSTR(" "));
lcd_line_two();
lcd_write_string(PSTR("light level : "));
lcd_write_int16(ADCvalue);
lcd_line_three();
fprintf_P(&lcd_stream, PSTR("%16.2f sec"), (double) the_time / 100.0);
//if ((double) the_time / 100.0 > 5) {
//lcd_line_one();
//lcd_write_string(PSTR(" apple pie "));
//lcd_line_four();
//lcd_write_string(PSTR("this is a replacement"));
//}
//else {
//lcd_line_four();
//lcd_write_string(PSTR("silen"));
//}
if (ADCvalue > max){
if (ADCvalue - max > 50){
max = ADCvalue;
}
}
if (ADCvalue < min) {
min = ADCvalue
}
if ((double) the_time / 100.0 = 1800){
A = ADCvalue;
}
if ((double) the_time / 100.0 = 3600){
B = ADCvalue;
}
if ((double) the_time / 100.0 = 5400){
C = ADCvalue;
}
if ((double) the_time / 100.0 = 7200){
D = ADCvalue;
}
if ((double) the_time / 100.0 = 9000){
E = ADCvalue;
}
if ((double) the_time / 100.0 = 10800){
F = ADCvalue;
}
if ((double) the_time / 100.0 = 12600){
G = ADCvalue;
}
if ((double) the_time / 100.0 = 14400){
H = ADCvalue;
}
if ((double) the_time / 100.0 = 16200){
I = ADCvalue;
}
if ((double) the_time / 100.0 = 18000){
J = ADCvalue;
}
if ((double) the_time / 100.0 = 19800){
K = ADCvalue;
}
if ((double) the_time / 100.0 = 21600){
L = ADCvalue;
}
if ((double) the_time / 100.0 = 23400){
M = ADCvalue;
}
if ((double) the_time / 100.0 = 25200){
N = ADCvalue;
}
if ((double) the_time / 100.0 = 27000){
O = ADCvalue;
}
if ((double) the_time / 100.0 = 28800){
P = ADCvalue;
}
if ((double) the_time / 100.0 = 30600){
Q = ADCvalue;
}
if ((double) the_time / 100.0 = 32400){
R = ADCvalue;
}
if ((double) the_time / 100.0 = 34200){
S = ADCvalue;
}
if ((double) the_time / 100.0 = 36000){
T = ADCvalue;
}
if ((double) the_time / 100.0 = 37800){
U = ADCvalue;
}
if ((double) the_time / 100.0 = 39600){
V = ADCvalue;
}
if ((double) the_time / 100.0 = 41400){
W = ADCvalue;
}
if ((double) the_time / 100.0 = 43200){
X = ADCvalue;
}
lcd_line_four();
lcd_write_string(PSTR("Maximum: "));
lcd_write_int16(max);
}
}
|