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

Да, да, а мы вымираем как динозавры :)

 

Надеюсь, что на мой век хватит. Очень не хотелось бы изучать всякие Кортексы. Только, если возьмут на такую работу ))

В наших краях - маловероятно.

Поделиться сообщением


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

Касательно именно Silabs есть и историческая причина. Изначально их продукция была достаточно дорогой и потому "нишевой".

Поделиться сообщением


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

Касательно именно Silabs есть и историческая причина. Изначально их продукция была достаточно дорогой и потому "нишевой".

 

И сейчас не очень дешевые. Думаю, 90% объема продаж - на производство.

Поделиться сообщением


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

А где бы почерпнуть информацию о том, как пишутся программы на Си в Keil для 8051 ?

 

Не совсем про 8051, но просветлению помогает:

HowToCodingWithoutErrors.pdf

 

Ну и на всякий случай журнал "Радио" за 1994: в нескольких номерах была статья Фрунзе "Однокристальные микро-ЭВМ семейства 8051".

Поделиться сообщением


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

Не совсем про 8051, но просветлению помогает:

HowToCodingWithoutErrors.pdf

 

Ну и на всякий случай журнал "Радио" за 1994: в нескольких номерах была статья Фрунзе "Однокристальные микро-ЭВМ семейства 8051".

Благодарю за информацию. Почитаем ...

Поделиться сообщением


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

Приветствую всех!

Играюсь с таймером/задержками/прерываниями. Потратил два часа времени и не смог разобраться в чем причина.

Замысел - ввести константу 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); 
}

Поделиться сообщением


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

Как только раскомментирую первую строку с "counter = zz" в Timer0_IS, светодиод перестает мигать.

Все правильно. А зачем там в начале обр. прерывания эта строчка? Если ее открыть, то условие if (counter==0) никогда не выполнится и светодиод не включится.

Чтобы понять, прокомментируйте действие каждой строки в Timer0_IS и Вам все станет ясно.

 

Планирую организовать задержки различной длительности с применением таймера.

Зачем для этого вводить дополнительную глобальную переменную counter если у таймера есть регистры, с помощью которых можно задавать кол-во отсчетов? Вижу смысл в counter только для каких-то специальных нужд, а для задержек с пом-ю таймера этого не требуется имхо.

Поделиться сообщением


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

Зачем для этого вводить дополнительную глобальную переменную counter если у таймера есть регистры, с помощью которых можно задавать кол-во отсчетов? Вижу смысл в counter только для каких-то специальных нужд, а для задержек с пом-ю таймера этого не требуется имхо.

 

Я так понял, что число в counter определяет количество переполнений таймера (большие задержки, к тому же частота 98 МГц): таймер переполнился - инкрементируем counter и проверяем равенство counter нулю.

Пока не придумал функцию, которая бы запускала таймер на необходимое кол-во раз повторений. При этом ядро должно быть готово отреагировать на другие прерывания и задачи.

Поделиться сообщением


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

Я так понял, что число в counter определяет количество переполнений таймера (большие задержки, к тому же частота 98 МГц): таймер переполнился - инкрементируем counter и проверяем равенство counter нулю.

тогда ясно - большие задержки. Ну вот Вы сами и дали объяснение своего кода. Не нужно в начале обр. прерывания инициализировать counter.

Поделиться сообщением


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

Не пойму почему программа не работает должным образом, если в строке

unsigned int counter = 50;

убрать "= 50".

Ведь есть zz.

Изменено пользователем Radik2

Поделиться сообщением


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

Не пойму почему программа не работает должным образом, если в строке

unsigned int counter = 50;

убрать "= 50".

Ведь есть zz.

не понял вопроса.

 

Можно сделать так:

#define zz 50;
unsigned int counter = zz;

или Вы о том, что когда counter не проинициализирован числом zz, то программа ведет себя странно? В таком случае проследите последовательность изменения переменной counter и представьте, что происходит когда она не проинициализирована числом zz.

Заодно вот Вам задачка: какой будет zz на старте программы после аппаратного сброса МК, если Вы ее не инициализируете? Подсказка: смотреть в какой памяти компилятор разместит эту переменную, можно попросить его ассемблерный листинг сгенерировать.

Поделиться сообщением


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

Можно я свои 5 копеек добавлю? Спасибо.

1) "…таймер переполнился - инкрементируем counter…" всё-таки декрементируем (не придирки ради, а программу пишем)

2) почему не используете точки остановки? на входе в обработчик прерывания? Последующим пошаговый проход сразу показал бы не нужную безусловную инициализацию counter в 50 и что он не менялся меньше 49.

 

Подсказка ;) zz от сброса не зависит - это символическое имя (константа).

Изменено пользователем Obam

Поделиться сообщением


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

 

Увидел вот эти камни случайно: http://ru.aliexpress.com/item/10pcs-lot-P8...2386655890.html

Errata практически пустая. Хорошая замена всяким ATtiny.

Есть у них на сайте генератор кода: http://www.codearchitect.org/nxp/v2/

Не приходилось применять?

Поделиться сообщением


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

Приходилось, на пути от атмела к силабсу. :) Здесь в недрах даже кое-что выкладывал насчёт программатора для них. И генератор кода использовал, и ошибку в нём нашёл. :)

Увы, их сняли с производства, из всей линейки остались только 925 и 936. На смену им пришла серия LPC800 (ядро Cortex-M0, 30 МГц), почти pin-to-pin и с сопоставимой ценой (правда, замена есть только для "мелких" - 915...917, 920...925).

Недостатки серии LPC900 были в отсутствии внутрисхемной отладки и малом объёме памяти в мелких корпусах (SSOP-16 - 2 кБ FLASH, SSOP-20 - 8 кБ, RAM всего 256 байт).

 

Поделиться сообщением


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

Получается, что из МК 51-й серии Silabs предлагает лучшее соотношение качество/цена.

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...