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

Микроконтроллеры для начинающих

Подскажите, как в TMR1 перенести число из int переменной ?

 

из С в дизасемблере выглядит так :

 

TMR1H:TMR1L=T_next;

 

  00E7    0879     MOVF 0x79, W
  00E8    008E     MOVWF 0xe

 

т.е переносится 1 байт.

 

UPD. так что ли ?:

 

TMR1L=T_next;

TMR1H=T_next>>8;

 

144:                   TMR1L=T_next;
  00E7    0879     MOVF 0x79, W
  00E8    008E     MOVWF 0xe
145:                   TMR1H=T_next>>8;
  00E9    087A     MOVF 0x7a, W
  00EA    008F     MOVWF 0xf

Изменено пользователем Игорь Кочет

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


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

TMR1H:TMR1L=T_next;

Такого присваивания в языке C нет.

Здесь получилось что TMR1H определилась как метка для оператора goto, а присваивание только TMR1L=T_next;

TMR1L=T_next;

TMR1H=T_next>>8;

Да.

 

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


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

Уже во всем разобрался, пичаль с смыслом команд, использовал лоад вместо sts и наоборот =\

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

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


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

Здравствуйте!

Посмотрите пожалуйста пид регулятор. Написал его на микоС, этот язык только начал осваивать, раньше асм использовал. Пишу для PIC16877A.

Я думаю с ПИДом может возникнуть много заморочек, прошу откликнуться. Ваши комментарии.

//**************** PID *******************************************************

delta_0 = setpoint - Vout; // vi4islenie o6ibki = zadannoe zna4enie - tekuchee

prop_res = delta_0 * Kp; // proporcion-ya sost-ya = o6ibka * Kp

 

dif_res = (delta_1 - delta_0) * Kd; // prediduchaya o6ibka - tekuchaya o6ibka

// mnozennoe na Kd eto est' diff-ya sost-ya

delta_1 = delta_0; // teper' tekuchaja o6ibka v sledujuchem

// cikle budet prediduchej o6ibkoj

int_res += Ki * delta_0; // integral'naja sostavlyajuchaya summiruet

// vse o6ibki, mnozennie na koefficient Ki

if (int_res > int_max) // esli integr-ya sost-ya too big, togda ograni4ivaju

int_res = int_max; // ee dal'nej6ij rost na urovne int_max

else if (int_res < int_min) // esli integr-ya sost-ya too small, togda ograni4ivaju

int_res = int_min; // ee dal'nej6ee umen'6enie na urovne int_min

 

control = int_res + dif_res + prop_res; // control eto upravlyajuchee

// vozdejst-e soderz i,d,p sost-e

if (control > control_max) // esli control too big, togda ograni4ivaju

control = control_max; // ego dal'nej6ij rost na urovne control_max

else if (control < control_min) // esli control too small, togda ograni4ivaju

control = control_min; // ego dal'nej6ee umen'6enie na urovne control_min

// teper' peremenneya control soderzit upravlyajuchee vozdejstvie, kotoroe

// trebuetsya otpravit' v module PWM.

//****************************************************************************

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


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

Доброго времени суток.

Не знаю куда постучаться, начну отсюда, а там куда вывезет ...

Начал что-то делать с AVR-ами, у меня их целых (пока) 2 шт. tiny2313 и mega8, одна mega8 сгорела не выдержав directly подключения

светодиодного индикатора, теперь - только через ограничивающие резисторы.

Повторил несколько чужих конструкций, на стенде, громко сказал :), и в реале.

Пора начать делать что-то своё.

 

Вопросов несколько :

1.Как подружиться с AVR Studio 4.18.716 и WinAVR-20100110, не смог скомпилировать ни одного проекта - ошибка

make: *** [termom8.o] Error -1073741819

когда есть синтаксические ошибки, всё выдает адекватно, а когда всё исправишь - ошибка.

Работаю под WinXP, SET переменные установлены правильно, имена файлов/каталогов - 8.3

2.В CodeVisionAVR (пока работаю в нем) есть "волшебник", который делает базовую программу и инициализирует всё! на МК,

