Witam,
Jest sobie termostat do laminatora oparty o ATMega8 - dzieło ze strony:
http://thomaspfeifer.net/laminator_temperatur_regelung.htm
Ponieważ zrobiłem swoją wersję tego urządzenia wzbogaconą o dodatkowe funkcje, muszę zmodyfikować program, a z programowaniem w C nie miałem dotąd za wiele wspólnego...
Na początek postanowiłem sprawdzić działanie swojego kompilatora [WinAvr] i okazuje się, że wywala on błąd na linii:
Cały kod programu zamieszczam poniżej...
Co mu nie pasuje ?
Jest sobie termostat do laminatora oparty o ATMega8 - dzieło ze strony:
http://thomaspfeifer.net/laminator_temperatur_regelung.htm
Ponieważ zrobiłem swoją wersję tego urządzenia wzbogaconą o dodatkowe funkcje, muszę zmodyfikować program, a z programowaniem w C nie miałem dotąd za wiele wspólnego...
Na początek postanowiłem sprawdzić działanie swojego kompilatora [WinAvr] i okazuje się, że wywala on błąd na linii:
fdevopen (uart_putchar, NULL, 0);
Cały kod programu zamieszczam poniżej...
Co mu nie pasuje ?
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#define F_CPU 8000000UL // 8 MHz
#define SOLLWERT 150 //<= gibt die Solltemperatur (ADC-Wert) an, TODO: Autom. Umrechnung von °C
#define BAUD_RATE 9600
#include <util/delay.h>
void adcinit();
int getadc(uint8_t channel);
void waitms(int ms);
int uart_putchar (char c)
//############################################################################
{
if (c == '\n')
uart_putchar('\r');
//Warten solange bis Zeichen gesendet wurde
loop_until_bit_is_set(UCSRA, UDRE);
//Ausgabe des Zeichens
UDR = c;
return (0);
}
void UART_Init (void) {
//Enable TXEN im Register UCR TX-Data Enable
UCSRB=(1 << TXEN);
//Teiler wird gesetzt
UBRRL=(F_CPU / (BAUD_RATE * 16L) - 1);
//öffnet einen Kanal für printf (STDOUT)
fdevopen (uart_putchar, NULL, 0);
}
int convert2degree(int value) {
static const float c1=19.5;
static const float v1=275; //ADC-Wert=264 @ 20°C
static const float c2=202;
static const float v2=154; //ADC-Wert=165 @ 202°C
float m=((c1-c2)/(v1-v2));
return((int)((m*(float)value)+(-m*v1)+c1));
//return((int)((-m*v1)+c1));
}
int main (void) {
int val;
int pwm;
int pwm_ctr=0;
adcinit();
UART_Init();
DDRC = 0b00000000;
DDRB = 0b00000000;
PORTB = 0b00000000;
DDRD = 0b11100000; // 1=Output, 0=Input
PORTD = 0b11100000; //on
printf("ok\n");
while (1==1) {
waitms(100);
val=getadc(0);
printf("%d %d %d %d\n",pwm,pwm_ctr,val,convert2degree(val)); //debug
//printf("%d \n",convert2degree(val));
pwm_ctr++;
if (pwm_ctr>=10) pwm_ctr=0;
pwm=val-SOLLWERT;
if (pwm<0) pwm=0;
if (pwm<pwm_ctr || val<100 || val>1000) { //pwm, detect Sensor contakt break/short
PORTD = 0b01000000; //off
} else {
PORTD = 0b11100000; //on
}
}
}
void adcinit() {
// Activate ADC with Prescaler 16 --> 1Mhz/16 = 62.5kHz
//ADCSRA = _BV(ADEN) | _BV(ADPS2);
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1);
ADMUX= 0;
}
int getadc(uint8_t channel) {
// Select pin ADC0 using MUX
ADMUX = channel | _BV(REFS0) | _BV(REFS1);
//Start conversion
ADCSRA |= _BV(ADSC);
// wait until converstion completed
while (ADCSRA & _BV(ADSC) ) {}
// get converted value
return(ADCW);
}
void waitms(int ms) {
int i;
for (i=0;i<ms;i++) _delay_ms(1);
}