Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

Re: SD и Atmega 16???

Пн сен 12, 2011 13:59:39

Alerr писал(а):Можете обьяснить, глупый вопрос наверно..А почему происходит падение на диоде-диод, это полупроводник, который пропускает ток в одном направлении...???


Ну, диод и в обратном направлении тоже пропускает, но только ток при этом очень малый, пока пробой не наступит, поэтому и считается, что диод пропускает лишь в одном направлении. А для стабилитронов (которые тоже диоды, только специальные) рабочий участок как раз на область пробоя и приходится, почему они включаются в схему "задом наперёд", а не как обычные диоды.

Что же касается падения напряжения, то оно падает на всём, через что протекает ток и чьё сопротивление отлично от нуля (закон Ома в действии). У диода, понятное дело, сопротивление не равно нулю. Разница же между резистором и диодом в том, что у резистора сопротивление постоянно (ну, почти постоянно: оно тоже немного колеблется в зависимости от температуры и других факторов, но колебания незначительны и ими можно пренебречь), а у диода оно зависит от напряжения. Поэтому на начальном участке вольт-амперной характеристики по мере повышения напряжения на диоде ток растёт медленно, но постепенно рост ускоряется. К напряжению примерно 0,7 В сопротивление диода становится очень малым и наступает ситуация, когда дальнейший рост тока ограничивает не сам диод, а включенное последовательно с ним сопротивление (не обязательно резистор в чистом виде). Если это сопротивление достаточно велико, ток не может вырасти сколько-нибудь значительно, а значит, на диоде падают примерно эти 0,7 В. Правда, цифра эта достаточно условна, поскольку зависит от особенностей диода, от температуры, от тока, но для большинства случаев можно считать её верной. Если последовательно включены два диода, на них падает 1,4 В, если три -- 2,1 В, и т.д. Можно считать, что такой ситуации диоды работают, как стабилизаторы напряжения на уровне 0,7 В. Кстати, это справедливо только для обычных кремниевых диодов, для диодов из других материалов или другой конструкции напряжение "стабилизации" будет другим (у диодов Шоттки, насколько помню, что-то вроде 0,2-0,3 В).

Re: SD и Atmega 16???

Пн сен 12, 2011 17:24:45

Кто-то, кто делал аналогичное в Codevision, могли бы поделиться кодом, ну самым простым, допустим чтения с карты...
Просто пока не могу вообще сдвинуться с места :(

Re: SD и Atmega 16???

Вт сен 13, 2011 13:20:24

Вот. Думаю разберешься. Программа заставляет контролер читать определенный файл с карты и побайтно выкладывать в порт А попути дергая управляюшие сигналы. Если интересно то устройство использовалось для эмуляции ПЗУ спектрума.
Вложения
avr_mmc_reader.rar
(466.97 KiB) Скачиваний: 383

Re: SD и Atmega 16???

Вт сен 13, 2011 14:29:59

Спасибо, начну разбираться :))

Re: SD и Atmega 16???

Сб окт 29, 2011 23:03:10

Ну, наступило то время, когда я спаял всё и просмотрел код...
Возникли некие вопросы по коду:
#include <mega16.h>
// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
#include <spi.h>

static char Buffer[512];
char res;
unsigned int Clustervar;
unsigned long ByteSend =0;
unsigned int filenum = 0;
int Percent;


#define CLUST_RSRVD 0x0ffffff6
#define FALSE 0
#define DATA_PORT PORTA
#define WR_FLAG PORTC.6
#define STR_FLAG PORTC.7
#define OK_LED PORTC.3
#define AVR_RD PINC.5
#define Z80_RST PORTC.4

#include <mmc.c>
#include <fat.c>
//#include <lcd_init.h>
//#include <lcd_s.h>
#include <accel.h>

extern void fat_init(void);
//extern unsigned int Power_check(unsigned char adc_input);
unsigned long FAT_NextCluster(unsigned long cluster);
int play(void);
//extern int FAT_readCluster(unsigned long cluster, char sector_offset);
//extern void idinfo(unsigned long cluster);
unsigned long Size = 0;



