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:
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.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
Hier mal ein Testprogramm, keine Ahnung ob das so funktioniert:
Gruß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); }
mic






Zitieren

Lesezeichen