а есть ли необходимость в такой инициализации, ведь МК как-то настроен "по-молчанию", достаточно только скорректировать то,

что нужно для определенной работы, делал тестовый секундомер, настроил входы/выходы для индикатора и таймер для прерывания и

работало. Меньше строк программы - меньше ошибок исправлять :)

Вот собственно вопрос - где-нибудь есть сводная информация как настроен МК "по-молчанию",

т.е. с завода или после полного стирания ?

Некоторые настройки сбивают fuses, когда разбирался с чужим проектом, семь потов сошло :(

Пока почерпнул только, что порты настроены на вход с отключенными подтягивающими резисторами, хотя тоже не уверен, потому как есть

общее управление всеми резисторами сразу, внутренний генератор работает на 8MHz с делением на 8, т.е 1MHz - эти настройки и повторяет

"волшебник"

Что там с таймерами и прерываниями ещё "не въехал".

С английским дружу через словарь, в документации много всего, а выудить нужное пока не смог.

 

Сейчас есть желание сделать на tiny2313 многоточечный термометр (на DS18B20) с выводом на многострочный LCD, подобные конструкции есть,

но они расходуют практически всю программную память МК, а мне нужно еще дополнить функциональности, потому нужно максимально оптимизировать программу, переходить на mega8 не хочется, 8 ножек даром болтаться будут :)

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


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

но они расходуют практически всю программную память МК, а мне нужно еще дополнить функциональности, потому нужно максимально оптимизировать программу, переходить на mega8 не хочется, 8 ножек даром болтаться будут :)

Возьмите mega8 и не обращайте внимание на то что ноги даром болтаются.

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


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

"Значения по умолчанию" возникают в контроллере каждый раз после сигнала RESET. Эти состояния всегда описываются в документации.

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


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

Вот собственно вопрос - где-нибудь есть сводная информация как настроен МК "по-молчанию",

т.е. с завода или после полного стирания ?

после сигнала сброс регистры МК переходят в начальное состояние которое вы можете узнать прочитав соответствующий раздел описания МК внизу под названием регистра(любого) и описания его битов есть строка Initial value. Тоже самое fuse bits описывается в графе Default value.

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


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

Я так понял, что систематизированной информации по предустановленому состоянию МК ни у кого нет.

Ладно, будем копошиться в документации дальше самостоятельно.

Эксперименты изучения МК и его программирования продолжаются ... :)

Удачи всем!

 

C AVRStudio 4 подружился, оказалось, что дома и на работе у меня установлено что-то, что ломает компилятор.

Потому на компьютере сделал виртуальную машину с помошью VMWare, поставил чистую XP от MS в пробном режиме, установил AVRStudio 4 и все работает.

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

Так что, выход есть и Слава Богу.

 

 

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


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

Я так понял, что систематизированной информации по предустановленому состоянию МК ни у кого нет.
Даташит. Систематезированнее некуда. Это во-первых. А во-вторых - лучше не полагаться на на значения по-умолчанию, а прописывать явно все регистры используемой периферии. В большинстве случаем это даже дает меньший код, чем наложение масок по "ИЛИ" и "И".

 

C AVRStudio 4 подружился, оказалось, что дома и на работе у меня установлено что-то, что ломает компилятор.
Телепатируем: "ломает компилятор" - при попытке компиляции make ругается на команды в makefile. Версия: установлен один из проектов Борланда, поэтому при компиляции вызывается его make.exe, который совершенно несовместим по формату makefile c GNU make. Диагонстика: Start->Programs->Acessories->Command line prompt, в командной строке ввести make --version, убедиться, что вызывается make от Борланда.

 

Когда надоест виртуальная машина - поставьте в path путь к WinAVR/utils на первое место, т.е. до пути к Борланду.

 

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


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

C AVRStudio 4 подружился, оказалось, что дома и на работе у меня установлено что-то, что ломает компилятор.

У меня ни дома ни на работе ни на др.компах небыло проблем с AVRStudio , и Борланд у меня какоето время стоял. У вас ХР стоят ?

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


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

