Zitat von
Grave80
[...] die PWM Signale die der ADXL ausgibt mir gilfe des Atmega8 auszuwerten, aber irgendwie klappt das alles nicht.
Wahrscheinlich habe ich nur irgendwelche Register falsch gesetzt.
So ist es.
Zitat von
Grave80
ACSR = (1<<ACIC);
Zitat von
ATMega8:199
ACIC: Analog Comparator Input Capture Enable
When written logic one, this bit enables the Input Capture function in Timer/Counter1 to be triggered by the Analog Comparator. The comparator output is in this case directly connected to the Input Capture front-end logic, making the comparator utilize the noise canceler and edge select features of the Timer/Counter1 Input Capture interrupt. When written logic zero, no connection between the Analog Comparator and the Input Capture function exists. To make the comparator trigger the Timer/Counter1 Input Capture interrupt, the TICIE1 bit in the Timer Interrupt Mask Register (TIMSK) must be set.
Das ist nicht was du willst. Ich vermute mal, du willst dem ICP1 (PB0) als Eingang verwenden, und nicht den AIN0/AIN1 (PD6/PD7), den du zudem als Ausgang geschaltet hast.
Zitat von
--bugfix--
ACSR &= ~_BV(ACIC);
Der ICP1 (PB0) muss als Eingang geschaltet werden, nicht als Ausgang. Sonst schmort's im Mega8 oder im ADXL -- oder in beiden.
Zitat von
--bugfix--
// ICP1 ist Eingang ...
DDRB &= ~_BV(0);
// ... mit Pullup
PORTB &= ~_BV(0);
// ... oder ohne Pullup
PORTB |= _BV(0);
Vor du den InputCapture musst du noch
Zitat von
--bugfix--
// Timer1 stoppen, InCapt-Flanke wählen und Timer1 Reset
TCCR1B = _BV(ICES1); // oder = 0;
TCNT1 = 0;
Zitat von
--bugfix--
// ICF1-Flag Reset
TIFR |= _BV(ICF1);
Zitat von
--bugfix--
// Timer1 starten
//Timer 1 in Mode 0, prescale = 1
TCCR1B |= _BV(CS10);
Das alleine reicht für eine PWM-Auswertung aber noch nicht, es sind nur ein paar Bausteine, die du brauchen wirst. Am besten geht so was in einer ISR:
Code:
#include <avr/signal.h>
#include <avr/interrupt.h>
...
volatile uint8_t icr1_update = 0;
uint16_t _icr1_hi, _icr1_low;
uint16_t icr1_hi, icr1_low;
...
{
...
TIMSK = _BV (TICIE1);
sei();
while (1)
{
while (0 == icr1_update)
;
cli();
icr1_hi = _icr1_hi;
icr1_low = _icr1_low;
icr1_update = 0;
sei();
PORTD = icr1_low & 0x00ff;
}
}
SIGNAL (SIG_INPUT_CAPTURE1)
{
TCNT1 = 0;
uint8_t tccr1b = TCCR1B;
if (tccr1b & _BV(ICES1))
_icr1_low = ICR1;
else
_icr1_hi = ICR1;
TCCR1B = tccr1b ^ _BV(ICES1);
TIFR |= _BV(ICF1);
icr1_update = 1;
}
Das nur als Vorschlag. Das ist ein ad-hoc-Code und nicht getestet.
Lesezeichen