CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Аватара пользователя
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Сообщение pashaumnov »

с наработающим проэктом разобрался))) у меня програмно были подключены подтягивающие резисторы ., поэтому светодиод горел постоянно. осталась последняя задача , снизить энерго потребление. помогите реализовать
Спойлер/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 16.11.2013
Author :
Company :
Comments:


Chip type : ATtiny13
AVR Core Clock frequency: 9,600000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/

#include <tiny13.h>
unsigned int counter;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(++counter > 732) PORTB.4= 0; // если истекли 20 сек

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=Out Func3=In Func2=Out Func1=Out Func0=Out
// State5=T State4=0 State3=T State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x17;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9,375 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
if(PINB.3) // если вход == 1
{
counter= 0; // сбрасываем счетчик
PORTB.4= 1; // устанавливаем порт в "1"
}
};

}
принцып такой после того как таймер благополучно осчитал свое время 20 сек и если на pinb3 за это время не появилась лог 1 то таймер должен уснут. а при появлении лог1 на этом пине должен пробудить его . или пробуждать придется pinb0?? так как на тини 13 там находится INTo, кажется она вызывает из глубокого сна.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Надо разрешить режим сна и организовать выход из него по прерыванию. На прерывание повесить кнопку.
Docendo discimus
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 101
Зарегистрирован: Пт май 10, 2013 15:56:40

Сообщение kaschak »

Здравствуйте. При попытках создания прошивки возникли вопросы:
1. Как поведёт себя контроллер если во время задержки(delay) произойдёт прерывание, просто попадалась информация что это не хорошее явление.
2. Как посчитать количество тактов которое уходит на прерывание(да и вообще на любой кусок программы) включая время входа и выхода из прерывания.
3. Частота АЦП - как её определить, просто есть делители для частоты АЦП, но на одно преобразование нужно 13 тактов, так вот в чём вопрос - нужно 13 тактов на которых работает контроллер, 13 тактов которые получились от деления частоты контроллера на коэффициент деления для АЦП, или частота преобразования ацп - это то что получилось после деления частоты контроллера на делитель ацп. Короч нужно точно определиться с тем - какая реальная частота преобразования ацп (скоко раз в секунду он сможет измерить сигнал).
Будьте добры, подскажите начинающему ответы на такие вопросы.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

1. Поведет себя как ему и дОлжно - управление передастся в прерывание. Благодаря этому возрастет задержка, определенная в delay.
2. Воспользоваться отладчиком.
3. Проще сделать ловушку-счетчик: задать время 1 сек и при каждом считывании из АЦП наращивать обнуленный прежде счетчик. По истечении секунды посмотреть значение этого счетчика.
Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Сообщение Amstron »

Привет!
Подскажите, какой ram globan variables size может быть максимальный в моем микроконтроллере для меги 168?
Значит так: если кое что удаляю (с измерением температуры связанно), то ram globan variables size равно 199 байт и работает отлично, не зависает.

А вот если ни чего не удалять, то ram globan variables size равно 384 байт. Виснет!!!

Во флеш переменные у меня есть.


работаю в CVAVR :-):

сейчас уменьшил до 259, тоже виснет...
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Сообщение pashaumnov »

На прерывание повесить кнопку.
прерывание должно происходить при 1 на пине входа, котоый используется для запуска таймера.это можно сделать?? и разрешить сон -asm (sleep) так надо написать а в конце программы написать sleep?? или в окне где порты и таймер задаю можно выставить???
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 101
Зарегистрирован: Пт май 10, 2013 15:56:40

Сообщение kaschak »

pyzhman писал(а): 2. Воспользоваться отладчиком.
Подскажите тогда пожалуйста и отладчик для CVAVR, а то отладчик в моей голове за не достаточным знанием не справляется со всем.
pyzhman писал(а): 3. Проще сделать ловушку-счетчик: задать время 1 сек и при каждом считывании из АЦП наращивать обнуленный прежде счетчик. По истечении секунды посмотреть значение этого счетчика.
Счётчик это хорошо, но мне надо бы почаще значения считывать, до нескольких десятков килогерц желательно. Хотя считывать надо с 2х каналов наверно тяжеловато будет. Потянет ли atmega8L 20кГц АЦП(в смысле 20.000 преобразований в секунду) на 8МГц частоте работы?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Сообщение Garin »

Подскажите как изменить выражение.

Код: Выделить всё

suns=PINC & 0b00000011; считываем состояние ножек 0 и 1 порта C. 
А мне нужно считывать состояние в suns с портов PINC.0 и PINB.2
Пытался как то так suns=PINC.0 & PINB.2;
Никак не пойму как можно это решить.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

