Init- und Interrupt-Funktionen der Asuro Library.
Timer2 wird mit 36 kHz betrieben, im Gegensatz zur ausgelieferten
Version mit 72 kHz.
Mehr ...
#include "asuro.h"
#include "myasuro.h"
gehe zum Quellcode dieser Datei
|
void | IsrStandard (void) |
|
void | Init (void) |
| Initialisiert die Hardware: Ports, A/D Wandler, Serielle Schnittstelle, PWM
Die Init Funktion muss von jeden Programm beim Start aufgerufen werden.
|
|
| SIGNAL (TIMER2_OVF_vect) |
|
| if (!count36kHz) timebase++ |
|
| SIGNAL (ADC_vect) |
|
Init- und Interrupt-Funktionen der Asuro Library.
Timer2 wird mit 36 kHz betrieben, im Gegensatz zur ausgelieferten
Version mit 72 kHz.
- Interrupt-Doku nur ueber die Datei zu sehen:
- Bitte ueber den oben ausgegebenen Link 'gehe zum Quellcode
dieser Datei' direkt in der Datei nachsehen.
DoxyGen ist nicht zur Erkennung von Interrupt-Funktionen 'bereit'.
Behandelt werden folgende Interrupts:
- TIMER2_OVF_vect : Timer 2 (fest mit 36 kHz belegt)
- ADC_vect : Analog-Digital-Wandler
- Wichtiger Hinweis:
- Die Init()-Funktion muss von jedem Programm beim Start
aufgerufen werden.
- Siehe auch
- Defines zum setzen von Port's und Konfigurationen in asuro.h
IRTX, LEFT_DIR, PWM, GREEN_LED, RIGHT_DIR, FRONT_LED,
ODOMETRIE_LED, RED_LED, ON, OFF, GREEN, FWD, TRUE, FALSE
- Version
- V— - 10.11.2003 - Jan Grewe - DLR
Original Version von der ASURO CD
-
V— - 20.11.2006 - m.a.r.v.i.n
+++ SIGNAL (ADC_vect)
static Variable toggle mit FALSE initialisiert.
(Bug report von Rolf_Ebert)
-
V— - bis zum 07.01.2007 -
Bitte in Datei CHANGELOG nachsehen.
-
V001 - 13.01.2007 - m.a.r.v.i.n
+++ Alle Funktionen
Zerlegte Sourcen in einzelne Dateien fuer eine echte Library.
-
V002 - 27.01.2007 - Sternthaler
+++ Alle Funktionen
Kommentierte Version (KEINE Funktionsaenderung)
-
V003 - 20.02.2007 - m.a.r.v.i.n
Defines fuer Dometrie High/Low Werte aus myasuro.h verwenden StopSwitch ersetzt. Deshalb wurde immer die komplette switches.o mitgelinkt
-
V004 - 15.11.2007 - m.a.r.v.i.n
RIGHT_DIR und LEFT_DIR waren in der Init Funktion vertauscht
-
V005 - 29.01.2008 - m.a.r.v.i.n
Initialisierung fuer ATmega168
UART Baudrate einstellbar durch Define
Interrupt User Funktionen für Timer und A/D Wandler
-
V006 - 29.03.2009 - rossir
A/D Wandler Abfrage ueber Interrupt
-
V007 - 2013-11-25 - matze Some SIGNALS became deprecated, so I replaced them: SIG_OVERFLOW2 -> TIMER2_OVF_vect SIG_OUTPUT_COMPARE2A -> TIMER2_COMPA_vect SIG_OUTPUT_COMPARE2 -> TIMER2_COMP_vect SIG_ADC -> ADC_vect
Definiert in Datei asuro.c.
being used insted TIMER2_OVF_vect during ultrasonic polling
Initialisiert die Hardware: Ports, A/D Wandler, Serielle Schnittstelle, PWM
Die Init Funktion muss von jeden Programm beim Start aufgerufen werden.
- Siehe auch
- Die Funktionen Sleep() und Msleep() in time.c werden mit dem hier
eingestellten 36 kHz-Takt betrieben.
- Funktionsweise der Zeitfunktionen:
- Msleep() ruft Sleep() auf. In Sleep() wird die globale Variable count36kHz
zur Zeitverzoegerung benutzt. Diese Variable wird jedesmal im Interrupt
TIMER2_OVF_vect um 1 hochgezaehlt.
Der Interrupt selber wird durch den hier eingestellten Timer ausgeloesst.
Somit ist dieser Timer fuer die Zeitverzoegerung zustaendig.
- Siehe auch
- Die globale Variable autoencode fuer die automatische Bearbeitung der
Odometrie-ADC-Wandler wird hier auf FALSE gesetzt.
- Hinweis zur 36 kHz-Frequenz vom Timer 2
- Genau diese Frequenz wird von dem Empfaengerbaustein benoetigt und kann
deshalb nicht geaendert werden.
In der urspruenglichen, vom Hersteller ausgelieferten LIB, war diese
Frequenz allerdings auf 72 kHz eingestellt. Durch eine geschickte
Umkonfigurierung durch waste konnte diese aber halbiert werden.
Sinnvoll ist dies, da der durch diesen Timer2 auch ausgeloesste Timer-
Interrupt dann nur noch die Haelfte an Rechenzeit in Anspruch nimmt.
- Beispiel:
- (Nur zur Demonstration der Parameter/Returnwerte)
int main (void)
{
int wert;
while (1)
(
}
return 0;
}
Definiert in Zeile 228 der Datei asuro.c.
{
#if defined(__AVR_ATmega168__)
TCCR2A = _BV(WGM20) | _BV(WGM21) | _BV(COM2A0) | _BV(COM2A1);
TCCR2B = _BV(CS20);
TIMSK2 |= _BV(TOIE2);
#else
TCCR2 = _BV(WGM20) | _BV(WGM21) | _BV(COM20) | _BV(COM21) | _BV(CS20);
TIMSK |= _BV(TOIE2);
#endif
OCR2 = 0x91;
#if defined(__AVR_ATmega168__)
UCSR0B = (1<<RXEN0) | (1<<TXEN0);
UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
#else
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
#endif
TCCR1A = _BV(WGM10) | _BV(COM1A1) | _BV(COM1B1);
TCCR1B = _BV(CS11);
DDRC &= ~ (_BV(PC0) | _BV(PC1));
ADCSRA = _BV(ADEN) | _BV(ADFR) | _BV(ADIE) | _BV(ADSC) | _BV(ADPS0) | _BV(ADPS1) | _BV(ADPS2);
sei ();
}
void IsrStandard |
( |
void |
| ) |
|
Definiert in Zeile 138 der Datei asuro.c.
{
static int sign[2]={1,1}, avg[2], adc_cnt = 0;
static unsigned char mux[]={
_BV(ADLAR) | _BV(REFS0) |
SWITCH,
_BV(ADLAR) | _BV(REFS0) |
BATTERIE | _BV(REFS1),
};
unsigned int sensor = ADCL | (ADCH << 8);
{
if(adc_cnt<2) {
int s=(sensor >> 8);
avg[adc_cnt] += (s-avg[adc_cnt])>>2;
if (sign[adc_cnt]*(s-avg[adc_cnt]) > 2)
{
sign[adc_cnt] = -sign [adc_cnt];
}
}
}
}
ADMUX = mux[adc_cnt];
adc_cnt=(adc_cnt+1) % sizeof(mux);
}
SIGNAL |
( |
TIMER2_OVF_vect |
| ) |
|
volatile unsigned int adcValue[6] |