Перейти к содержанию

Atmega16 Vs Flash


Лорд

Рекомендуемые сообщения

Суть вопроса: реально ли подключить к контроллеру (ATmega16) флэшку (AT29C020) :blink: с целью того, чтобы контроллер сохранял в нее текущие данные? Или же как еще это реально сделать, учитывая то, что устройство будет часто оставаться без питания, а данные терять не желательно. :unsure:

"Все что нас не убивает, то нас делает сильней!", Егор Летов

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Суть вопроса: реально ли подключить к контроллеру (ATmega16) флэшку (AT29C020) :blink: с целью того, чтобы контроллер сохранял в нее текущие данные? Или же как еще это реально сделать, учитывая то, что устройство будет часто оставаться без питания, а данные терять не желательно. :unsure:

Очень даже возможно :) . А зачем такой большой объём памяти??? Если можно поменьше, то можно использовать последовательные флешки 24Схх, 25Схх,93Схх

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Можно применить энергонезависимое ОЗУ. Только вот мегу придется взять ту у которой есть возможность работы с внешним ОЗУ(162 кажется...).Или "облизывать" всю эту работу самому.

На мой взгляд это самый приемлемый вариант, хоть и не самый дешевый. Ведь для нормального сохранения нужен супервизор питания, запас по тому же питанию и конденсатор довольно большой емкости.Или источник питания...Кроме того при записи в ЕЕ или флеш Очень нехорошо если питание хоть как-то скачет...Мы в свое время пошли по такому пути и не пожалели.Оставалось только сохранить регистровый файл, а это просто.

Ссылка на комментарий
Поделиться на другие сайты

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Схема должна сохранять много записей, каждая запись 8 байт. При этом она будет эксплуатироваться достаточно далеко от компов, данные на комп будут сбрасываться раз в месяц, приблизительно. В день будет создаваться по 7-10 записей, отсюда потребность в таком большом объеме. Последовательную память не перевариваю... Не люблю все последовательное... С тех времен когда ЦСТ изучал (на примерах жесткой логики) помню что параллельный код работает быстрее...

"Все что нас не убивает, то нас делает сильней!", Егор Летов

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Соответственно, подключать флэху надо как обычную оперативу, CE, WE, OE использовать так же?

"Все что нас не убивает, то нас делает сильней!", Егор Летов

Ссылка на комментарий
Поделиться на другие сайты

Учто что если в момент записи устройство останиться без питания ты можешь получить некоректные данные. если устройство притается только 5 вольтам то можешь собрать простенький бесперебойник на базе 6 вольтового акб от упса и не переживать за перебои электро питания акб стоит примерно 90 рублей. дёшево и сердито

Ваши права преследуются по закону!

Ссылка на комментарий
Поделиться на другие сайты

Ну насчет последовательной памяти - это предрассудки! Нынешняя флеша способна тактироваться с частотами в 20-50 МГц. Соответственно и скорости обращения ...А для обращения к ней достаточно нарисовать пару- тройку подпрограммок и только подставлять те значения которые вы куда-то хотите записать... А еще лучше - вообще каждую запись тут же после ее формирования сбрасывать куда-то в ЕЕ или флеш.И соответственно бесперебойник аварийного режима предусмотреть.Т.е. он должен держать питание ровно столько сколько потребуется времени на нормальную запись.Тогда данные останутся в целости и сохранности.А записи можно тупо складывать по порядку одна за одной...

Ну насчет последовательной памяти - это предрассудки! Нынешняя флеша способна тактироваться с частотами в 20-50 МГц. Соответственно и скорости обращения ...А для обращения к ней достаточно нарисовать пару- тройку подпрограммок и только подставлять те значения которые вы куда-то хотите записать... А еще лучше - вообще каждую запись тут же после ее формирования сбрасывать куда-то в ЕЕ или флеш.И соответственно бесперебойник аварийного режима предусмотреть.Т.е. он должен держать питание ровно столько сколько потребуется времени на нормальную запись.Тогда данные останутся в целости и сохранности.А записи можно тупо складывать по порядку одна за одной...

Ссылка на комментарий
Поделиться на другие сайты

1. У меня есть две 29С020 (достались "на халяву", новые, рабочие :) )

2. Насчет аварийности питания - так оно и было задумано сразу, но тут возникает проблема: устройство надо будет периодически таскать к компу для сброса данных, в это время оно должно будет продолжать "собирать и накапливать". Нужна энергонезависимая память, т.к. само устройство будет от ближайшего компа в 1-1,5 км, а может и больше...

"Все что нас не убивает, то нас делает сильней!", Егор Летов

