Sparrow-Telefon-Timer               

von Michael Gaus                                
      
Elektronik-Labor  Projekte  AVR  Sparrow  Contest          



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);    
   }
}



Elektronik-Labor  Projekte  AVR  Sparrow Contest