Rev 52 | Rev 56 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include <avr/io.h>#include <avr/pgmspace.h>#include <avr/interrupt.h>#include <avr/wdt.h>#include "petelib.h"#include <util/delay.h>#include <stdlib.h>#include "wire.h"#include "lcd.h"volatile uint8_t pcIntCurr[3] = {0,0,0};volatile uint8_t pcIntLast[3] = {0,0,0};volatile uint8_t pcIntMask[3] = {0,0,0};volatile uint8_t tmr0_ovf = 0;volatile uint16_t systime = 0;uint8_t analogRead(uint8_t);uint8_t emblock[] = { 0B00011111,0B00010001,0B00010001,0B00010001,0B00010001,0B00010001,0B00010001,0B00011111 };int main(void) {ACSR |= (1<<ACD); // Disable analog comparator/*Setup ADCADMUX: 8 bit mode, Avcc refADCSRA: Enable, 128 prescale*/ADMUX = (1<<ADLAR) | (0<<REFS0) | (1<<REFS1);ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) ;/*DDR : 1 = Output, 0 = InputPORT: 1 = Pullup for Input, otherwise set outputPIN : Read input pin*//*PB0 - Output - Keypad 2PB1 - Output - Keypad 7PB2 - Output - Keypad 6PB3 - Output - Keypad 4PB4 - Input, Pullup - Function selectPB5 - Input, Pullup - Function select*/DDRB = 0B00001111;PORTB = 0B00111111;DDRC = 0B00000000;PORTC = 0B00110000;/*PD0 - OutputPD1 - Input, Pullup, PCINT17 - Rotary 1bPD4 - Output - Keypad select status ledPD5 - Input, Pullup - Keypad 3PD6 - Input, Pullup - Keypad 1PD7 - Input, Pullup - Keypad 5*/DDRD = 0B00010001;PORTD = 0B11100011;PCMSK2 |= (( 1 << PCINT16 ) | ( 1 << PCINT17 )); //enable encoder pins interrupt sourcesPCICR |= ( 1 << PCIE2 ); //enable pin change interupts// Setup timer0 - Enable overflow, 8 times prescalerTIMSK0 = (1<<TOIE0); // Eable timer overflow for Timer0TCNT0 = 0x00; // Set Timer0 to 0TCCR0B = (1<< CS01) ; // /8 prescalersei();i2c_master();lcd_init();lcd_createChar(0x00, emblock);wdt_enable(WDTO_8S);uint16_t oldsystime = systime;uint8_t oldpotVal = -1;char strTime[] = {'T', 'i', 'm', 'e', ':', 0x00};lcd_setCursor(0, 1);lcd_print(strTime);for(;;) {wdt_reset();if (oldsystime != systime) {oldsystime = systime;char syschar[6];itoa(systime, syschar, 10);syschar[5] = 0x00;lcd_setCursor(10, 1);lcd_print_right(syschar);uint8_t potVal = map_8(analogRead(0), 0, 255, 0, 100);if (potVal != oldpotVal) {lcd_percent_graph(potVal, 0, 0);oldpotVal = potVal;char pot[3];itoa(potVal, pot, 10);lcd_setCursor(14, 0);lcd_print_right(pot);lcd_setCursor(15, 0);lcd_char(0x25);}}}}uint8_t analogRead(uint8_t pin) {ADMUX = (1<<ADLAR) | (1<<REFS0) | (0<<REFS1) | (pin & 0x0f);ADCSRA |= (1<<ADSC); // Start convertingwhile (((ADCSRA >> ADSC) & 1)) {} //Wait until conversion finisheduint8_t result = ADCH;//ADCSRA |= (0<<ADSC); // Stop convertingreturn result;}/*** Process the Pin Change Interrupt.* pcint provides what bank caused the interrupt**/void doInt(uint8_t pcint) {// Clear the mask so we know we've delth with itpcIntMask[pcint] = 0;}ISR(TIMER0_OVF_vect) {xbi(PORTD, PD4);tmr0_ovf++;if (tmr0_ovf>=58) {xbi(PORTD, PD0);systime++;tmr0_ovf = 0;}}ISR(PCINT1_vect){// Save the state and work out which pin caused// the interrupt to occurpcIntCurr[1] = PIND;pcIntMask[1] = pcIntCurr[1] ^ pcIntLast[1];pcIntLast[1] = pcIntCurr[1];doInt(1);}ISR(PCINT2_vect){// Save the state and work out which pin caused// the interrupt to occurpcIntCurr[2] = PIND;pcIntMask[2] = pcIntCurr[2] ^ pcIntLast[2];pcIntLast[2] = pcIntCurr[2];doInt(2);}