Hallo,
ich hab mal wieder ein Problem mit C.
Ich will ein Thermometer mit einem zweipunktkalibriertem ATtiny25 bauen,
dass ähnlich wie das im elektor vorgestellte µ-Thermometer die
Temperatur als Folge von Lichtblitzen ausgibt.
Mein Problem besteht darin, den Wert, der vom ADC kommt in °C
umzurechnen. Wenn ich dass einfach "normal" da hinschreibe, wird der
Quellcode viel zu groß. Und wenn ich das nach den Regeln in
Festkommaarithmetik mache, dann blinkts nicht. Ich hab es schon mit
konstanten Werten ausprobiert, das Blinken und der ADC sind nicht
schuld.
Mein Problem liegt in der Umwandlung.
Hier mein Code:
1 | //Basic IO
|
2 | #include <avr/io.h>
|
3 |
|
4 | //Interrupt handling
|
5 | #include <avr/interrupt.h>
|
6 |
|
7 | //Integer types
|
8 | #include <stdint.h>
|
9 |
|
10 | int16_t inttemp;//The rounded actual temperature in degree celsius
|
11 | volatile char links;//Die Anzahl der 10er-Stellen
|
12 | volatile char rechts;//Die Anzahl der 1er-Stellen
|
13 | volatile char delay; //Die Pause zwischen zwei Anzeigen
|
14 |
|
15 |
|
16 | //The overflow-interrupt, 100 bytes
|
17 | ISR(TIMER1_OVF_vect){
|
18 | if (PORTB > 0){
|
19 | PORTB = 0;}
|
20 |
|
21 | else{
|
22 | if(links > 0){
|
23 | PORTB = 1;
|
24 | links --;
|
25 | }
|
26 | else{
|
27 | if(rechts > 0){
|
28 | PORTB = 2;
|
29 | rechts --;
|
30 | }
|
31 | else{
|
32 | if(delay > 0){
|
33 | delay --;
|
34 | }
|
35 | }
|
36 | }
|
37 | }
|
38 | }
|
39 |
|
40 | //Inits, 26 Bytes
|
41 | void init(){
|
42 | //Init ADC
|
43 | //Reference @ 1.1 Volts, Temp-Sense-Channel
|
44 | ADMUX = (1<<REFS1)| (1<<MUX0) | (1<<MUX1) | (1<<MUX2) | (1<<MUX3);
|
45 | ADCSRA = (1<<ADPS1) | (1<<ADEN) | (1<<ADSC) | (1<<ADATE);
|
46 |
|
47 | //Init PORTS
|
48 | DDRB = (1<<PB0) | (1<<PB1);
|
49 |
|
50 | //Init Timer
|
51 | //Normal Mode, Prescaler 512
|
52 | TCCR1 = (1<<CS13) | (1<<CS11)|(1<<CS10);
|
53 | TIMSK = (1<<TOIE1);
|
54 | sei();
|
55 | }
|
56 |
|
57 | int main(){
|
58 | //init();
|
59 | while(1){
|
60 | //2282 bytes flash, 264 bytes RAM
|
61 | if((links == 0) && (rechts == 0) && (delay == 0)){
|
62 |
|
63 | inttemp =((ADCW - 282/*.16*/) * 0.8621)/;
|
64 |
|
65 | links = inttemp / 10;
|
66 |
|
67 | rechts = inttemp % 10;//10 bytes flash for one operation?
|
68 |
|
69 | delay = 2;
|
70 | }
|
71 |
|
72 | }
|
73 | return 0;
|
74 | }
|
75 |
|
76 | Die problematische Zeile scheint [c]
|
77 | inttemp =((ADCW - 282/*.16*/) * 0.8621)/;
|
zu sein, da diese Zeile mehr als 2000 Bytes flash und 260 bytes RAM
frisst.
Ich hab es auch schon mit
1 | inttemp =((ADCW - 282/*.16*/) * 8621)/10000;
|
ausprobiert, doch das geht anscheinend auch nicht (Es blinkt nicht).
Die Nachkommastelle der Subtraktion habe ich auskommentiert, da das mir
fast 1000 Bytes flash gebracht hat und die Genauigkeit nicht allzu sehr
darunter leidet.
Weiß jemand, wo mein Fehler liegt?
Ich würde mich freuen, wenn ihr mir helfen könntet.
Mit freundlichen Grüßen,
Valentin Buck