Zdravím vespolek,
potřeboval bych od vás poradit se zapojením AD převodníku AD7710 s Atmegou. Postupoval jsem sice podle dokumentací k oběma obvodům (AD7710 zde a Atmega8 zde), ale stále se mi to nedaří.
Sestavil jsem si následující obvod:
Knihovnu pro LCD displej používám tuto.
Můj kód:
[code]#define F_CPU 20000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include “lcd/lcd.h”
#define PIN_DRDY _BV(PB0) // vstup
#define PIN_RFS _BV(PB1) // výstup
#define PIN_TFS_A0 _BV(PB2) // výstup
#define PIN_SDATA_WRITE _BV(PB3) // výstup
#define PIN_SDATA_READ _BV(PB4) // vstup
#define PIN_SCLK _BV(PB5) // výstup
unsigned long read_spi_data() {
unsigned long r = 0UL;
while(!(SPSR & _BV(SPIF)));
r |= SPDR;
while(!(SPSR & _BV(SPIF)));
r |= SPDR << 8;
while(!(SPSR & _BV(SPIF)));
r |= (unsigned long) SPDR << 16;
return r;
}
int main(void) {
DDRB = PIN_SDATA_WRITE | PIN_SCLK | PIN_RFS | PIN_TFS_A0;
PORTB &= ~(PIN_SDATA_READ | PIN_DRDY);
PORTB |= PIN_TFS_A0;
PORTB |= PIN_RFS;
// input capture (PB0):
TCCR1B &= ~_BV(ICES1); // sestupná hrana
TIMSK |= _BV(TICIE1);
// SPI:
SPCR = _BV(SPE) | _BV(MSTR);
LCDInit(LS_NONE);
LCDClear();
LCDWriteString("AD7710AN test");
while(1) {
_delay_ms(500);
}
}
ISR(TIMER1_CAPT_vect) {
PORTB &= ~PIN_RFS;
unsigned long data = read_spi_data();
LCDWriteIntXY(0, 1, data, 5);
PORTB |= PIN_RFS;
}
[/code]
Jasně, že ten kód má plno nedostatků, které ovšem doladím, až rozchodím ten převodník.
Předpokládám, že při měření např. pomocí prvního kanálu zapojím AIN1- do GND a AIN1+ do měřeného úseku (od 0 do 5 V).
Poraďte mi prosím, pokud si s tímto víte rady. Díky.