Hallo Forengemeinde,
Ich code zur Zeit ein Programm für einen Thermostat.
Als Regler kommt die PID-Library aus der AVR221 Appnote zum Einsatz.
Die Temperaturerfassung erfolgt mit DS1820 1-Wire Sensoren, für die ich
den Code von der AVR318 Appnote nutze (Anders als Atmel nutze ich jedoch
nicht den IAR Compiler, sondern den AVRGCC im AtmelStudio 6.1, sodass
ich den Code nicht 1:1 übernommen habe).
Nun zum Problem:
Ich will in einer Interruptroutine, die durch den CompareA des Timer1
ausgelöst wird (CTC-Modus -> Intervall durch OCR1A einstellbar) zunächst
den zuletzt gemessenen Wert des Sensors abrufen und in einer als
volatile deklarierten Variable speichern, dann den Regler ausführen und
zuletzt den Temperatursensor eine neue Messung durchführen lassen.
Die Funktionen für den Temperatursensor funktionieren bereits, den
Regler werde ich erst testen, sobald ich ihn in der Interruptroutine
ausführen kann.
Hier ein kleiner Ausschnmitt:
1 | typedef volatile struct OWI_device
|
2 | {
|
3 | unsigned char bus; //!< A bitmask of the bus the device is connected to.
|
4 | unsigned char id[8]; //!< The 64 bit identifier.
|
5 | };
|
6 | volatile OWI_device * ds1820;
|
7 | volatile struct PID_DATA pidData; // Element des Struct PID-DATA als Pointer für PID-Lib
|
8 |
|
9 | uint16_t NV_P EEMEM = 65535; //EEPROM-Variablen für PID
|
10 | uint16_t NV_I EEMEM = 0;
|
11 | uint16_t NV_D EEMEM = 0;
|
12 | uint16_t NV_PIDfreq EEMEM = 16384; //EEPROM-Variable für PID-Frequenz FCPU/(1024*(PIDfreq+1)) -> 65535 ergibt 0,238Hz
|
13 |
|
14 | uint16_t V_P = 0; //flüchtige Variablen für Regler
|
15 | uint16_t V_I = 0;
|
16 | uint16_t V_D = 0;
|
17 | uint16_t V_PIDfreq = 16384; //flüchtige Variable für PID-Frequenz
|
18 |
|
19 | volatile float tsoll = 7.00; //Sollwert für Regler
|
20 | volatile float tist = -50.00; //Istwert für Regler
|
21 |
|
22 | ISR (TIMER1_COMPA_vect)
|
23 | {
|
24 | tist = DS1820_ReadTemperature((*ds1820).bus, (*ds1820).id, true, false);
|
25 | OCR0 = pid_Controller(tsoll, tist, *pidData);
|
26 | OWI_SkipRom(OWI_PIN_0);
|
27 | OWI_SendByte(DS1820_START_CONVERSION, OWI_PIN_0);
|
28 | }
|
Ich bekomme in der Zeile "volatile OWI_device * ds1820;" den Fehler
"conflicting types for 'ds1820'". Zuvor hatte ich das Struct nicht
Global erstellt und die Temperatur in der main erfasst, jetzt soll dies
jedoch im Interrupt möglich sein...
Ausserdem bekomme ich in der Zeile "OCR0 = pid_Controller(tsoll, tist,
*pidData);" den Fehler "invalid type argument of unary '*' (have
'volatile struct PID_DATA'). Hier benötigt die Funktion pid_Controller
einen Pointer auf ein Struct, das sämtliche Variablen für den Regler
beinhaltet.
Es ist mein erstes Programm mit Interrupt.
Was genau mache ich falsch?
MfG,
Hakon Hennig