Aha, es lichtet sich. Ich habe nun deinen Spulenthread gefunden und das von Manf verlinkte PDF gelesen:
http://www.produktinfo.conrad.com/da...ER_BAUSATZ.pdf
Grundsätzlich sind wir auf dem richtigen Weg, denn die Variable count72kHz zeigt eindeutig, dass es sich um die 72kHz-Lib des asuro von der CD handelt. Diese Version 2.1 kann man hier runterladen: http://sourceforge.net/projects/asuro/files/AsuroLib/
Daraus nun der Ausschnitt mit der Timerparametrierung und der ISR:
Code:
volatile unsigned char count72kHz;
/* uses timer2 (36kHz for IR communication */
/* counts falling and rising edge => 36kHz*2 = 72kHz */
SIGNAL (SIG_OUTPUT_COMPARE2)
{
count72kHz ++;
}
/* Init function Processor will be initalized to work correctly */
void Init (void)
{
//-------- seriell interface programmed in boot routine and already running -------
// prepare 36kHz for IR - Communication
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
OCR2 = 0x6E; // 36kHz @8MHz
TIMSK |= (1 << OCIE2); // 36kHz counter for sleep
WGM21 gesetzt bedeutet CTC, COM20 bedeutet "Toggle OC2 on Compare Match", also Ausgangspin umschalten bei Match. CS20 schaltet den Prescaler aus, somit ergeben 0x6e oder 110 im OCR2-Register etwa 8000000/110= 72727 Matches pro Sekunde und ebensoviele Aufrufe der ISR. Da bei jedem Match der Ausgang getogglet wird, ergeben sich am OC2-Pin 36kHz.
Hier mal ein Testprogramm, keine Ahnung ob das so funktioniert:
Code:
// Ansteuerung der Minesweeper-Erweiterung für den asuro mit einem Tiny13 1.9.2011 mic
// Basis ist das Testprogramm aus der Anleitung Seite 10
// Asuro: Tiny13:
// Ausgang der 36kHz (OC2): PB1 (OC0B, Pin6)
// Eingang für das Signal (INT0): PB0 (PCINT0, Pin5)
// Ausgang für LED (PD6): PB2 (Pin7)
// Der Eingang ist wie beim asuro interruptfähig.
#include <avr/io.h>
#include <avr/interrupt.h>
volatile unsigned char count72kHz;
ISR(TIM0_COMPB_vect)
{
count72kHz ++;
}
int main(void)
{
TCCR0A = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0A |= (1 << COM0B0) | (0 << COM0B1); // Toggle OC0B on Compare Match
TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); // kein prescaler!
TIMSK0 = (1 << OCIE0B); // Interrupt ein
OCR0B = 9600/72; // 9,6MHz/72kHz = 133,3
sei();
DDRB |= (1<<PB2) | (1<<PB1); // LED und 36kHz sind Ausgänge
unsigned char oscillation;
PORTB &= ~(1<<PB2); // LED aus
while(1)
{
count72kHz=0;
oscillation = 0;
while (count72kHz<100) {
// Detect low level
if ((PINB & (1<<PB0)) == 0) oscillation = 1;}
// If oscillator is running, no metal object is within
// range, so LED should be off
if (oscillation) PORTB &= ~(1<<PB2); else PORTB |= (1<<PB2); // LED schalten
}
return(0);
}
Gruß
mic
Lesezeichen