Ссылка на комментарий
Поделиться на другие сайты

Ответ прост: Аккумулятор! Ничего проще не придумаешь.В момент когда сеть есть он подзаряжается.Сеть пропала - питает устройство.Если устройство кроме камня и флеши ничего больше не содержит (в смысле энергопотребляющего) то акэмов "пальцев" на 1000-1500 мА*Ч должно хватить надолго.А если литий поставить от мобильника то еще лучше.

А вообще что вы паритесь? У вас нормальная параллельная флеша.Рисуйте свои данные прямо в нее по порядку да и все!Как во внешнее озу.И тогда даже выключение питания вам пофигу.

А чтоб все это меньше жрало, камень можно в какой нибудь из спящих режимов вогнать...

Ссылка на комментарий
Поделиться на другие сайты

если данные нужно саберать постоянно без остоновки системы то сделай возможность горячей замены к примеру жмёшь кнопку контроллер пишет данные во внутреннюю память меняешь носитель жмёшь опять контроллер начинает писать в сёмное ЗУ

Ваши права преследуются по закону!

Ссылка на комментарий
Поделиться на другие сайты

Слушай объясни подробно что должно делать твоё устройство желательно со схемой какие данныи и как оно должно собирать

Ваши права преследуются по закону!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Это еще где-то на рубеже 2013-2014 годов призошло, просто Вы поздновато присоединились к глобальному помешательству.
    • Этот вариант меня вполне устроит.  То есть тот инструмент, которым редко пользуемся, отключаем и убираем в коробку. При этом доставать и подключать нужный инструмент ИМХО удобнее, чем ставить еще один габаритный девайс с нужным инструментом на рабочий стол. 
    • Вашими бы устами да мед пить. А мозги топикстартеру пожаловать в качестве кешбека. Но suum cuique...
    • Данная тема к "импульсникам" не относится, поэтому всё "внетемное" удаляю. Не флудим. Для обсуждения других схем создавайте отдельные темы!
    • @READART Из практики. Даже 2в1 ухитряются путаться и мешать друг другу. Что за ад будет происходить с 4в1 я с трудом представлю. Вероятнее всего он будет низведен до банального 2в1 из-за неудобства.
    • нечего там смотреть, достаточно взглянуть на картинку- это похоже болячка этой деки- присоединяюсь к теме- у меня такая же проблема!
    • @donec Спасибо, но нет. Слишком всё как то всё сложно и запутано написано там в этом коде.  Я сейчас тем временем продолжаю разбираться с дисплеем. Выяснил причину артефактов на дисплее, а она кроется в коде, но это ещё нужно понять как исправить. Собственно в чём суть дела вывод по одному символу работает корректно и всё отображается правильно, но как только я пытаюсь вывести строку то на дисплее сразу появляются всяческие артефакты. Так что тут получается нужно каким то образом править код вывода строки. Вот весь код написанный под ATMEGA16. #define F_CPU 7372800UL #define BAUND 9600L #define UBRRL_value (F_CPU/(BAUND*16))-1 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> #define MAIN_H_ #define LCD_H_ #define LCD_DDR DDRA #define LCD_PORT PORTA #define LCD_PIN PINA #define DATA 0b11110000 #define RS PA2 #define E PA3 #define E1 LCD_PORT|=(1<<E) #define E0 LCD_PORT&=~(1<<E) #define RS1 LCD_PORT|=(1<<RS) #define RS0 LCD_PORT&=~(1<<RS) void lcd_ini(void); void lcd_str(char* str); void lcd_pos(uint8_t line, uint8_t pos); void lcd_num(uint8_t num, uint8_t line, uint8_t pos); uint8_t n=0; void write(uint8_t n) { n<<=4; E1; //линию Е в 1 LCD_PORT&=~DATA; //удалить предыдущую отправку LCD_PORT|=n; //выставить значение на пины управления дата битами asm("nop"); //пропуск такта E0; //линию Е в 0 } void send_byte(uint8_t byte, uint8_t tip) { if (tip) //если тип данные на линии RS 1 { RS1; } else //иначе тип команда и на линии RS 0 { RS0; } write(byte>>4); //передача старшего полубайта write(byte); //передача младшего полубайта } void lcd_ini(void) { LCD_DDR|=DATA | (1<<RS) | (1<<E); _delay_ms(20); RS0; write(3); _delay_ms(5); write(3); _delay_us(150); write(3); _delay_us(50); write(2); _delay_us(50); send_byte(40,0); _delay_us(50); send_byte(12,0); _delay_us(50); send_byte(1,0); _delay_ms(2); send_byte(6,0); _delay_us(50); } void lcd_str(char* str) { uint8_t n=0; while(str[n]) { send_byte(str[n],1); n++; } } void lcd_pos(uint8_t line, uint8_t pos) { uint8_t adress=(line*0x40+pos)|0x80; send_byte(adress,0); _delay_us(50); } void init_pin(void); #define C_PC0 (~PINC&(1<<PC0)) #define C_PC1 (~PINC&(1<<PC1)) #define LED_1_ON() PORTD|=(1<<PD2) #define LED_1_OFF() PORTD&=~(1<<PD2) #define LED_2_ON() PORTD|=(1<<PD3) #define LED_2_OFF() PORTD&=~(1<<PD3) #define FLAG_END_RX (1<<3) #define FLAG_ERR_RX (1<<4) #define BUF_SIZE 20 char rx_buf[BUF_SIZE]; char buf_index = 0; char rxb; volatile start=1, flags; ISR(USART_RXC_vect) { char rxb = UDR; if(!(flags & FLAG_END_RX)) { rx_buf[buf_index]=rxb; if(rx_buf[buf_index] == 0x0D) { flags |= FLAG_END_RX; return; } buf_index++; if(buf_index >= BUF_SIZE) { buf_index = 0; flags |= FLAG_ERR_RX; } } } void init_UART() { UBRRL = UBRRL_value; UBRRH = UBRRL_value>>8; UCSRB|=(1<<TXEN); UCSRB|=(1<<RXEN); UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)); UCSRB|=(1<<RXCIE); sei(); flags = 0; } void send_UART(char value) { while(!(UCSRA&(1<<UDRE))); UDR=value; } int main(void) { init_pin(); init_UART(); _delay_ms(500); send_UART('O'); send_UART('K'); send_UART('!'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); flags = 0; DDRB = 0b10000000; PORTB = 0b11111111; lcd_ini(); while(1) { if (~PINB & (1<<1)) { send_UART('P'); send_UART('B'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('A',1); lcd_pos(1,0); lcd_str("PORT B1"); //lcd_str(" "); //lcd_pos(1,0); //lcd_str(" "); //lcd_pos(1,0); //lcd_str("GAMES AND SOFT"); //send_byte(0b01000001,1); //A //send_byte(0x41,1); //A //send_byte('A',1); //A } if (~PINB & (1<<2)) { send_UART('P'); send_UART('B'); send_UART('2'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('B',1); lcd_pos(1,0); lcd_str("PORT B2"); //lcd_pos(0,0); //lcd_str(" "); //lcd_pos(1,0); //lcd_str(" "); //lcd_str("TIFASO"); } if (~PINB & (1<<3)) { send_UART('P'); send_UART('B'); send_UART('3'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('C',1); lcd_pos(1,0); lcd_str("PORT B3"); //lcd_str(" "); //lcd_pos(1,0); //lcd_str(" "); //lcd_pos(1,0); //lcd_str("HELLO"); //lcd_pos(1,0); //lcd_str("PLAYER BT201"); } if (~PINB & (1<<4)) { send_UART('P'); send_UART('B'); send_UART('4'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('D',1); lcd_pos(1,0); lcd_str("PORT B4"); //lcd_pos(0,0); //lcd_str(" "); //lcd_pos(1,0); //lcd_str(" "); //lcd_str("FILE MUSIC MP3"); //lcd_pos(1,0); //lcd_str("USB PLAYER VOLL"); } char i = 0; if (rx_buf[i] == 'M'){ i++; if (rx_buf[i] == '1') { LED_1_ON(); LED_2_OFF(); } else if (rx_buf[i] == '2') { LED_1_OFF(); LED_2_ON(); } else if (rx_buf[i] == 'T') { LED_1_ON(); LED_2_ON(); } else if (rx_buf[i] == 'K') { LED_1_OFF(); LED_2_OFF(); } } if (C_PC0) { send_UART('P'); send_UART('C'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('E',1); lcd_pos(1,0); lcd_str("PORT C0"); } if (C_PC1) { send_UART('P'); send_UART('C'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('F',1); lcd_pos(1,0); lcd_str("PORT C1"); } } } void init_pin(void) { DDRC = 0b00000000; PORTC = 0b11111111; DDRD |= ((1<<2)|(1<<3)); PORTD &=~ ((1<<2)|(1<<3)); } Собственно за вывод символа отвечает send_byte она работает правильно, а за вывод строки отвечает lcd_str вот в ней как раз таки и вся проблема с артефактами. А что конкретно не так я пока ещё никак не пойму. Может кто более опытным глазом увидит и подскажет что нужно исправить.
×
×
  • Создать...