roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Сообщение avr123.nm.ru » 10 мар 2006, 01:42

dx40 писал(а):  
Вопрос к профессионалам в СИ

Как ...


Подробно и системно - смотри курс! страница 5 - Си для МК

+ задача 1 курса.

там же отличие:   &&  от  &     и    || от |

wolf писал(а):
PINB.2 - второй бит порта PINB (работает только в CodeVision)


и не со всеми портами!

С какими работает - смотри курс! страница 5 - Си для МК.



===============================================


creatur писал(а):я правильно понял, что

4К hex можно прошить в 2к MK ?  и ни чего не случится?

в смысле должно "фунциклировать"?


Не заморачивайся!

Компилятор знает каков размер памяти используемого МК и выдает после компиляции размер программы относительно размера памяти.

Если прога будет больше то будет ОШИБКА ! не будет HEX'а вообЧе !



===============================================



Книги и Справочники для скачивания и ЧТЕНИЯ

хочу постоветовать извстные мне источники информации по электронике

Огромная библиотека книг по электронике и технике, справочники, некоторые номера журналов

http://www.umup.narod.ru

еще библиотека книг по электронике и технике

http://lord-n.narod.ru/walla.html

======

СУППЕР: «Справочник по полупроводниковым приборам»
ftp://ftp.radio.ru/pub/2005/04/Referenc ... etails.pdf

Автор, Москатов Евгений Анатольевич

«Электронная техника» ftp://ftp.radio.ru/pub/2005/04/Electron ... nician.pdf
тут вся теория полупроводников.

======

С. В. Кийко. Электронный справочник полупроводниковых приборов.
ftp://ftp.radio.ru/pub/2004/04/sprav1.zip
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение North » 10 мар 2006, 10:39

Вобщем ответили, только как-то хаотично. Попробую собрать всё в кучу:
Итак, имеем переменную и бит в ней, который надо установить, сбросить либо проверить. Делаем так:
Код: Выделить всёРазвернуть
#define BitMask 0x10  //Пусть будет четвёртый бит
unsigned char Var;     //та самая переменная

unsigned char CheckBit(void)
{                                  //Та самая проверка, которую делал Карлсон
 return (Var&BitMask);  //за тем исключением, что сравнивать с маской
}          //не обязательно, ибо результат будет либо ноль, либо нет, чего для if()
//вполне достаточно (т. е. функция вернёт либо TRUE, либо FALSE)

void SetBit(void)
{
 Var|=BitMask;  //тут вроде всё просто
}

void ResetBit(void)
{                          //Сначала делаем поразрядную инверсию
 Var&=~BitMask;  //маски, и делаем логическое И с переменной
}

void ToggleBit(void)
{
 Var^=BitMask;   //Исключающее ИЛИ
}

//Проверка бита в программе может быть такой:
void main(void)
{
 if (CheckBit())
   ResetBit();
 else
   SetBit();
 ToggleBit();
}
Аватара пользователя
North
 
Сообщения: 197
Зарегистрирован: 27 июл 2005, 14:12
Откуда: Дмитров, Москва
прог. языки: С, asm

Сообщение avr123.nm.ru » 10 мар 2006, 12:49

wolf писал(а):1) получить энный бит в байте
data&(1<<n)


НЕ ПРАВИЛЬНО !

wolf писал(а):3) сбросить
data |= ~(1<<n);


НЕ ВЕРНО !

========================

Если вы  не знаете точно ЗАЧЕМ вводить спрашивающего в заблуждение ?

Он и так в затруднении - вы хотите его еще более запутать ???

========================

Правильно, подробно и системно - написано например

1) В кратком курсе - Страница 5 - "Си для МК"  + задача 1 курса.

2) в Хелпах компиляторов, и

3) в книгах конечно.



wolf писал(а):if

 else


Я советую (стр. 5 курса) новичкам
ОБЯЗАТЕЛЬНО использовать фигурные скобки   {  }

Код: Выделить всёРазвернуть
if ()
{  


}

 else ()
{  


}
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение avr123.nm.ru » 10 мар 2006, 13:22

North писал(а):Вобщем ответили, только как-то хаотично.


Правильно, подробно и системно - написано например :

1) в Хелпах компиляторов

2) в книгах конечно

3) В кратком курсе - Страница 5 - "Си для МК"  + задача 1 курса.

4) в других курсах и туториалах.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение wolf » 10 мар 2006, 15:56

avr123.nm.ru писал(а):
wolf писал(а):
wolf писал(а):3) сбросить
data |= ~(1<<n);


НЕ ВЕРНО !

Есть такое дело, опечатка вышла. Надо так писать: data &= ~(1<<n);