Люди, помогите пожалуйста. У меня скоро ГОСы. И в вопросах присутствуют задания по программированию микроконтроллеров PIC на Ассемблере. Может кто-нибудь сможет помочь. Задания такие: 1) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую функцию логического И регистров 20h и 21h, и вызов подпрограммы PRG1, если результат равен нулю. 2) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую логическую функцию исключающего ИЛИ портов А и В и вывод результата в порт С, если он не равен нулю. 3) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую множественное ветвление программы по условию установки в единицу бит 0-3 регистра 20h, с приоритетом от младшего разряда к старшему. 4) Составить алгоритм и программу на языке Ассемблер, реализующую временную задержку t= 10 мкс. для МП типа PIC16C55 при тактовой частоте f = 20МГц. Я понимаю что все задания будет в лом писать. Но хотя бы одно. Заранее спасибо

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


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

Люди, помогите пожалуйста. У меня скоро ГОСы. И в вопросах присутствуют задания по программированию микроконтроллеров PIC на Ассемблере. Может кто-нибудь сможет помочь. Задания такие: 1) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую функцию логического И регистров 20h и 21h, и вызов подпрограммы PRG1, если результат равен нулю. 2) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую логическую функцию исключающего ИЛИ портов А и В и вывод результата в порт С, если он не равен нулю. 3) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую множественное ветвление программы по условию установки в единицу бит 0-3 регистра 20h, с приоритетом от младшего разряда к старшему. 4) Составить алгоритм и программу на языке Ассемблер, реализующую временную задержку t= 10 мкс. для МП типа PIC16C55 при тактовой частоте f = 20МГц. Я понимаю что все задания будет в лом писать. Но хотя бы одно. Заранее спасибо

#1

    list        p=16c55    
    #include    <p16c55.inc>
    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

reg1        EQU    0x20
reg2        EQU    0x21

ORG 0x000       
goto main

main   
movf reg1, 0
andwf !!!Чтобы увидеть продолжение отправь смс с текстом "я обещаю никогда не пытаться устроиться на работу по специальности в дипломе" на номер 1234

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

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


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

Здравствуйте. Недавно начал изучать AVR, почти сразу понадобилось практическое применение. Вот такой вот таймер для мини-оранжереи:

28f46241e02f.gif

Собственно должен выполняться алгоритм:

32cb38c1db70.gif

Единственная проблема с кодом, это то, как сделать такие большие задержки. Проще всего думаю пропускать нужное количество тактов за час, то есть если частота мк 1МГц, восемь часов ожидания будут выглядить так:

__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);

Но наверное это глупо и нецелесообразно. Подскажите, как это можно реализовать на таймерах мк, и насколько большая погрешность у внутреннего генератора мк. Заранее спасибо.

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


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

Но наверное это глупо и нецелесообразно.

Да. Нецелесообразно.

 

 

#define FREQUENCY 11059200
unsigned short MilliSeconds;
unsigned short Seconds;
unsigned char Hour;
#pragma vector=TIMER0_OVF_vect
__interrupt void timer_1khz_isr(void)
{
    if (++Milliseconds>=1000) {
        Milliseconds=0;
        if (++Seconds>=3600) {
            Hour++;
        }
    }
}
void timer1_init(void)
/*
TIMER1 initialize - prescale:1
WGM: 4) CTC, TOP=OCRnA
desired value: 9996Hz
actual value: 9999,277Hz (0,0%)
*/
{
    TCCR1B = 0x00; //stop
    TCNT1H = 0xFB; //setup
    TCNT1L = 0xAF;
    OCR1AH = 0x04;
    OCR1AL = 0x51;
    OCR1BH = 0x04;
    OCR1BL = 0x51;
    OCR1CH = 0x04;
    OCR1CL = 0x51;
    ICR1H  = 0x04;
    ICR1L  = 0x51;
    TCCR1A = 0x00;
    TCCR1B = 0x09; //start Timer
    TIMSK |= (1 << OCIE1A);
}
int main()
{
    timer1_init();
    __enable_interrupt();
    while (1) {
    }
}

насколько большая погрешность у внутреннего генератора мк.

Навеное единицы процентов. Смотрите в datasheet.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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