#pragma once
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
#define elemof(x) (sizeof(x)/sizeof(*(x)))
/* Hardware:
PB0 (5) Akku zuschalten / laden mittels MOSFET
PB1 (6) USB D+
PB2 (7) USB D- = INT0 (Interrupts auch bei SOF)
PB3 (2) DCF77-Zeitzeichensignal, LOW = Trägerabsenkung
PB4 (3) Freigabe des Funkempfangsmoduls, LOW = aktiv
PB5 (1) Akkuspannung messen (nur wenn PB0 = HIGH möglich)
Erfordert „wegprogrammiertes“ RESET
*/
#define BAT_BIT 0 // Akku laden
#define BAT_INV 0 // 1 = LOW-aktiv, 0 = HIGH-aktiv
#define SIG_BIT 3 // DCF77-Trägerabsenkung
#define SIG_INV 1 // 1 = LOW-aktiv, 0 = HIGH-aktiv
#define SIG_PU 1 // Eingang benötigt PullUp?
#define ENA_BIT 4 // Empfänger-Freigabe
#define ENA_INV 1 // 1 = LOW-aktiv, 0 = HIGH-aktiv
#define ANA_BIT 5 // Analogeingang (lt. Doku geht der auch mitsamt !RESET)
// Nützt bloß nicht allzu viel.
#ifndef __cplusplus
typedef enum{false,true} bool;
#endif
struct clocktime{
char sec; // Sekunde, 0..59 (Schaltsekunde: 60)
char min; // Minute, 0..59
char hour; // Stunde, 0..23
char day; // Tag, 1..31
char wday; // Wochentag, 1..7
char month; // Monat, 1..12
char year; // Jahr, 0..99
char tz; // Zeitzone, in Stunden (hier: 1 oder 2)
};
extern struct JoyReport{ // Länge: 4
BYTE reportID; // = 1
BYTE joyKey; // Bit 0 = Trägerabsenkung
// Bit 7:1 = Millisekunden bis zum GetReport
WORD timems; // Zeitstempel als Joystick-Achse, in ms
}JoyReport;
extern struct TimeReport{ // Länge: 12
BYTE reportID; // = 2
BYTE gr_delay; // GetReport-Verzögerung
WORD ms; // Zehntel Millisekunden? (0..8055)
struct clocktime t; // Uhrzeit, Lokalzeit (nicht GMT)
}TimeReport; // wie's vom DCF-77 kommt
extern struct SetupReport{ // Länge: 6
BYTE reportID; // = 3
BYTE jh; // Jahrhundert (für die Kalenderrechnung)
BYTE msLow,msMid,msHigh;
BYTE AkkuTyp; // Low-Nibble = Akkutyp:
// 0 = kein, 1 = LiIon, 2 = 2xNiMH, 3 = 3xNiMH, 4 = Alkali, 5 = benutzerdefiniert
// Bit 4 = SIG negiert (mittels Histogramm)
// Bit 5 = ENA negiert
short Ladeschluss; // A/D-Wert Ladeschluss, 0..1023
short Endladeschluss; // A/D-Wert zum Abschalten, 0..1023
}SetupReport; // für den EEPROM
extern struct StatusReport{ // Länge: 8
BYTE reportID; // = 4
BYTE someBits; // Bit 0 = Trägerabsenkung
// Bit 1 = Uhrzeit einfach gültig
// Bit 2 = Uhrzeit doppelt gültig
// Bit 4 = Neue Minute
// Bit 5 = Neue Wetterdaten
// Bit 6 = Neue Stunde
// Bit 7 = Neuer Tag, Zonenzeit
WORD timems; // Zeitstempel, in ms
short Akkuspannung; // A/D-Wert, 0..1023 0x06/0x20
short Chiptemperatur; // A/D-Wert, 0..1023 0x0C/0x105
}StatusReport; // Input-Report (bei jedem Trägerwechsel, oder jede Sekunde für A/D-Wert)
extern struct HistoryReport{ // Länge: 262
BYTE reportID; // = 5
BYTE nMinu; // Low-Nibble = Anzahl, High-Nibble = Schreib-Index
unsigned long long Data[10],Okay[10];
WORD histo[50]; // Eimerbreite 10 ms
}HistoryReport;
struct WetterReport{ // Länge: 1924 (der Rest im Flash, nicht im RAM)
BYTE reportID; // = 6
BYTE cur_mjd;
WORD cur_index;
}WetterReport;
extern WORD T0Capture;
extern WORD lastStart;
#define F_TMR (F_CPU/8/256) // Timer-Frequenz, ergibt 8056 Hz
// PROBLEM: Beim Flash-Schreiben gehen eine Menge Timer-Interrupts flöten.
// Dasselbe auch bei USB-Interrupts.
// LÖSUNG: Timer1 muss als High-Teil-Generator herhalten. (Frisst >1 mA Strom)
// Interruptfrequenz: F_CPU/2048/256 = 31 Hz
// Besser nicht bei Batteriebetrieb.
// Hält die Empfangsdaten im BCD-Format
// Das erspart long-long-Schiebeoperationen in der Firmware des 8-Bit-Controllers.
extern struct frame{
BYTE bitno;
union{
BYTE data[10];
WORD w; // Wetterdaten als WORD
struct{
BYTE wl; // StartM W0 W1 W2 W3 W4 W5 W6
BYTE wh; // W7 W8 W9 W10 W11 W12 W13 Rufbit
BYTE tz; // ANK MESZ MEZ SSek StartZ - - - 21->24
BYTE min; // M1 M2 M4 M8 M10 M20 M40 MPar
BYTE hour; // H1 H2 H4 H8 H10 H20 HPar - 39->40
BYTE day; // D1 D2 D4 D8 D10 D20 - - 46->48
BYTE wday; // W1 W2 W4 - - - - - 51->56
BYTE month; // N1 N2 N4 N8 N10 - - - 61->64
BYTE year; // Y1 Y2 Y4 Y8 Y10 Y20 Y40 Y80
BYTE dpar; // DPar (0) - - - - - - 73 = Ende
};
};
}frame;
extern DWORD Cache24[480]; // im Flash
void dcf77Poll(void);
BYTE ZoneMJD(const struct clocktime*);
void GrabWetter0(const struct frame*);
void GrabWetter1(const struct frame*);
void GrabWetter2(const struct frame*);
//void SaveWetter(DWORD dw, int index);
#include "flash_rw.h"
#include "crypt.h"
Detected encoding: ANSI (CP1252) | 4
|
|