avr123.nm.ru писал(а):
wolf писал(а):1) получить энный бит в байте
data&(1<<n)

НЕ ПРАВИЛЬНО !

Ну, а тут всё в порядке.
Код: Выделить всёРазвернуть
if (data&(1<<n)) { //бит установлен
 //что-то делаем
}
else { //бит не установлен
 //делаем что-то другое
}
wolf
 
Сообщения: 63
Зарегистрирован: 23 июл 2005, 00:39
Откуда: Казань

Сообщение avr123.nm.ru » 10 мар 2006, 16:10

wolf писал(а):

avr123.nm.ru писал(а):
wolf писал(а):1) получить энный бит в байте
data&(1<<n)


НЕ ПРАВИЛЬНО !


Ну, а тут всё в порядке.


Нет конечно ! НЕ ВЕРНО !

получить бит - значит получить 0 или 1.

а это выражение

data&(1<<n)

даст разные числа, а не только 1 или 0.

значит оно не выделяет 1 бит.

Нужно как в курсе - стр 5.

добавить сдвиг в позицию нулевого бита.  Вот тогда результат будет 1 или 0 только.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение avr123.nm.ru » 10 мар 2006, 16:33

wolf писал(а):получить энный бит в байте

data&(1<<n)


результат этого выражения - все биты нули, а бит n такой каким был в data.

если так:

data &= (1<<n) ;

то "обнулить все биты в data кроме бит n (он не меняется)"
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение wolf » 10 мар 2006, 16:37

это выражение
data&(1<<n)
даст разные числа, а не только 1 или 0.

Совершенно верно; другое дело, что сдвигать нужный бит именно в младший разряд байта в большинстве случаев не нужно.
Выражение data&(1<<n) даст истинное или ложное значение, а это и есть бит информации по определению. Поэтому, если нужно просто тестировать нужный бит, то, добавляя сдвиг, мы увеличиваем прошивку и тратим процессорное время.

если так:
data &= (1<<n) ;
то "обнулить все биты в data кроме бит n (он не меняется)"

Я написал немного по-другому ;)
wolf
 
Сообщения: 63
Зарегистрирован: 23 июл 2005, 00:39
Откуда: Казань

Сообщение creatur » 10 мар 2006, 19:17

Всем привет!

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

А вот скажите ДОКТОР, почему не работает ? ( На реальном МК )
Я попробовал 2 варианта(на самом деле 22,которые сводятся к 2)

Для CodeVisionAVR

Вариант № 1

