Source file: /~heha/basteln/Haus/Telefon/CLIP-Anzeige/clip.zip/ra.h

// ra = Rufnummern-Anzeige: CLIP- und DTMF-Dekoder auf ATtiny861 oder ATmega32U4
// mit LC-Display 16×2 Zeichen
// ATtiny861: Bastelfreundliches 20-poliges DIL-Gehäuse
// ATmega32U4: Auf Arduino Micro oder Pro Micro

#pragma once
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>

typedef uint8_t  byte;
typedef uint16_t word;
#define nobreak
#define elemof(x) (sizeof(x)/sizeof(*(x)))
#define Ae "\010"
#define Ue "\011"
#define sz "\012"
#define _g "\013"
#define _j "\014"
#define _y "\015"
#define ae "\301"
#define oe "\337"
#define Oe "\337"
#define _p "\340"
#define _q "\341"
#define ue "\365"

register byte diff asm("r2");	// Zeitdifferenz
register byte last asm("r3");	// Letzter Timer-Wert
register byte akku asm("r4");	// 1. Low-Teil der Frequenzmessung				4+ Schiebe-Byte
register byte det  asm("r5");	// 1. High-Teil der Frequenzmessung	2+ Erkennung Lo/Hi
register byte cnt  asm("r6");	// 1. Zähler bis 256			2. Zähler bis 16	4+ Schreibdaten-Index (Bytezähler)
register byte stat asm("r7");	// Status innerhalb der CLIP-Erkennung				Bitzähler
register byte dif1 asm("r8");
//register byte before asm("r9");

#define add(r,k) asm volatile("add %0,%2":"=r"(r):"0"(r),"r"((byte)k))	// Byte um Byte oder Konstante erhöhen
#define adc0(r)  asm volatile("adc %0,__zero_reg__":"=r"(r):"0"(r))	// Nur unmittelbar nach add(r,k) erlaubt!
#define swap(r)  asm volatile("swap %0":"=r"(r):"0"(r))			// Nibbles im Byte tauschen

extern struct CLIP{
 char data[40];
 static byte sum();
 static char*findChunk(char);
 static void init();
 static void done();
 static void show();
}clip;

/* Belegung GPIOR0 (bitadressierbare I/O-Zelle)
 0
 1	Timer0-Überlauf aufgetreten
 2	Pin-Change-Interrupt aufgetreten
 3
 4
 5	CLIP-Dekoder: Letztes Vorzeichen des Vergleichs
 6
 7	DTMF-Dekoder: Neue Daten in <gresult>, erneutes Schreiben gesperrt
 
  Belegung Timer0 (8 Bit benutzt um beide OCR verwenden zu können):
  Im Normalfall läuft dieser mit Vorteiler 1024 und generiert so
  Interrupts alle 131 ms, gut für die Klingel-Erkennung.
  Während der CLIP-Detektierung mit Analogvergleicher ist der Vorteiler 8,
  und Interrupts kommen alle ≈1 ms.
  Ist der Hörer abgenommen, ist die CPU-Frequenz ungeteilt für die DTMF-Suche,
  und Interrupts kommen bei Vorteiler 1024 alle 16,384 ms
*/
Detected encoding: UTF-80