kaschak писал(а):Подскажите тогда пожалуйста и отладчик для CVAVR, а то отладчик в моей голове за не достаточным знанием не справляется со всем.
Так это как бэ AVRStudio 4 отладчик... Об этом вроде даже при установке CVAVR говорится.
kaschak писал(а):Потянет ли atmega8L 20кГц АЦП(в смысле 20.000 преобразований в секунду) на 8МГц частоте работы?
Сделайте запуск преобразования АЦП по таймеру. И подберите делитель, чтобы частота АЦП была больше 260кГц
Garin писал(а):А мне нужно считывать состояние в suns с портов PINC.0 и PINB.2
Никак не пойму как можно это решить.
А про битовые операции слышали?

Код: Выделить всё

suns=(PINC & 0b0  0  0 0 0 0 0  1)|(PINB&0b00000100)
//             |  |  | | | | |  | 0
//             |  |  | | | | L__ 1 
//             |  |  | | | L____2
//             |  |  | | L_____3
//             |  |  | L______4
//             |  |  L_______5
//             |  L_________6
//             L___________7
//Здесь биты нумеруются начиная с нуля справа налево       
Этот вопрос больше относится к основам языка си, а никак не к CVAVR читайте азбуку Керниган и Риччи
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

pashaumnov писал(а):это можно сделать?
Конечно можно. Прописывать ручками в том месте программы, где нужно засыпать.
Docendo discimus
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

НЕ понимаю как объявить . Мне нужна переменная флагов , биты в которой я хочу проверять и устанавливать независимо.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ILYAUL писал(а):НЕ понимаю как объявить.
Что объявить ? Переменную ?
http://rubydev.ru/2012/05/variables-and ... ypes-in-c/
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

ILYAUL писал(а): Мне нужна переменная флагов , биты в которой я хочу проверять и устанавливать независимо.
так делаю:

Код: Выделить всё

#define SETBIT(x,y) (x |= (y))  // Set bit y in byte x
#define CLRBIT(x,y) (x &= (~(y)))// Clear bit y in byte x
#define CHKBIT(x,y) (x & (y))   // Check bit y in byte x
#define TOGGLEBIT(x,y) (x^=y) // Toggle bit y in byte x


unsigned char Flags;

#define UPD     1<<0
#define NOIND   1<<1
#define BLINK   1<<2
#define POFF    1<<3

//пример использования
TOGGLEBIT(Flags, BLINK);
........
if(!CHKBIT(Flags, BLINK))
{
}
......
SETBIT(Flags, UPD);
......
while(!CHKBIT(Flags,UPD));
CLRBIT(Flags,UPD);
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

СПАСИБО!!! Врубился.
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

помогите с занесением времени в еепром.
есть функция записи

Код: Выделить всё

void writeData(unsigned char read){ 
if (page_stop_status==1)  {
i2c_start(); 
i2c_write(0xa0);
i2c_write(addr>>8); 
i2c_write(addr & 0x00FF); 
page_stop_status=0;     }

i2c_write(read); 
 
addr++; 
pageSize++;  
if (pageSize==128) {
pageSize=0; 
page_stop();
 }   
} 
ну и собственно как я хочу записать время в еепром
, в терминал выводит а в еепром не пишет время

Код: Выделить всё

unsigned char times;
times=printf("%d:%d:%d" ,hours, minutes, seconds);
writeData(times);
помогите пожалуйста.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

kotriks писал(а):помогите пожалуйста.
Эх, я как раз кофе заварил, сижу пью. Оставлю немного для гущи...

А пока начнём издалека. Микросхему памяти припаяли к МК ?
Контактная информация:
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

да всё собранно.
если делать
writeData(hours);
writeData(minutes);
writeData(seconds);
то заносит но в бинарном, если читать через юарт память то времени не видно нужен софт спец писать с формулой расшифровки, можно же сделать както чтобы писал не в бин а сразу как есть время 00:00:00 по принтиф то выводит же.
Последний раз редактировалось kotriks Ср ноя 20, 2013 09:28:03, всего редактировалось 2 раза.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Питание подали на память ?:)
ЗЫ: Негоже править посты после ответа на него другим участником :)
заносит но в бинарном
Это как понять ? Данные в памяти всегда хранятся в бинарном виде (в виде нулей и единичек) !
Контактная информация:
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

Аlex писал(а):Питание подали на память ?:)
ЗЫ: Негоже править посты после ответа на него другим участником :)
заносит но в бинарном
Это как понять ? Данные в памяти всегда хранятся в бинарном виде (в виде нулей и единичек) !
всё подали.
пс. вас небыло я поправил :)
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Меня то не было, но пост то мой уже был после Вашего :)
ЗЫ: И не цитируйте полностью предыдущее сообщение, а то придут злые модераторы и порубают Вас шашкой на колбаску :)
Контактная информация:
Ответить

Вернуться в «AVR»