ach stimmt ja, ist es in der neuen asurolib nicht sogar 36kHz ?!
Druckbare Version
ach stimmt ja, ist es in der neuen asurolib nicht sogar 36kHz ?!
Hallo
Wir greifen vor, im Moment sind wir doch noch beim Aufruf der ISR.
Die eigentliche Funktion des Timer2 ist die Erzeugung des 36kHz-Trägersignals für die IR-Kommunikation. In der orginalen CD-Lib wurde im CTC-Mode beim Erreichen des OCR2-Wertes der OC2-Ausgang umgeschaltet (togglen) und der Zähler wieder bei 0 gestartet. Bei 72kHz ergibt das 36kHz an OC2-Pin. Die ISR wird aber mit 72kHz angesprungen.
Neuere Libs (mit FastPWM) schalten pro Zähldurchlauf des Timers2 (0x25-0xff) zweimal den OC2-Pin um, aber die ISR wird nur beim Überlauf am Ende mit 36kHz aufgerufen.
Die Änderung des Timer2 auf 36kHz gibt es seit Version 2.3(beta2) in der asuro-Lib (IR-Abstandsmessung von Waste):
GrußCode:/*******************************************************************************
*
* File Name: asuro.c
* Project : ASURO
*
* Description: This file contains ASURO main features
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* 1.00 14.08.2003 Jan Grewe build
* 2.00 14.10.2003 Jan Grewe LEFT_VEL, RIGHT_VEL -> MotorSpeed(unsigned char left_speed, unsigned char right_speed);
* LeftRwd(),LeftFwd(),RightRwd(),RigthFwd() -> MotorDir(unsigned char left_dir, unsigned char right_dir);
* GREEN_ON,GREEN_OFF,RED_ON,RED_OFF -> StatusLED(unsigned char color);
* LED_RED_ON, LED_RED_OFF -> FrontLED(unsigned char color);
* Blink(unsigned char left, unsigned char right) -> BackLED(unsigned char left, unsigned char right);
* Alles in Funktionen gefasst => leichter verständlich ?!?!
* 2.10 17.10.2003 Jan Grewe new Timer funktion void Sleep(unsigned char time36kHz)
*
* Copyright (c) 2003 DLR Robotics & Mechatronics
*****************************************************************************/
/****************************************************************************
*
* File Name: asuro.c
* Project : asuro library "Robotrixer Buxtehude"
*
* Description: This file contains additional functions:
*
* signal (SIG_ADC) interrupt/signal routine for encoder-counter
* signal (SIG_INTERRUPT1) signal for switches
* Encoder_Init() initializing encoder-counter
* Encoder_Start() start autoencoding
* Encoder_Stop() stop autoencoding
* Encoder_Set(int,int) set encodervalue
* Msleep(int delay) wait for delay in milliseconds
* Gettime() get systemtime in milliseconds
* PrintInt(int)
*
* modifications in Sleep, SIG_OUTPUT_COMPARE2, PollSwitch, LineData
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* beta1 31.03.2005 Robotrixer asuro library
* ------- ---------- -------------- ------------------------------
* the encoder source is based on RechteckDemo.c ver 2.0 by Jan Grewe 22.10.2003
* Copyright (c) 2003 DLR Robotics & Mechatronics
*****************************************************************************/
/****************************************************************************
*
* File Name: asuro.c
* Project : asuro library modified for IR collision detector
*
* Description: modifications made in following functions:
*
* SIGNAL (SIG_OUTPUT_COMPARE2) -> SIGNAL (SIG_OVERFLOW2)
* Gettime() counts now 36kHz
* Init() timer2 modified for adjustable duty cycle
* Batterie() bug fixed
* Sleep() counts now 36kHz
* Msleep() counts now 36kHz
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* beta2 11.06.2005 Waste asuro library
* ------- ---------- -------------- ------------------------------
*****************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
***************************************************************************/
#include "asuro.h"
volatile unsigned char count36kHz;
volatile unsigned long timebase;
volatile int autoencode=FALSE;
/* uses timer2 (36kHz for IR communication */
SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25;
count36kHz ++;
if (!count36kHz) timebase ++;
}
,,,
/* 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 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle for 36kHz
TIMSK |= (1 << TOIE2); // 36kHz counter for sleep
....
mic
Hallo miteinander,
Habe mich nochmals mit dem Ganzen befasst, mir ist nun einiges klarer geworden, doch leider noch nicht alles:
1. Warum rechnet der compare2 die 36kHz mal zwei?
2. Die ganzen Timer-Einstellungen (TCCR2,OCR2 und TIMSK) (habe die werde gefunden im ATmega8 Datenblatt, jedoch noch nicht verstanden. Werde es aber nochmals selbst versuchen)
3. Die Sekunde die er warten soll ist länger als eine Sekunde (habe ein eigenes makefile erstellt und dort eine ATmega8 und den Takt mit 8MHz definiert)
Hoffe ihr könnt mir bei der Frage 1 und 2 weiter helfen.
Hier noch mein Funktionierender Code:
Danke für eure HilfeCode:#include <avr/io.h>
#include <avr/signal.h>
//Front LED an Port D6
#define D6 (1<<PD6)
// unsigned char= Wertbereich ohne Vorzeichen von 0-255
// volatile = wird benutzt, um eine Variabel der Interrupt-Rutine zu geben
volatile unsigned char count72kHz;
// Rutine die mit 36Khz arbeite. Alle [1/(36*2)= 13.89müs] wird count72kHZ um 1 erhöht
SIGNAL (SIG_OUTPUT_COMPARE2) {count72kHz ++;}
// int = Wertbereich von (-32768)-32767
int i;
// main Prozess wird gestartet
int main (void) {
// Port D6 wird als Ausgang gesetzt
DDRD |= D6;
// WGM21 = Mode 2 -> CTC
// COM20 = auf OC2 auf gleichen Wert vergleichen
// CS20 = kein prescaling
TCCR2= (1<<WGM21) | (1<<COM20) | (1<<CS20);
// 0x6E 110
OCR2 = 0x6E;
//Overflow-Interrupt aktivieren
TIMSK |= (1<<OCIE2);
sei (); //alle Interrupts einschalten
while (1) { //Endlosschleife starten
PORTD |= D6; //Port D6 auf high
for (i= 0; i < 1000; i++) // i ist 0, warten bis i 500 hat, i plus 1
{
count72kHz = 0; //Variabel count72kHz ist 0
while (count72kHz < 72); //warten bis count72kHz 72 hat
}
PORTD &= ~D6; //Port D6 auf low
for (i= 0; i < 1000; i++) //sieh oben
{
count72kHz = 0;
while (count72kHz < 72);
}}
return 1; //zurück zu main, wird aber nicht erreicht
}
GR Bongo
Hallo
Zu 1: Eine Periode mit 36kHz dauert zwei Halbwellen mit 72kHz. Nach 1/72000 high, nach weiteren 1/72000 wieder low. (Ich hoffe, ich habe die Frage richtig verstanden)
Zu 2: Da mußt du leider selbst durch ;)
Zu 3: Wieviel dauert die Sekunde denn länger?
Gruß
mic