void main(void)
{
unsigned int tmp,a;
char buf[6];
unsigned char Dir_Attrib = 20;
char h,m,s;
char Fname[] = "48.ROM";
//char Fname[] = "LOADER.TAP";

// setup SPI I/O pins

// SPI Port config
DDRB.4=1; // set SS as output
DDRB.5=1; // set MOSI as output
DDRB.6=0; // set MISO as input
DDRD.2=1; // SCK output
DDRD.3=1; // CS output
DDRB.0=1;
DDRB.2=1;
DDRB.1=1;
DDRB.4=1;
PORTD.3=1; // CS not active
PORTD.2=1; // set SCK hi
PORTB.1=0; // rst disp
PORTB.4=1;

// VS1001K Control def

// for LS020 TFT
/*
DDRC.6=1; //RS line is out
PORTC.6=1;
DDRC.5=1; //RESET line is out
PORTC.5 = 1;
DDRC.4=1; // CS line is out
PORTC.4=1;
*/

// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0xFF;
//key defination pin

DDRC.5 = 0; // AVR_RD pin
DDRC.7 = 1; // AVR_WR pin
DDRC.6 = 1; // AVR_STR pin
DDRC.4 = 1; // Z80 reset pin
DDRC.3 = 1; // OK led pin
DDRC.0 = 0;
DDRC.1 = 0;
PORTC = 0x00;
//

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 19200
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
/*
// ADC initialization
// ADC Clock frequency: 500,000 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: Free Running
ADMUX=ADC_VREF_TYPE;
ADCSRA=0xA5;
SFIOR&=0x1F;

*/

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 1000,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x51;
SPSR=0x00;

// I2C Bus initialization

//**********************************************

Z80_RST = 1;
OK_LED = 0;
PORTB.1=0;
delay_ms(10);
PORTB.1 = 1;
// LCD init
//sprintf(buf,"K&G");
//lcd_init();
//LCD_FillRect(0,0,132,176,black);
//put_str(50,50,buf,0,2);
//----------
printf("\r\nROM Loader for ZX Spectrum based on T80 & Xilinx FPGA\r\n");

printf("Try to init MMC/SD card... \r\n");
res = mmcReset();
if(res!=0)
{
printf("MMC init failed. Answer: %i\r\n",res);
}
else
{
fat_init();
for (a = 1;a < 240;a++)
{
Clustervar = fat_read_dir_ent(0,a,&Size,&Dir_Attrib,Buffer);
if (Clustervar == 0xffff){break;}
tmp = (Size & 0x0000FFFF);
printf("Cluster = %4x DirA = %2x FileName = ",Clustervar,Dir_Attrib);
printf("%s ",Buffer);
printf(" size: %3li ", File_Size);
printf("\r\n");
if(Dir_Attrib == ATTR_ARCHIVE) filenum++;
}

Clustervar = 0;//suche im Root Verzeichnis
if (fat_search_file(&Fname[0],&Clustervar,&Size,&Dir_Attrib,Buffer) == 1)
{
printf("Total %i files found\r\n",filenum);
printf("----------\r\n");
printf("\r\nFile: %s\r\n",Fname);
printf("Size: %3li Byte\r\n", Size);
printf("\nFile Found!!\r\n");
printf("----------\r\n");
WR_FLAG = 1;
printf("Waiting 4 sec for FPGA configuring...\r\n");
delay_ms(4000);
DATA_PORT = 0x00;
printf("CPU is WAIT for ROM be loaded\r\n");
STR_FLAG = 0;
printf("Reading file and loading ROM\r\n");
play();
}
else
{
printf("File not found\r\n");
};
OK_LED = 1;
WR_FLAG = 0;
STR_FLAG = 0;
DATA_PORT = 0x00;
printf("Loading complete\r\n");
printf("Z80 CPU reset\r\n");
Z80_RST = 0;
delay_ms(500);
Z80_RST = 1;
printf("Ok\r\n");
printf("End program\r\n");
};
printf("Do work wihtout SD/MMC\r\n");
//lcd_init();
//LCD_FillRect(0,0,132,176,black);
while(1)
{

//put_str(10,10,buf,0,1);
//delay_ms(800);
};
}


unsigned long FAT_NextCluster(unsigned long cluster)
{
int result=0;
unsigned long sector,position,next;
if (cluster ==0 ) cluster = 2;
sector = cluster / 256;
result = mmcRead(FAT16_fat_begin_lba+sector,Buffer);
if (result) return 0;
position = (cluster - (sector * 256)) * 2;
next = Buffer[position+1];
next <<= 8;
next += Buffer[position];
if (next == 0xffff) next = 0xffffffff;
return next;
}

int play(void)
{
unsigned long LBA,i,j,NextCluster;
long index = 0;
NextCluster = Clustervar;

while (1)
{
LBA = FAT_cluster2lba(NextCluster);
for (i=0;i<sectors_per_cluster;i++)
{
mmcRead(LBA+i,Buffer);
for (j=0;j<bytes_per_sector;j++)
{
DATA_PORT = Buffer[j];
STR_FLAG = 1;
delay_us(50);
STR_FLAG = 0;
delay_us(500);

index++;
if(index > (Size - 1)) {printf("End Of File\r\n");return 1;};
}
}

ByteSend += (bytes_per_sector * sectors_per_cluster);
Percent = (ByteSend / (File_Size / 100));
NextCluster = FAT_NextCluster(NextCluster);
if (NextCluster > CLUST_RSRVD) break;
//printf("Byte send: %i \r\n",ByteSend);
}


return 0x01; // Next Song
}



не подскажете где висит CMD/DI и DAT/DO?

Re: SD и Atmega 16???

Вс окт 30, 2011 09:05:12

Вроде нашел что куда..

Re: SD и Atmega 16???

Вс окт 30, 2011 09:08:43

Вот тут проходят процедуры инициализации и т.п., а куда, в какую переменную считывается всё с карты???

Re: SD и Atmega 16???

Пт июл 13, 2012 22:04:20

Пока остановился проект...
Тема закрыта