Nyní jsem ve fázi, že hodnota zobrazená na LCD je malá. cca 2x menší než má být. A CPOL a CPHA v datasheetu není uvedené jak nastavit, tak jsou v 0. Ale s nima jsem experimentoval, takže zde chybu nevidím. Neporadí někdo? Kód je zde:
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd.h"
// Mega16 Pinout
#define MOSI 5
#define MISO 6
#define SCLK 7
#define SS 4
char buffer[20];
unsigned int get_adc(unsigned char adata)
{
static unsigned int temp=0;
_delay_ms(1);
PORTB &= ~(1<<SS); // SET CS to LOW (activate ADC)
_delay_us(2); // small dealy
SPDR = adata;
while(!(SPSR & (1<<SPIF))); //MSB
temp = SPDR;
temp <<=8; //shift to upper byte
SPDR = adata;
while(!(SPSR & (1<<SPIF))); //LSB
temp += SPDR; // add low byte
//temp <<=8; // why this??
PORTB |= (1<<SS); // SET CS ti HIGH (stop
return temp;
}
void spim_init(void)
{
// SET PORT B jako výstup
DDRB |= (1<<MOSI) | (1<<SCLK) | (1<<SS);
// SET MISO jako vstup
DDRB &= ~(1<<MISO);
// Povoleni SPI, SPI Master, LSB First, SPI CLK XTAL/16)
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);
// nastaveni funkcniho registra SPI (SPCR), CPHA a CPOL v log 0
SPCR &= ~ (1<<CPOL);
SPCR &= ~ (1<<CPHA);
// CS HIGH protože SPI ADS je aktivní v 0
PORTB |= (1<<SS);
}
int main(){
static unsigned int adc_value=0; // promenna AD prevodniku
spim_init();
lcd_init(LCD_DISP_ON); //inicializacia displeja
for(;;){
adc_value = get_adc(0xff); // získání hodnoty z AD prevodniku
lcd_gotoxy(0,1);
sprintf(buffer,"ADC: %05d",adc_value); //zobrazi na LCD hodnotu adc_value na 4 místa (0000)
lcd_puts(buffer);
}
return 0;
}