Sparrow-Telefon-Timer
von Michael Gaus
Mit
dem Telefon-Timer kann man unterwegs die Gesprächszeit bei Telefonaten
mit dem Smartphone oder Handy überwachen. Das ist besonders dann
nützlich, wenn man einen Prepaid-Tarif mit minutengenauer Abrechnung
hat, der also pro angefangene Minute einen bestimmten Guthabenbetrag
abzieht. Somit lässt sich durch rechtzeitiges Beenden des Gesprächs vor
Ablauf einer vollen Minute verhindern, dass eine weitere Minute mehr
bezahlt werden muss, nur weil man z.B. zwei Sekunden zu lange
telefoniert hat. Das ist speziell dann nützlich, wenn das Guthaben auf
der Prepaidkarte fast aufgebraucht ist und man etwas mit dem
Restguthaben haushalten muss, bevor wieder eine Guthabenaufladung
durchgeführt werden kann.
Am Beginn des Telefongesprächs muss
der Timer mit Taste S1 gestartet werden. Solange der Timer läuft ist
die grüne LED dauerhaft eingeschaltet. Die rote LED bleibt zunächst
ausgeschaltet als Zeichen, dass noch mehr als 30 Sekunden bis zum
Ablauf der Minute übrig sind.
Nach 30 Sekunden beginnt die rote
LED langsam mit einer Frequenz von 1 Hz zu blinken als Zeichen, dass
noch weniger als 30 Sekunden bis zum Ablauf der Minute übrig sind.
Nach 40 Sekunden blinkt die rote LED mit der doppelten Frequenz, also mit 2 Hz, d.h. es sind noch weniger als 20 Sekunden übrig.
Nach
50 Sekunden blinkt die rote LED erneut mit der doppelten Frequenz, also
mit 4 Hz, d.h. es sind noch weniger als 10 Sekunden übrig.
Nach 55
Sekunden leuchtet die rote LED dauerhaft als Zeichen, dass nun nur noch
weniger als 5 Sekunden bis zum Ablauf der Minute übrig sind.
Nach 60 Sekunden beginnt das ganze von vorne, d.h. die rote LED ist für die nächsten 30 Sekunden wieder ausgeschaltet.
Der Timer kann jederzeit mit der Taste S2 gestoppt werden, sodass dann beide LEDs ausgeschaltet werden.
Die verbleibende Restzeit pro Minute wird folgendermaßen angezeigt:
Restzeit in Sek. | rote LED
-----------------------------------
30 - 60 aus
20 - 30 blinkt mit 1 Hz
10 - 20 blinkt mit 2 Hz
5 - 10 blinkt mit 4 Hz
0 - 5 an
Die
Firmware wurde mit der kostenlosen Evaluation-Version (bis 4 kBytes
Codegröße) des C-Compilers CodeVision AVR V3.10 geschrieben. Die
Taktfrequenz beträgt 1,2 MHz (Clock prescaler = 8).
Links:
C-Compiler CodeVisionAVR V3: http://www.hpinfotech.ro/cvavr_download.html
Download: Sparrow_TelefonTimer.zip
Direkt laden: http://tiny.systems/categorie/cheepit/TelefonTimer.html
/*******************************************************
CodeVisionAVR V3.10 Evaluation
http://www.hpinfotech.com
Chip type : ATtiny13
AVR Core Clock frequency: 1,200000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*******************************************************/
#include <tiny13.h>
#include <delay.h>
#define P_LED_GREEN PORTB.1
#define DP_LED_GREEN DDRB.1
#define P_LED_RED PORTB.3
#define DP_LED_RED DDRB.3
#define KEY_S1 PINB.0
#define KEY_S2 PINB.2
#define LED_OFF 0
#define LED_ON 1
#define LED_BLINK 2
volatile unsigned char ledRed;
bit bTimeMeas = 0;
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
static unsigned char blinkState = 0;
static unsigned int blinkCnt = 0;
static unsigned int ms_cnt = 0;
static unsigned int blinkTime = 0;
if(bTimeMeas)
{
if(ms_cnt < 30000)
{
ledRed = LED_OFF;
}
else if(ms_cnt < 40000)
{
blinkTime = 500;
ledRed = LED_BLINK;
}
else if(ms_cnt < 50000)
{
blinkTime = 250;
ledRed = LED_BLINK;
}
else if(ms_cnt < 55000)
{
blinkTime = 125;
ledRed = LED_BLINK;
}
else
{
ledRed = LED_ON;
}
ms_cnt++;
if(ms_cnt >= 60000)
{
ms_cnt = 0;
}
}
else
{
ms_cnt = 0;
}
if(blinkCnt == 0)
{
blinkState ^= 0x01;
blinkCnt = blinkTime;
}
else
{
blinkCnt--;
}
if(ledRed == LED_OFF)
{
P_LED_RED = 0;
}
else if(ledRed == LED_ON)
{
P_LED_RED = 1;
}
else if(ledRed == LED_BLINK)
{
P_LED_RED = blinkState;
}
}
void initTimer(void)
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 1 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) |
(0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x95;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0);
}
void main(void)
{
// Crystal Oscillator division factor: 8
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (1<<CLKPS1) | (1<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI)
| (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
initTimer();
DP_LED_GREEN = 1;
DP_LED_RED = 1;
// Global enable interrupts
#asm("sei")
while (1)
{
while(KEY_S1 != 0);
bTimeMeas = 1;
P_LED_GREEN = 1;
delay_ms(20);
while(KEY_S2 != 0);
bTimeMeas = 0;
P_LED_GREEN = 0;
ledRed = LED_OFF;
delay_ms(20);
}
}