Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

ATmega 32 въпрос от начинаещ!
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=7027
Страница 1 от 1

Автор:  the_bull [ Чет Авг 06, 2009 2:46 pm ]
Заглавие:  ATmega 32 въпрос от начинаещ!

Започнал съм едно проект че като за начинаещ, но имам проблем. Та въпросния проект е с ATmega 32 като по същество представлява прост брояч на импулси подавани от рид-ампула, като контролера брои и извежда резултата на динамична индикация с 7-сегментни индикатори.До тук се справих криво лево с задачката, но ми се иска да разуча още неща от контролера като например как да записвам променливи в ЕЕПРОМ памета. Мисля стойността която е натрупал брояча да я съхранявам в ЕЕПРОМА но нещо не мога да разбера как се пишат променливи там и какво е нужно. Четох даташита и си играх с примерни кодове дето са дадени там и нищо не става. Ето примерен код от там:
Код:
   char cSREG;
cSREG = SREG; /* store SREG value */
/* disable interrupts during timed sequence */
asm("cli");
EECR |= (1<<EEMWE); /* start EEPROM write */

EECR |= (1<<EEWE);
SREG = cSREG; /* restore SREG value (I-bit) */

Както се вижда пиша на С. От асемблер почти не разбирам (в момента се опитвам да науча и него но съм в началото :) )
Като среда за програмиране използвам AVR Studio 4.
Ще съм ви благодарен ако покажете как може да си пиша променливи и също така ако дадете примерни сорсове за да експериментирам. Това е третият ми проект като първия беше бягащи светлини, а втория PWМ така че още съм много в началото на тази материя, но се надявам с ваша помощ да напредна. :)

Автор:  Cvetanov [ Чет Авг 06, 2009 3:13 pm ]
Заглавие: 

В кода, който си дал само се разрешава писането. След вдигането на двата флага трябва да се сетне адреса, на който ще пишеш и съответно да се зашише байт посредством дейта регистъра.

//
Моя грешка преди сетването на флаговете се задават адреса и данните

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMPE */
EECR |= (1<<EEMPE);
/* Start eeprom write by setting EEPE */
EECR |= (1<<EEPE);
}

Автор:  the_bull [ Чет Авг 06, 2009 4:00 pm ]
Заглавие: 

Cvetanov благодаря ти за помоща, но пак нищо не става. Значи сорса който си ми дал за какъв контролер е? Защото на тая атмега флаговете са и с имена:
EECR->
EERIE
EEMWE
EEWE
EERE
Ако някой поне обясни кой флаг за какво е. Тези с R са за четене сигурно, докато с W за запис но нещо не се ориентирам как става номера.Предполагам дига се някой от флаговете и на адресните регистри се присвоява адрес, на дата регистрите стойността след което флага се нулира и всичко си продължава.
Поне добивам горе долу някаква представа за нещата.
Гледам в хелпа има някакъв хедерен файл с име eeprom.h в него има някакви готови функции ще разгледам и тях. Но ако някой знае как става да пише :)

Автор:  Cvetanov [ Чет Авг 06, 2009 4:10 pm ]
Заглавие: 

кода който съм ти дал е от дейташийта на тини2313

този е за мега32
стр 21
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}

http://www.atmel.com/dyn/resources/prod ... oc2503.pdf
добре е да прочетеш секцията за ЕЕПРОМ-а за да ти се изяснят нещата

Автор:  the_bull [ Чет Авг 06, 2009 6:32 pm ]
Заглавие: 

По късно ще си поиграя с ЕЕПРОМА отново благодаря за помоща :)

Друго да попитам свързано с работата по това устройство. Има ли алгоритъм и евентуално как става броене на импулси с различна честотата и различна продължителност. Предполагам най-удачно е да броя по преден или заден фронт на импулса. Как става броенето по фронт като не знам нито честотата (тя е променлива) също така и дължината на импулса (също може да се мени). Ще трябва ли хардуерно да включвам допълнително елементи или може да се справи контролера софтуерно.
Ето малко инфо за какво става дума :)
Изображение

Автор:  bobyper [ Чет Авг 06, 2009 6:43 pm ]
Заглавие: 

Два варианта
1) Чрез таймер. Пускаш таймер да работи с външни импулси. На входа на таймера подаваш импулсите дето ще ги броиш. Като ти потрябва , четеш таймера и гледаш коко са импулсите до момента
2) Пускаш импулсите на вход за прекъсване. На всяко прексъване ти си увеличаваш променлива дето ще ти показва колко импулси са дошли

Автор:  RM [ Чет Авг 06, 2009 6:51 pm ]
Заглавие: 

След като напишеш успешно програмата ... препиши я на някои друг компилатор JAR, CVAVR ... за да стане както трябва :D

Примерно цялата мъка се свежда до :
(CVAVR)
Код:
eeprom long int tmp;
tmp=123;

Автор:  syrax [ Чет Окт 29, 2009 10:08 pm ]
Заглавие: 

в дейташиита на мегите има прости функции за писане по ЕЕПРОМА :) на С и на АСМ

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/