Код: Выделить всёРазвернуть
/****************************************************

Сhip type           : AT90S2313
Clock frequency     : 4,000000 MHz

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

#include <90s2313.h>

unsigned char TEILER = 0;   // Делитель для точной подгонки частоты до 1Гц
unsigned int SECUNDA = 0;   // Счетчик прошедшего времени после старта
unsigned char PERIODE;      // Переменная для условного перехода    

............
..........


interrupt [TIM0_OVF] void timer0_ovf_isr(void)  // Прерывание по переполнению Таймера_0
{                                              // Таймер досчитал от 12 до 255 выполнилось прерывание
 TEILER++;
 if (TEILER>15)          //  16 Гц/15 Тик-так ~ 1Гц
    {
     SECUNDA++;
     TEILER=0;
   
     if      (SECUNDA<=60) {PERIODE = 1;}
     if  (60<SECUNDA<=120) {PERIODE = 2;}
     if (120<SECUNDA<=180) {PERIODE = 3;}
     
     switch(PERIODE)
      {
        case 1: {if(SECUNDA % 2==0) {OCR1=OCR1+8;}}
        break;
       
        case 2: {OCR1=255;}
        break;
             
        case 3: {if(SECUNDA % 2==0) {OCR1=OCR1-8;}}
        break;
       }
    }
 TCNT0 = 0x0C; // Обновить цикл - записать в счётчик 12
}

...........................


Хотелось получить :
 в первую мин. ШИМ изменяется от 0% до 100 %
 во вторую остаётся на уровне 100%
 в третью изменяется от 100% до 0 %

В действительности:
первые две мин.ничего не происходит  
на 121 сек.(третья мин.) ШИМ скачком становится 100% и дальше как задумано

////////////////////////////////////////////////////////////////////////////////////////


Вариант № 2

Код: Выделить всёРазвернуть
unsigned int P1 = 60
unsigned int P2 = 120
unsigned int P3 = 180
........................


interrupt [TIM0_OVF] void timer0_ovf_isr(void)  // Прерывание по переполнению Таймера_0
{                                              // Таймер досчитал от 12 до 255 выполнилось прерывание
 TEILER=TEILER+1;
 if (TEILER>15)          //  16 Гц/15 Тик-так ~ 1Гц
    {
     TEILER=0;
     SECUNDA=SECUNDA+1;
 [color=blue]
     if (SECUNDA<=P1)    {if(SECUNDA % 2==0) {OCR1=OCR1+8;}}
     if (P1<SECUNDA<=P2) {OCR1=255;}
     if (P2<SECUNDA<=P3) {if(SECUNDA % 2==0) {OCR1=OCR1-8;}}[/color]
         
     }
 TCNT0 = 0x0C; // Обновить цикл - записать в счётчик 12
}

..........................

Если я использую P1 и P2 - работает как задумано,
но стоит добавить строчку
(if (P2<SECUNDA<=P3) {if(SECUNDA % 2==0) {OCR1=OCR1-8;}})
т.е ещё один период ( а нужно ещё больше:7 ) - всё, висим и ничего не происходит...

Где я заблудился?
Помогите ДОКТОР!
Последний раз редактировалось creatur 11 мар 2006, 13:48, всего редактировалось 2 раз(а).
creatur
 
Сообщения: 8
Зарегистрирован: 09 мар 2006, 15:40

Сообщение avr123.nm.ru » 10 мар 2006, 19:25

wolf писал(а):
avr123.nm.ru писал(а):это выражение
data&(1<<n)
даст разные числа, а не только 1 или 0.


Совершенно верно;

другое дело, что сдвигать нужный бит именно в младший разряд байта
в большинстве случаев не нужно.


Дак надо это и писать,
а не "получить энный бит в байте".


wolf писал(а):Выражение

data&(1<<n)

даст истинное или ложное значение, а это и есть
бит информации по определению.


Ну опять НЕ ВЕРНО !

Зачем голову то морочить людям !

=====================

Еще раз повоторяю то что написано на стр. 5 курса:

ПОБИТНЫЕ ЛОГИЧЕСКИЕ ОПЕРАЦИИ & и |  ДАЮТ ЧИСЛО !!!

и конечно это число можно интерпретиролвать по разному, и втом числе как "истина" и "ложь".

=====================

Непосредственно "истина" и "ложь" дают

ЛОГИЧЕСКИЕ ОПЕРАЦИИ  && и ||
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение creatur » 10 мар 2006, 19:27

похоже не вовремя зашёл...    :roll:
Последний раз редактировалось creatur 10 мар 2006, 19:42, всего редактировалось 1 раз.
creatur
 
Сообщения: 8
Зарегистрирован: 09 мар 2006, 15:40

Сообщение avr123.nm.ru » 10 мар 2006, 19:31

Карлсон писал(а):уважаемый avr123.nm.ru!

подумайте, а зачем тогда вообще нужен форум, если все время посылать в адрес курса?


Посмотрите плизззз ...  я послал в курс после ваших ДВУХ неправильных ответа !

Конфа нужна для того чтоб обсуждать что-то, и чтоб делится знаниями, но

не для того чтобы вводить в заблуждение спрашивающего!

Я ни кого не заставляю читать курс - это и не возможно - я лишь говорю что ответ есть там - и он ПРАВИЛЬНЫЙ.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение Deimos » 11 мар 2006, 13:14

creatur писал(а):
if (P2<SECUNDA<P=3) {if(SECUNDA % 2==0) {OCR1=OCR1-8;}})

Где я заблудился?
Помогите ДОКТОР!


Вроде вижу ошибку:if (P2<SECUNDA <= P3)
Аватара пользователя
Deimos
 
Сообщения: 15
Зарегистрирован: 12 янв 2006, 17:41
Откуда: г.Апатиты Мурманская обл.

Сообщение creatur » 11 мар 2006, 13:49

Deimos писал(а):Вроде вижу ошибку:if (P2<SECUNDA <= P3)



А..а  опечатка это ( уже исправил) , в программе конечно же так :
if (P2<SECUNDA <= P3)
creatur
 
Сообщения: 8
Зарегистрирован: 09 мар 2006, 15:40

Сообщение wolf » 11 мар 2006, 13:53

creatur писал(а):Ихнее рвение да на моё б недорозумение... :lol:

Да, признаюсь, что как-то упустил из виду Ваш постинг :)
Для начала разберём выражение a<b<=c, которое Вы применяете в программе. Что оно значит с точки зрения Си?
(a<b)<=c
Если a<b, операция в скобках возвратит 1, и ветвление произойдёт по признаку 1<=c.
Если a>=b, операция в скобках возвратит 0, и ветвление произойдёт по признаку 0<=c.
Оба случая - не то, что нужно автору программы.
Если хотите проверить попадание в диапазон, пишите так:
if (a<b && b<=c) {
...
}
wolf
 
Сообщения: 63
Зарегистрирован: 23 июл 2005, 00:39
Откуда: Казань

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3