// 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-8 | 0
|