Ferro2 0 4 июня, 2015 Опубликовано 4 июня, 2015 · Жалоба Да, да, а мы вымираем как динозавры :) Надеюсь, что на мой век хватит. Очень не хотелось бы изучать всякие Кортексы. Только, если возьмут на такую работу )) В наших краях - маловероятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harbinger 10 4 июня, 2015 Опубликовано 4 июня, 2015 · Жалоба Касательно именно Silabs есть и историческая причина. Изначально их продукция была достаточно дорогой и потому "нишевой". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ferro2 0 5 июня, 2015 Опубликовано 5 июня, 2015 · Жалоба Касательно именно Silabs есть и историческая причина. Изначально их продукция была достаточно дорогой и потому "нишевой". И сейчас не очень дешевые. Думаю, 90% объема продаж - на производство. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 8 июня, 2015 Опубликовано 8 июня, 2015 · Жалоба А где бы почерпнуть информацию о том, как пишутся программы на Си в Keil для 8051 ? Не совсем про 8051, но просветлению помогает: HowToCodingWithoutErrors.pdf Ну и на всякий случай журнал "Радио" за 1994: в нескольких номерах была статья Фрунзе "Однокристальные микро-ЭВМ семейства 8051". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ferro2 0 9 июня, 2015 Опубликовано 9 июня, 2015 · Жалоба Не совсем про 8051, но просветлению помогает: HowToCodingWithoutErrors.pdf Ну и на всякий случай журнал "Радио" за 1994: в нескольких номерах была статья Фрунзе "Однокристальные микро-ЭВМ семейства 8051". Благодарю за информацию. Почитаем ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ferro2 0 11 июня, 2015 Опубликовано 11 июня, 2015 · Жалоба Приветствую всех! Играюсь с таймером/задержками/прерываниями. Потратил два часа времени и не смог разобраться в чем причина. Замысел - ввести константу zz равную 50. Т.е., вместо "counter = 50" в двух местах кода написать "counter = zz". Как только раскомментирую первую строку с "counter = zz" в Timer0_IS, светодиод перестает мигать. Прошу помощи. Планирую организовать задержки различной длительности с применением таймера. #include <c8051f120.h> #include <stdio.h> #define zz 50; sbit LED_BLINK = P1^6; unsigned int counter = 50; void Port_Init (void); void Timer0_Init (void); void Oscillator_Init() { char SFRPAGE_SAVE = SFRPAGE; int i = 0; SFRPAGE = CONFIG_PAGE; OSCICN = 0x81; CCH0CN &= ~0x20; SFRPAGE = LEGACY_PAGE; FLSCL = 0xB0; SFRPAGE = CONFIG_PAGE; CCH0CN |= 0x20; PLL0CN |= 0x01; PLL0DIV = 0x01; PLL0FLT = 0x0F; PLL0MUL = 0x10; for (i = 0; i < 15; i++); // Wait 5us for initialization PLL0CN |= 0x02; while ((PLL0CN & 0x10) == 0); CLKSEL = 0x02; SFRPAGE = SFRPAGE_SAVE; } void Port_Init (void) { char SFRPAGE_SAVE = SFRPAGE; SFRPAGE = CONFIG_PAGE; XBR2 = 0x40; P1MDOUT = 0x40; SFRPAGE = SFRPAGE_SAVE; } void Timer0_Init(void) { char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page SFRPAGE = TIMER01_PAGE; // Set SFR page TH0 = 0xDB; TL0 = 0xF2; // Init Timer0 Low register TMOD = 0x01; // Timer0 in 16-bit mode CKCON = 0x02; // Timer0 uses a 1:48 prescaler ET0 = 1; // Timer0 interrupt enabled TCON = 0x10; // Timer0 ON SFRPAGE = SFRPAGE_SAVE; // Restore SFR page } void Timer0_ISR (void) interrupt 1 { //counter = zz; // Здесь было counter = 50; TF0 = 0; counter--; if (counter == 0) { counter = zz; // Здесь было counter = 50; LED_BLINK = ~LED_BLINK; } TH0 = 0xDB; TL0 = 0xF2; } void main(void) { WDTCN = 0xDE; // Disable watchdog timer WDTCN = 0xAD; Oscillator_Init(); Timer0_Init (); // Initialize the Timer0 Port_Init (); // Init Ports EA = 1; // Enable global interrupts //LED_BLINK = 0; while (1); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexunder 4 12 июня, 2015 Опубликовано 12 июня, 2015 · Жалоба Как только раскомментирую первую строку с "counter = zz" в Timer0_IS, светодиод перестает мигать. Все правильно. А зачем там в начале обр. прерывания эта строчка? Если ее открыть, то условие if (counter==0) никогда не выполнится и светодиод не включится. Чтобы понять, прокомментируйте действие каждой строки в Timer0_IS и Вам все станет ясно. Планирую организовать задержки различной длительности с применением таймера. Зачем для этого вводить дополнительную глобальную переменную counter если у таймера есть регистры, с помощью которых можно задавать кол-во отсчетов? Вижу смысл в counter только для каких-то специальных нужд, а для задержек с пом-ю таймера этого не требуется имхо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ferro2 0 12 июня, 2015 Опубликовано 12 июня, 2015 · Жалоба Зачем для этого вводить дополнительную глобальную переменную counter если у таймера есть регистры, с помощью которых можно задавать кол-во отсчетов? Вижу смысл в counter только для каких-то специальных нужд, а для задержек с пом-ю таймера этого не требуется имхо. Я так понял, что число в counter определяет количество переполнений таймера (большие задержки, к тому же частота 98 МГц): таймер переполнился - инкрементируем counter и проверяем равенство counter нулю. Пока не придумал функцию, которая бы запускала таймер на необходимое кол-во раз повторений. При этом ядро должно быть готово отреагировать на другие прерывания и задачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexunder 4 12 июня, 2015 Опубликовано 12 июня, 2015 · Жалоба Я так понял, что число в counter определяет количество переполнений таймера (большие задержки, к тому же частота 98 МГц): таймер переполнился - инкрементируем counter и проверяем равенство counter нулю. тогда ясно - большие задержки. Ну вот Вы сами и дали объяснение своего кода. Не нужно в начале обр. прерывания инициализировать counter. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ferro2 0 12 июня, 2015 Опубликовано 12 июня, 2015 (изменено) · Жалоба Не пойму почему программа не работает должным образом, если в строке unsigned int counter = 50; убрать "= 50". Ведь есть zz. Изменено 12 июня, 2015 пользователем Radik2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexunder 4 13 июня, 2015 Опубликовано 13 июня, 2015 · Жалоба Не пойму почему программа не работает должным образом, если в строке unsigned int counter = 50; убрать "= 50". Ведь есть zz. не понял вопроса. Можно сделать так: #define zz 50; unsigned int counter = zz; или Вы о том, что когда counter не проинициализирован числом zz, то программа ведет себя странно? В таком случае проследите последовательность изменения переменной counter и представьте, что происходит когда она не проинициализирована числом zz. Заодно вот Вам задачка: какой будет zz на старте программы после аппаратного сброса МК, если Вы ее не инициализируете? Подсказка: смотреть в какой памяти компилятор разместит эту переменную, можно попросить его ассемблерный листинг сгенерировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 15 июня, 2015 Опубликовано 15 июня, 2015 (изменено) · Жалоба Можно я свои 5 копеек добавлю? Спасибо. 1) "…таймер переполнился - инкрементируем counter…" всё-таки декрементируем (не придирки ради, а программу пишем) 2) почему не используете точки остановки? на входе в обработчик прерывания? Последующим пошаговый проход сразу показал бы не нужную безусловную инициализацию counter в 50 и что он не менялся меньше 49. Подсказка ;) zz от сброса не зависит - это символическое имя (константа). Изменено 15 июня, 2015 пользователем Obam Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ferro2 0 3 августа, 2015 Опубликовано 3 августа, 2015 · Жалоба Увидел вот эти камни случайно: http://ru.aliexpress.com/item/10pcs-lot-P8...2386655890.html Errata практически пустая. Хорошая замена всяким ATtiny. Есть у них на сайте генератор кода: http://www.codearchitect.org/nxp/v2/ Не приходилось применять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harbinger 10 3 августа, 2015 Опубликовано 3 августа, 2015 · Жалоба Приходилось, на пути от атмела к силабсу. :) Здесь в недрах даже кое-что выкладывал насчёт программатора для них. И генератор кода использовал, и ошибку в нём нашёл. :) Увы, их сняли с производства, из всей линейки остались только 925 и 936. На смену им пришла серия LPC800 (ядро Cortex-M0, 30 МГц), почти pin-to-pin и с сопоставимой ценой (правда, замена есть только для "мелких" - 915...917, 920...925). Недостатки серии LPC900 были в отсутствии внутрисхемной отладки и малом объёме памяти в мелких корпусах (SSOP-16 - 2 кБ FLASH, SSOP-20 - 8 кБ, RAM всего 256 байт). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ferro2 0 4 августа, 2015 Опубликовано 4 августа, 2015 · Жалоба Получается, что из МК 51-й серии Silabs предлагает лучшее соотношение качество/цена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться