evgforum 0 4 июня, 2006 Опубликовано 4 июня, 2006 · Жалоба 1. Можно ли как-то пользоваться SAM-BA после прошивки в контроллер своей программы, не загружая ее с помощью замыкания перемычек на плате? 2. Не получается помигать светодиодом. Команда, включающая или выключающая светодиод, которая находится в LowLevelInit (сейча закоментарена) выполняется, а дальше в Main - никаких движений int main() { AT91F_LowLevelInit(); //программа как будто останавливается здесь //loop forever while(1) { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<5) ); wait(); AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<5) ); wait(); } } --------------------------------------------------------------------------- #include "ioat91sam7s256.h" #define __inline inline #include "lib_AT91SAM7S256.h" #define true -1 #define false 0 #define AT91F_Default_FIQ_handler 1 #define AT91F_Default_IRQ_handler 2 #define AT91F_Spurious_handler 3 void AT91F_LowLevelInit( void) { int i; AT91PS_PMC pPMC = AT91C_BASE_PMC; //* Set Flash Waite sate // Single Cycle Access at Up to 30 MHz, or 40 AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS ; //* Watchdog Disable AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS; //* Set MCK at 48 054 850 // 1 Enabling the Main Oscillator: // SCK = 1/32768 = 30.51 uSecond // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN )); // Wait the startup time while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS)); // 2 Checking the Main Oscillator Frequency (Optional) // 3 Setting PLL and divider: // - div by 14 Fin = 1.3165 =(18,432 / 14) // - Mul 72+1: Fout = 96.1097 =(3,6864 *73) // for 96 MHz the error is 0.11% // Field out NOT USED = 0 // PLLCOUNT pll startup time estimate at : 0.844 ms // PLLCOUNT 28 = 0.000844 /(1/32768) pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 14 ) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (72<<16))); // Wait the startup time while(!(pPMC->PMC_SR & AT91C_PMC_LOCK)); while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); // 4. Selection of Master Clock and Processor Clock // select the PLL clock divided by 2 pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2 ; while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ; while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); // Set up the default interrupts handler vectors AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler ; for (i=1;i < 31; i++) { AT91C_BASE_AIC->AIC_SVR = (int) AT91F_Default_IRQ_handler ; } AT91C_BASE_AIC->AIC_SPU = (int) AT91F_Spurious_handler ; //------------------------------------------------------------------ //Init of PIO //enable clock to PIOA AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ); //config directions AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, (1<<5) ); //PER & OER //AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<5) ); } __ramfunc void wait(void) { int time; for (time = 0; time < 1E+6; time++); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 4 июня, 2006 Опубликовано 4 июня, 2006 · Жалоба 1. Нет 2.На первый взгяд все правильно, тоько вот задержка вызывает сомнение. Не слишком ли велика? Я бы предолжил убрать ее и посмотреть ногу осциллом. Ну и еще раз проверить инициализацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 4 июня, 2006 Опубликовано 4 июня, 2006 · Жалоба __ramfunc void wait(void) { int time; for (time = 0; time < 1E+6; time++); } Я думаю ошибка в строке int time; Должно быть volatile int time; Компилятор считает что раз в цикле ничего не происходит этот цикл просто не нужен и спокойно его выкидывает. Т.е. нога скорее всего дергается, но очень быстро. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgforum 0 5 июня, 2006 Опубликовано 5 июня, 2006 · Жалоба Совсем убирал Wait, пробовал volatile. Ничего не меняется. На ножке 0 В. Осциллографом пока не смотрел. Видимо дело в инициализации, хотя сразу после нее состояние выхода устанавливается правильно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 5 июня, 2006 Опубликовано 5 июня, 2006 · Жалоба Может возврат из процедуры происходит уже на туда куда надо. Что-то с памятью моей стало... Попробуёте ещё закомментить саму процедуру Wait. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgforum 0 5 июня, 2006 Опубликовано 5 июня, 2006 · Жалоба Проверил инициализацию. Вроде бы все правильно wait комментил - не помогло Светодиод загорается только в момент включения и сразу же гаснет - как и раньше было. Подключен через буфер. Может надо какие-то настройки в Linker делать или еще где в проекте? Там все по дефолту. Оптимизацию отключал Подозрение такое, что генератор не запускается. Буду проверять... Хотя с Самбой все работает. Непонятные сообщения выдает SAMBA - Unlocked involved region - два раза Это нормально? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 6 июня, 2006 Опубликовано 6 июня, 2006 · Жалоба Проверил инициализацию. Вроде бы все правильно wait комментил - не помогло Светодиод загорается только в момент включения и сразу же гаснет - как и раньше было. Подключен через буфер. Может надо какие-то настройки в Linker делать или еще где в проекте? Там все по дефолту. Оптимизацию отключал Киньте мне проект на serzh(ухо)rrt.lv. Погоняю через JTAG, посмотрю куда падает. Правда у меня только SAM7S64, но думаю это непринципиально. Я не пользовался библиотеками с at91.com, прописывал все необходимые регистры вручную по даташиту. И ногами дергал через макросы on() off() имени Аскольда Волкова. Хотя с Самбой все работает. Непонятные сообщения выдает SAMBA - Unlocked involved region - два раза Это нормально? С самбой пока не работал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgforum 0 6 июня, 2006 Опубликовано 6 июня, 2006 · Жалоба И ногами дергал через макросы on() off() имени Аскольда Волкова. Что это? Хотя с Самбой все работает. А как прошиваете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 6 июня, 2006 Опубликовано 6 июня, 2006 · Жалоба И ногами дергал через макросы on() off() имени Аскольда Волкова. Что это? В 2000г Аскольд Волков посылал в конференцию ru.embedded свои макросы работы с портами для AVR. А это творческая переработка: #ifndef ASCOLD_SAM7_H__ #define ASCOLD_SAM7_H__ #ifdef __IAR_SYSTEMS_ICC__ #define _setL(port,bit) do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0) #define _setH(port,bit) do { AT91C_BASE_PIO##port##->PIO_SODR = (1 << bit); } while(0) #define _clrL(port,bit) do { AT91C_BASE_PIO##port##->PIO_SODR = (1 << bit); } while(0) #define _clrH(port,bit) do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0) #define _bitL(port,bit) (!(AT91C_BASE_PIO##port##->PIO_ODSR & (1 << bit))) #define _bitH(port,bit) ( AT91C_BASE_PIO##port##->PIO_ODSR & (1 << bit)) #define _cpl(port,bit,val) do { AT91C_BASE_PIO##port##->PIO_ODSR ^= (1<<bit); } while(0) #define _dir_out(port,bit,val) do { AT91C_BASE_PIO##port##->PIO_OER = (1<<bit); } while(0) #define _dir_in(port,bit,val) do { AT91C_BASE_PIO##port##->PIO_ODR = (1<<bit); } while(0) #define dir_out(x) _dir_out (x) #define dir_in(x) _dir_in (x) #define _set(port,bit,val) _set##val(port,bit) #define on(x) _set (x) #define SET _setH #define _clr(port,bit,val) _clr##val(port,bit) #define off(x) _clr (x) #define CLR _clrH #define _bit(port,bit,val) _bit##val(port,bit) #define signal(x) _bit (x) #define BIT _bitH #define cpl(x) _cpl (x) #endif // __IAR_SYSTEMS_ICC__ #endif //ASCOLD_SAM7_H__ Вот его комментарий по использованию: Макросы SET,CLR,BIT и CPL служат для работы со стандартными SFRами, описанными в стандартных заголовках. А для своих собственных определений я использую on,off,signal и cpl. Пример использования: #define Pin1 PORTD,5,H /* бит 5 порта PORTD, активный уровень высокий */ #define Pin2 PINA,3,L /* бит 3 порта PINA, активный уровень низкий */ ... if(signal(Pin2)) on(Pin1); else off(Pin1); Ну идею ты, наверное, понял. Описание активного уровня я добавил для большей наглядности, а также потому, что изменение полярности сигнала при модификации случается не реже,чем перестановка ножек. Ну а для AT91 это будет выглядеть так: #define LED A,0,H // PIOA, bit 0, active high #define KEY A,20,L // PIOA, bit 20, active low if(signal(KEY)) on(LED); else off(LED); Хотя с Самбой все работает. А как прошиваете? Из IAR C-SPY через JTAG. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 6 июня, 2006 Опубликовано 6 июня, 2006 · Жалоба Может надо какие-то настройки в Linker делать или еще где в проекте? Там все по дефолту. Оптимизацию отключал Ага, посмотрел проект - файл .xcl по умолчанию линкует для неизвестного процессора в результате ОЗУ попадает на адреса 0x10000. Отсюда все грабли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться