0,0 → 1,121 |
/* mija 2009 |
|
SW pro ATmega8 mereni + regulace teploty |
Fosc = 8192000Hz externi krystal |
|
ver.: 0.0 - start |
*/ |
|
#include <avr/io.h> |
#include <avr/interrupt.h> |
#include <util/delay.h> |
#include <avr/eeprom.h> |
#include "reflow.h" |
#include "lcd.h" // musi se definovat PINy LCD |
#include "key.h" // musi se definovat PINy Tlacitek |
#include "clock.h" // typ promenne Clockt_t |
#include "process.h" // musi se definovat PIN topeni |
|
//************************************************************* |
// delay + interrupt |
|
void delay_ms(uint16_t time) |
{ |
while (time --) _delay_ms(1); |
} |
|
volatile static uint8_t ClockTik8ms=125; |
|
ISR(TIMER0_OVF_vect) //tik 8ms |
{ |
if (ClockTik8ms) ClockTik8ms --; |
} |
|
//************************************************************* |
// gemeral cpu set |
|
void GeneralCpuInit(void) |
{ |
//*** IO PIN *** init,setup |
|
//*** TIMER0 *** |
// 256 prescaler |
// overflow 8ms |
// enable interrupt overflow |
TCCR0 = _BV(CS02); |
TIMSK |= _BV(TOIE0); |
|
//*** TIMER1 *** |
|
//*** TIMER2 *** |
|
//*** EXTERNAL INTERRUPT |
|
//*** USART *** |
|
//*** ADC *** |
// input ADC2 (pin25 C2) |
// external reference 2.5V |
// clock adc 128k (div 64) |
ADMUX = _BV(MUX1); |
ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADPS1) | _BV(ADPS2); |
} |
|
//************************************************************* |
// analog read |
|
int16_t ReadAdc(void) |
{ |
int16_t analog; |
uint8_t a; |
|
analog = 0; |
for (a=0;a<32;a++) |
{ |
ADCSR &= ~(_BV(ADIF)); |
ADCSR |= _BV(ADSC); |
while (!(ADCSR & _BV(ADIF))); |
analog += ADC; |
} |
return (analog >> 5 ); // prumer = analog/32 |
} |
|
//************************************************************* |
// main |
|
int main(void) |
{ |
uint8_t proces = START; |
char DisplBuffer[MAXDISPLBUFFER]; |
Clockt_t clock; |
uint16_t temp = 0; |
uint8_t key = NOKEY; |
|
GeneralCpuInit(); |
HeatInit(); |
HeatOff(); |
delay_ms(100); |
LCD_init(); |
KeyInit(); |
ClockInit(0,0,0,&clock); |
sei(); |
|
for (;;) |
{ |
switch(proces) |
{ |
case START: proces = ProcesStart(DisplBuffer,key,temp);break; |
case SOLDER: proces = ProcesSolder(DisplBuffer,key,temp,&clock);break; |
case POSITIV: proces = ProcesPositiv(DisplBuffer,key,temp,&clock);break; |
case DRY: proces = ProcesDry(DisplBuffer,key,temp,&clock); break; |
default: proces = START; |
} |
|
if (DisplBuffer[0]) ProcesDispl(DisplBuffer); |
|
ProcesKey(&key); |
ProcesClock((uint8_t *)&ClockTik8ms,&clock); |
ProcesTemp(ReadAdc(),&temp); |
} |
return 0; |
} |