AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
01.07.2011, 13:26
|
#171
|
Прохожий
Регистрация: 13.10.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: SD/MMC на AVR
Люди помогите ради Бога , читал много статии и уже запуталься , должен на SD карте создать фаил , дать ему имя и писать в нем 4-5 баита данние. Пишу на CVAvr 2.04.4a , на ATmega16 ,на PROTEUS-е могу включить MMC карта и запихнуть туда мой созданний имидж фаил скажем sd.mmc , использую двухстрочний дисплей , хочу исползовать ту библиотеку которую ест в CVAvr . Включил MMC/SD... , включил SPI , но должен быть без RTC . С чего начат и куда идти подскажите прошу...
делаю так:
unsigned char drv = 0;
...........................
if(disk_initialize(drv) == STA_NOINIT )
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("not initialized");//
}
else
if(disk_initialize(drv) == STA_NODISK)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("no card inserted");//
}
else
if(disk_initialize(drv) == STA_PROTECT)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("write protected");//
}
else
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("Init OK");//
};
а с зади или с переди что сделат не знаю ... disk_status() , f_mount () , f_open() , f_write() , f_close() , f_opendir() после чего что и как .
и то вышеприведенный код тоже на дисплеи ничего не пишет , какбутто в ети if()-ы else{}-ы не входит , проблема знаю что точно не в дисплее
|
|
|
|
01.07.2011, 16:48
|
#172
|
Прохожий
Регистрация: 13.10.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: SD/MMC на AVR
Люди помогите ради Бога , читал много статии и уже запуталься , должен на SD карте создать фаил , дать ему имя и писать в нем 4-5 баита данние. Пишу на CVAvr 2.04.4a , на ATmega16 ,на PROTEUS-е могу включить MMC карта и запихнуть туда мой созданний имидж фаил скажем sd.mmc , использую двухстрочний дисплей , хочу исползовать ту библиотеку которую ест в CVAvr . Включил MMC/SD... , включил SPI , но должен быть без RTC . С чего начат и куда идти подскажите прошу...
делаю так:
unsigned char drv = 0;
...........................
if(disk_initialize(drv) == STA_NOINIT )
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("not initialized");//
}
else
if(disk_initialize(drv) == STA_NODISK)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("no card inserted");//
}
else
if(disk_initialize(drv) == STA_PROTECT)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("write protected");//
}
else
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("Init OK");//
};
а с зади или с переди что сделат не знаю ... disk_status() , f_mount () , f_open() , f_write() , f_close() , f_opendir() после чего что и как .
и то вышеприведенный код тоже на дисплеи ничего не пишет , какбутто в ети if()-ы else{}-ы не входит , проблема знаю что точно не в дисплее
|
|
|
|
01.07.2011, 17:21
|
#173
|
Частый гость
Регистрация: 21.07.2010
Сообщений: 36
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: SD/MMC на AVR
вот мой пример, думаю разберетесь
Вложения:
![Тип файла: txt](images/attach/txt.gif) |
SD.txt (3.7 Кб, 376 просмотров) |
|
|
|
|
01.07.2011, 18:46
|
#174
|
Частый гость
Регистрация: 21.07.2010
Сообщений: 36
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: SD/MMC на AVR
vegoramar, с чего начать? - на странице 14 данной темы есть сообщения в которых сказано что и где нужно тыкнуть чтоб проект стал рабочим.
|
|
|
|
02.07.2011, 07:47
|
#175
|
Частый гость
Регистрация: 24.08.2005
Сообщений: 28
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 4 сообщении(ях)
|
Re: SD/MMC на AVR
Сообщение от vegoramar
|
Люди помогите ради Бога ,.......
а с зади или с переди что сделат не знаю ... disk_status() , f_mount () , f_open() , f_write() , f_close() , f_opendir() после чего что и как .
и то вышеприведенный код тоже на дисплеи ничего не пишет , какбутто в ети if()-ы else{}-ы не входит , проблема знаю что точно не в дисплее
|
Первое.
/* initialize SPI interface and card driver */
status=disk_initialize(0);
Далее,
/* mount logical drive 0: */
if ((res=f_mount(0,&fat))==FR_OK)
Связывает FAT систему на логическом диске с номером Drive(0) и структуру, на которую указывает указатель fat.
Далее, открыть файл для чтения
/* open the file in read mode */
if ((res=f_open(&file,path,FA_READ))==FR_OK)
если файла нет (возврат любой ошибки) выполнить процедуру
if ((res=f_open(&file,path,FA_CREATE_ALWAYS | FA_WRITE))==FR_OK)
FA_CREATE_ALWAYS - создаст фал.
Далее, закрыть файл.
/* close the file */
if ((res=f_close(&file))==FR_OK)
А теперь основной цикл программы:
/* open the file in read mode */ Открываем файл для записи.
if ((res=f_open(&file,path,FA_WRITE))==FR_OK) //FA_WRITE
В параметре file.fsize будет объем файла в байтах.
Далее, двигаем курсор на количество байт
if ((res=f_lseek(&file,file.fsize))==FR_OK) { //FA_WRITE
если это не выполнить то данные просто будут перезаписаны с 0 строки в файле.
Далее, пишем в файл
/* write some text to the file, without the NULL string terminator sizeof(data)-1 */
if ((res=f_write(&file,text,sizeof(text)-1,&nbytes))==FR_OK)
Закрываем файл
/* close the file */
if ((res=f_close(&file))==FR_OK)
Цикл повторяем, если надо.
Теперь, таймер должен работать.
char text[16]=" "; ваш текст, в данном случае будет записано 15 байт, поставьте 31 - 30 байт будет записано.
char path[]="0:/file.txt"; название вашего файла, не более 8 символов.
Файл будет находится в корневой директории диска.
|
|
|
|
02.07.2011, 08:10
|
#176
|
Частый гость
Регистрация: 24.08.2005
Сообщений: 28
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 4 сообщении(ях)
|
Re: SD/MMC на AVR
Теперь далее по ходу дела.
if ((res= f_mkdir ("Now_blok"))==FR_OK) { //Создание каталога в корневой директории
if ((res= f_chdir ("0:Now_blok"))==FR_OK) { //Открыть созданный каталог
На данный момент мы находимся в каталоге Now_blok
if ((res= f_mkdir ("Now_2"))==FR_OK) { //Создать каталог в каталоге Now_blok
if ((res= f_open (&file,"newfile.txt",FA_CREATE_NEW|FA_WRITE))==FR_ OK) { //Открыть файл, если нет создать в каталоге Now_blok
if ((res= f_open (&file,"newfile.txt",FA_WRITE))==FR_OK) { //Открыть созданный файл
if ((res=f_write(&file,text,sizeof(text)-1,&nbytes))==FR_OK) // Записать в файл текст (заменить)
if ((res=f_close(&file))==FR_OK) // Закрыть файл
if ((res=f_unlink("Now_2"))==FR_OK) // Удалить каталог в каталоге Now_blok
if ((res=f_unlink("newfile.txt"))==FR_OK) // Удалить файл в каталоге Now_blok
if ((res= f_chdir ("0:"))==FR_OK) { //Открыть корневую директорию диска
Вот где хранится адрес текущей директории диска я пока не нашел, но над этом работаю.
На пальцах же проще, чем посмотри там поищи сям.
|
|
|
|
06.07.2011, 16:15
|
#177
|
Прохожий
Регистрация: 13.10.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: SD/MMC на AVR
Здравствуйте всем , дорогой ‹Дмитриус› и ‹Dimon2› огромное спосибо за ответы ,вот что я сделал _
с прогой WinImage создал свой sd.mmc фаил 4Мб втыкал в Proteus в mmc , взял Atmega32 и начал пробовать с CodeVisionAVR-ом, но программный счетчик вьодит в функцию status = disk_initialize(drv); и не выьодит даже . если отключаю эту функцию то программный счетчик идет дальше и остановливается на
f_open(&file,path,FA_READ)
В ЧЕМ МОЖЕТ БЫТЬ ПРОБЛЕМА? ПОДСКАЖИТЕ ПОЖАЛУЙСТА
вот вся прога
#include ‹mega32.h›
#include ‹delay.h›
#include ‹math.h›
#include ‹stdlib.h› //// ***** CHmoranal ‹int -@ › sarqel Float
#include ‹string.h›
// Standard Input/Output functions
#include ‹stdio.h›
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include ‹lcd.h›
// SPI functions
#include ‹sdcard.h›
#include ‹spi.h›
#include ‹ff.h› ///// FAT-i hamar
// Declare your global variables here
//////////////////////////////////////////////////////
/* Timer1 overflow interrupt frequency [Hz] */
#define T1_OVF_FREQ 100
/* Timer1 clock prescaler value */
#define T1_PRESC 1024L
/* Timer1 initialization value after overflow */
#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))
///////////////////////////////////////////////////////
void Initialization();
void Timer_init();
void USART_init();
void SPI_init();
///////////////////////////////////////////////////////
unsigned int i=0;
///////////////////////////////////////////////////////
char USART_WRITE_buffer[53] = {0};
char lcd_buffer[38] = {0}; ///////// sprintf(lcd_buffer,"X or Y VALUE or H VALUE = %f",porc);
/////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char status = 0;
unsigned char drv = 0;
unsigned char vol ;
unsigned int nbytes = 0;
FATFS fat;
FRESULT res ;
FIL file;
// Файл будет находится в корневой директории диска.
char path[]="0:/file.txt"; ///название вашего файла, не более 8 символов.
char text[16] = "aaaaaaaaaa ";
void main(void)
{
Initialization();
Timer_init();
USART_init();
SPI_init();
/* initialize SPI interface and card driver */
//// unsigned char disk_initialize(unsigned char drv)
status = disk_initialize(drv);
if (status == STA_NOINIT )
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("drive not initialized");
delay_ms(1000);
}
else if(status == STA_NODISK )
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("no card ");
delay_ms(1000);
}
else if(status == STA_PROTECT )
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("write protected ");
delay_ms(1000);
}
else if(status == 0 )
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("On success ");
delay_ms(1000);
};
// Связывает FAT систему на логическом диске с номером Drive(0) и структуру,
// на которую указывает указатель fat.
/* mount logical drive 0: */
if ((res=f_mount(0,&fat))==FR_OK)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("f_mount == OK !");//
delay_ms(500);
};
//////////////////////////////////////////////////////////////////////////
// Далее, открыть файл для чтения
/* open the file in read mode */
/* path points to a RAM based NULL terminated char string that represents the
path name for the file to be created or opened.
The path name has the following format:
[logical_drive_number:][/][directory_name/]file_name */
if ((res=f_open(&file,path,FA_READ))==FR_OK)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("f_open == OK !");//
delay_ms(500);
};
//если файла нет (возврат любой ошибки) выполнить процедуру
// FA_CREATE_ALWAYS - создаст фаил.
if ((res=f_open(&file,path,FA_CREATE_ALWAYS | FA_WRITE))==FR_OK)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("f_open == OK !");//
delay_ms(500);
};
///Далее, закрыть файл.
/* close the file */
if ((res=f_close(&file))==FR_OK)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("f_close == OK !");//
delay_ms(500);
};
///А теперь основной цикл программы:
/* open the file in read mode */ //Открываем файл для записи.
//FA_WRITE
if ((res=f_open(&file,path,FA_WRITE))==FR_OK)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("f_open == OK !");//
delay_ms(500);
};
//В параметре file.fsize будет объем файла в байтах.
// Далее, двигаем курсор на количество байт
//если это не выполнить то данные просто будут перезаписаны с 0 строки в файле.
//FA_WRITE
if ((res=f_lseek(&file,file.fsize))==FR_OK)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("f_lseek == OK !");//
delay_ms(500);
};
// Далее, пишем в файл
/* write some text to the file, without the NULL string terminator sizeof(data)-1 */
if ((res=f_write(&file,text,sizeof(text)-1,&nbytes))==FR_OK)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("f_write == OK !");//
delay_ms(500);
};
// Закрываем файл
/* close the file */
if ((res=f_close(&file))==FR_OK)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("f_close == OK !");//
delay_ms(500);
};
// Цикл повторяем, если надо.
while (1)
{
// Place your code here
};
} ;
void Initialization()
{
// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=T State0=T
PORTA=0x00;
DDRA=0xFC;
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xF0;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=T State0=T
PORTD=0x00;
DDRD=0xFC;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
};
void Timer_init()
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=T1_INIT››8; //// perepolnenie
TCNT1L=T1_INIT&0xFF; //// perepolnenie
ICR1H=0x00; /// capture INPUT
ICR1L=0x00; /// capture INPUT
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04; //// s uchitovaniem drugix prerivanii
};
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer1 value
TCNT1H = T1_INIT ›› 8;
TCNT1L = T1_INIT & 0xff;
// Place your code here
disk_timerproc();
}
void USART_init()
{
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
};
void SPI_init()
{
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 125,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: LSB First
/*
///// SPCR /////
Bit7 SPIE ;;; prerivanyayi tuylatrum
Bit6 SPE ;;; SPI-i tuylatrum
Bit5 DORD ;;; sdvigi uxxutyun@ =1 ==LSB ; =0 == HSB
Bit4 MSTR ;;; Vedushi/Podchenyonni =1 == MASTER
Bit3 CPOL ;;; sinxroimpulsi zaxvati front@ =1 ,SCK==1 ojidanyayi vaxt
Bit2 CPHA ;;; sinxroimpulsi fazan
Bit1 SPR1 ;;; sinxroyi f-@ fosc/64 erb SPI2X == 0
Bit0 SPR0 ;;; fosc/64 erb SPI2X == 0
*/
///////// REJIM 0
SPCR=0b01110010;
////////////////////////////
/*
///// SPSR /////////
Bit7 SPIF ;;; peredachayic heto darnum e 1
Bit6 WCOL ;;; pavtorni zapisi flag
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0 SPI2X ;;; aragutyan bazmapatkum 2 ov
*/
SPSR=0x00; //// 0b01000010
///// SPDR -@ dannineri registrn e
}
|
|
|
|
07.07.2011, 06:46
|
#178
|
Частый гость
Регистрация: 24.08.2005
Сообщений: 28
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 4 сообщении(ях)
|
Re: SD/MMC на AVR
Сообщение от vegoramar
|
В ЧЕМ МОЖЕТ БЫТЬ ПРОБЛЕМА? ПОДСКАЖИТЕ ПОЖАЛУЙСТА
вот вся прога
}
|
У тебя отсутствует всего одна строка:
/* globally enable interrupts */
#asm("sei") Разрешить глобально прерывания.
|
|
|
|
07.07.2011, 11:42
|
#179
|
Прохожий
Регистрация: 13.10.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: SD/MMC на AVR
Да спосибо и вправду не зометил ,теперь программный счетчик(P.C.) и вошел в
status = disk_initialize(drv); и вышел и дошел до конца main(). Но status ровнялся status == STA_PROTECT == 0x04 (Card is write protected.)
потом когда вышел из res = f_open(...) то проверял res ровнялся
res == FR_WRITE_PROTECTED, /* 10 */ , в принципе логика есть если
(Card is write protected.) то res == FR_WRITE_PROTECTE это логичный результат. Думал что в MMC настройках что то есть скрытого , но ничего не нашел
использоваю ПРОТЕУС 7.5(SP3) , От чего может это быть?
|
|
|
|
07.07.2011, 13:09
|
#180
|
Частый гость
Регистрация: 24.08.2005
Сообщений: 28
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 4 сообщении(ях)
|
Re: SD/MMC на AVR
Сообщение от vegoramar
|
Думал что в MMC настройках что то есть скрытого , но ничего не нашел
использоваю ПРОТЕУС 7.5(SP3) , От чего может это быть?
|
Не верно настройки были сделаны.
Вот, все работает:
Да, еще кое что, это я для кого пишу:
// если файла нет (возврат любой ошибки) выполнить процедуру
// FA_CREATE_ALWAYS - создаст файл.
Если - это условие, а не последовательность команд.
В этой теме, в сообщении №148 есть образ диска, скачайте его и с ним попробуйте.
Последний раз редактировалось Dimon2; 07.07.2011 в 13:48.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:03.
|
|