No tady ty příspěvky jsem si přečetl pozdě. :-D Ale to ještě opravím. ;-)
Jinak jsem se pustil do programování, ale ono ejhle. Něco je blbě. Tady je kód, ale na displeji se mi nic nezobrazí. Asi něco dělám špatně. A to jsem zkoušel už mooc věcí.
SPI mám nastavenou na rychlost 1MHz. Takže by to mělo fungovat. Ale kde je chyba, to nevím.
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd.h" //knihovna pro komunikaci s LCD 2004
// Mega16 Pinout
#define MOSI 4
#define MISO 6
#define SCLK 7
#define SS 4
char buffer[50];
unsigned int get_adc(unsigned char adata)
{
static unsigned int temp=0;
PORTB &= ~(1<<SS); // SET CS do 0 (aktivovani ADC)
// zde by měla být krátká prodleva??
SPDR = adata; // vložit data do odesílací registru
while(!(SPSR & (1<<SPIF))); // Poslat 1 byte přes HW SPI a čeka na tx
temp = SPDR; // přijatá data nahraje do proměnné TEMP
temp = temp << 8; // posune proměnnou TEMP o 8 vlevo
SPDR = adata; // vloží data do odesílacího registru
while(!(SPSR & (1<<SPIF))); // Poslat 1 byte přes HW SPI a čeka na tx
temp |= SPDR; // přijatá data nahraje do proměnné TEMP
PORTB |= (1<<SS); // nastavi CS do 1 a tim zakaze ADC
return temp; // navratí hodnotu ADcka
}
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, SPI CLK XTAL/16, LSB First
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);
// CS HIGH protože SPI ADS je aktivní v
PORTB |= (1<<SS);
}
int main (void)
{
lcd_init(LCD_DISP_ON); //inicializace LCD
static unsigned int adc_value=0; // promenna AD prevodniku
spim_init(); // Inicializace SPI jako MASTER
adc_value = get_adc(0xFF); // získání hodnoty z AD prevodniku
lcd_gotoxy(0,1);
printf(buffer,"%d",adc_value);
lcd_puts(buffer);
for(;;){}
}