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

Обсуждаем контроллеры компании Atmel.
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

по формуле из таблицы "Table 74. Equations for Calculating Baud Rate Register Setting" или из таблицы "Table 85. Examples of UBRR Settings for Commonly Used Oscillator Frequencies" в datasheet получить значение 3 для UBRR, только учесть, что ошибка скорости будет 8.5%.
Реклама
Аватара пользователя
servo
Встал на лапы
Сообщения: 88
Зарегистрирован: Вс окт 30, 2011 22:52:51

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

Сообщение servo »

спасибо :) вроде разобрался ..
т.е подбором кварца можно снизить ошибку до нуля :)
Реклама
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

Эта ошибка важна только в случае обмена микроконтроллера и компьютера. Если общаются два микроконтроллера, то не важно, соответствует ли скорость стандарту или нет.
Ставим плюсы: )
olya0704
Родился
Сообщения: 1
Зарегистрирован: Пт апр 19, 2013 22:20:18

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

Сообщение olya0704 »

Здравствуйте люди добрые. Помогите новичку в этом деле. Есть интересное задание "Устройство контроля температуры в двух помещениях. Температурные датчики обоих помещений подключены по интерфейсу 1-Wire к одному микроконтроллеру. Как только температура на каком-либо датчике превышает порог, на дисплее должны отобразиться номер помещения и температура. Также следует предусмотреть световую сигнализацию и возможность регулировки порога.". Вот то, что уже получилось...
Спойлер

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

#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include "lcd.h"

// 1 Wire Bus interface functions
#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds18b20.h>

// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS18b20 8
// number of DS1820 devices
// connected to the 1 Wire bus




unsigned char devices;
unsigned char LcdBuffDevices[20];
unsigned char RomCode[2][9];
unsigned char LcdBuff1[20];
unsigned char LcdBuff2[20];
unsigned char ds1820_devices;
// DS1820 devices ROM code storage area,
// 9 bytes are used for each device
// (see the w1_search function description in the help)
unsigned char ds1820_rom_codes[MAX_DS18b20][9];
#asm
   .equ __w1_port=0x15 ;PORTC
   .equ __w1_bit=2
#endasm


void main( void )
{
  lcd_init( 20 );
  lcd_clear( );
   
  devices=w1_search( DS18B20_SEARCH_ROM_CMD, RomCode ); //поиск датчиков на линии 1-wire
   
  if( devices )
  {
   
    ds18b20_init( &RomCode[0][0], 30, 60, DS18B20_12BIT_RES ); //инициализация первого датчика
    ds18b20_init( &RomCode[1][0], 30, 60, DS18B20_12BIT_RES ); //инициализация второго датчика



// Alphanumeric LCD functions
#include <alcd.h>
//Оъявляем глобальные переменные
unsigned char lcd_buffer[20], numb;
unsigned char temp1, temp2, tmin = 25;
#asm("sei")
// Прерывание по переполнению таймера/счетчика 0 (в теле прерывания прописываем обработку нажатия кнопок)
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
 if(!PINC.4) {
        delay_ms(100);
        if(!PINC.4) {
                tmin++;
                sprintf(lcd_buffer, "tmin=%d", tmin);
                lcd_gotoxy(0,1);
                lcd_puts(lcd_buffer);
        }
 }           
 
 
 if(!PINC.3) {
        delay_ms(100);
        if(!PINC.3) {
                tmin--;
                sprintf(lcd_buffer, "tmin=%d", tmin);



// Place your code here

}

// Declare your global variables here


{
// Declare your local variables here

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

// Port C initialization
// Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=Out Func0=In
// State6=P State5=0 State4=P State3=P State2=T State1=0 State0=T
PORTC=0x58;
DDRC=0x22;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 187,500 kHz
TCCR0=0x03;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

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

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// 1 Wire Bus initialization
// 1 Wire Data port: PORTC
// 1 Wire Data bit: 2
// Note: 1 Wire port settings are specified in the
// Project|Configure|C Compiler|Libraries|1 Wire menu.
w1_init();

// Глобальное разрешение прерываний
#asm("sei")

// Основной цикл программы
while (1)

      {temp1=ds18b20_temperature( &RomCode[0][0] ), temp2=ds18b20_temperature( &RomCode[1][0] ); // Считываем температуру с датчиков ds13b20
      if (temp1 > tmin, temp2 > tmin) 
            {lcd_init(20);
            sprintf(lcd_buffer, "tmin=%d", tmin); // Формируем строку
            lcd_gotoxy(0,1); // Помещаем курсор на 0-й символ нижней строкм
            lcd_puts(lcd_buffer); // Вывод строки

      continue;}
       else {
      // Сравниваем температуру с порогом, включаем или выключаем обогреватель
      if (temp1 > tmin) {PORTC.0 = 0,PORTC.5 = 1;
            lcd_init(20);
            sprintf(lcd_buffer, "1 комната, t=%d", temp1); // Формируем строку
            lcd_gotoxy(0,1); // Помещаем курсор на 0-й символ нижней строкм
            lcd_puts(lcd_buffer);} // Вывод строки
      else {PORTC.0 = 1,PORTC.5 = 0,temp2=ds18b20_temperature( &RomCode[1][0] );
      if (temp2 > tmin) {PORTC.1=0, PORTC.5=1;
            lcd_init(20);
            sprintf(lcd_buffer, "2 коьната, t=%d", temp2); // Формируем строку
            lcd_gotoxy(0,1); // Помещаем курсор на 0-й символ нижней строкм
            lcd_puts(lcd_buffer);} // Вывод строки
      else  {PORTC.1=1, PORTC.5=0};}
     
      };
}

// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds1820_devices=w1_search(0xf0,ds1820_rom_codes);

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters/line: 16
lcd_init(16);

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

while (1)
      {
      // Place your code here

      }
}}}}}



тут есть ряд ошибок, особенно в конце, но незнание правил пунктуации языка не дает шансов это исправить...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

olya0704 писал(а):Вот то, что уже получилось...

смотреть страшно и анализировать влом

я вижу в этом винегрете куски кода, взятые из разных источников(чередование стилей форматирования) тупо накинутые на шаблон

я бы на вашем месте либо начал бы с более простых проектов, либо если так поджимает - отработал бы по отдельности каждый кусок, а потом бы лепил программу
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
MS24
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

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

Сообщение MS24 »

Ребят а кто нибудь работал c FatFS от мистера чана на codevidion? Я никак не могу разобраться как воткнуть его библиотеку в codevidion. Как я понимаю она только под winavr работает?
Реклама
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

По моиму в последних версиях она уже "воткнута" осталось только юзать.
«И всё-таки она вертится!»
MS24
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

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

Сообщение MS24 »

MS24 писал(а):Ребят а кто нибудь работал c FatFS от мистера чана на codevidion? Я никак не могу разобраться как воткнуть его библиотеку в codevidion. Как я понимаю она только под winavr работает?
Я знаю, что там есть какая-то библиотека, а это fat fs что ли???
Импульс
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Пн ноя 29, 2010 05:52:05
Откуда: Иркутск

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

Сообщение Импульс »

Здравствуйте!
РАзбираю динамическую индикацию с применением прерывания по переполнению таймера
Timer 0
по книги: М.С.Голубцов Микроконтроллеры AVR от простого к сложному.
стр 131.
В этой книге расписан пример без особого пояснения,и при компилировании
вылетают ошибки:
can't open #include file: HG.h
undefined symbol 'HG12'
undefined symbol 'N'
undefined symbol 'init_HG'
помогите разобрать.
Книга есть в архиве с исходником.
Вложения
динамическая индикация2313.rar
(203.43 КБ) 150 скачиваний
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Импульс, вникать в чужой код это дело муторное....., лично я делаю так, что и вам советую:
юзаю Atmega 8, тактирую от внутреннего генератора на 8МГц
использую второй таймер
вот его настройки:

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

// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2|= (1 << WGM20) | (1 << WGM21);  // Fast PWM mode
TCCR2|= (1 << CS22);                // clk/256 - делим основную частоту МК на 256 (предделидель для таймера)
TCNT2=0x00;
OCR2=0x00;


в перывании по совпадениют мы выводим нужную нам цифру и зажигаем нужный катод или анод
в перерывании по переполнению мы тушим наши катоды или аноды

вот такой простой алгоритм
Tell Me The Truth
Импульс
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Пн ноя 29, 2010 05:52:05
Откуда: Иркутск

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

Сообщение Импульс »

FreshMan писал(а):Импульс, вникать в чужой код это дело муторное....., лично я делаю так, что и вам советую:
юзаю Atmega 8, тактирую от внутреннего генератора на 8МГц
использую второй таймер
вот его настройки:

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

// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2|= (1 << WGM20) | (1 << WGM21);  // Fast PWM mode
TCCR2|= (1 << CS22);                // clk/256 - делим основную частоту МК на 256 (предделидель для таймера)
TCNT2=0x00;
OCR2=0x00;


в перывании по совпадениют мы выводим нужную нам цифру и зажигаем нужный катод или анод
в перерывании по переполнению мы тушим наши катоды или аноды

вот такой простой алгоритм

в моём коде ,расписаны все строчки(регистры,переменные и тд.) :))
автор книги не писал я думаю тяп-ляп -но в итоге ошибок куча.
Код то не большой,может мне надо библиотеки подгрузить ?
Последний раз редактировалось Импульс Вс апр 28, 2013 10:41:58, всего редактировалось 1 раз.
Импульс
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Пн ноя 29, 2010 05:52:05
Откуда: Иркутск

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

Сообщение Импульс »

.
Последний раз редактировалось Импульс Сб апр 27, 2013 20:15:11, всего редактировалось 1 раз.
Импульс
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Пн ноя 29, 2010 05:52:05
Откуда: Иркутск

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

Сообщение Импульс »

.
Последний раз редактировалось Импульс Сб апр 27, 2013 20:14:33, всего редактировалось 1 раз.
Импульс
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Пн ноя 29, 2010 05:52:05
Откуда: Иркутск

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

Сообщение Импульс »

Спойлер#include <90s2313.h>
#include <HG.h>
interrupt [TIM0_0VF]void timer0_ovf_isr(void)
{
TCNTO=0xFF;
HG12();
}
interrupt [TIM1_0VF]void timer1_ovf_isr(void)
{
TCNT1H=0xf0;
TCNT1L=0xbe;
N++;
if(N==20) N=0;

}
void main(void)
{


unsigned int temp,temp1,temp2;
PORTB=0x00;
DDRB=0xFF;
PORTD=0x00;
DDRD=0x00;
//Timer/Counter 0 initialization
//Clock source: System Clock
//Clock value: 3906 kHz
//Mode: Output Compare
//OCD output: Disconnected
TCCR0=0x05;
TCNT0=0xFF;

TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xf0;
TCNT1L=0xbe;
OCR1H=0x00;
OCR1L=0x11;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x82;
ACSR=0x80;
#asm("sei")
init_HG();
N=0;
while (1)
{};}



FreshMan писал(а):
в перывании по совпадениют мы выводим нужную нам цифру и зажигаем нужный катод или анод
в перерывании по переполнению мы тушим наши катоды или аноды

Подскажите ,для запуска совпадения ,прерывания и переполнения нужны импульсы внешних или внутренних источников.
Здесь не могу понять...
Импульс
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Пн ноя 29, 2010 05:52:05
Откуда: Иркутск

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

Сообщение Импульс »

Скажите пожалуйста :
как проще организовать динамическую индикацию-по переполнению счетчика, или нужно обязательно использовать прерывания?
Есчо прочитал про :
Таймеры-счетчики могут генерировать прерывания по трём видам событий:
- "захват" события;
- сравнение с заданной величиной;
- переполнение.
собираю сам информацию для понимания процесса.
Я только учусь ,не судите строго. :))
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

прерывание нужно оспользовать обязательно......, в том то и весь смысл чтобы зажигать разряды с определенной частотой
Tell Me The Truth
Импульс
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Пн ноя 29, 2010 05:52:05
Откуда: Иркутск

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

Сообщение Импульс »

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

TCCR2|= (1 << CS22);                // clk/256 - делим основную частоту МК на 256 (предделидель для таймера)


У вас FreshMan ,ошибка, в даташите такого бита нет:CS22
есть бит CS02 :dont_know: или я не прав ...
Хочу без пробелов разбиратся.
Импульс
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Пн ноя 29, 2010 05:52:05
Откуда: Иркутск

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

Сообщение Импульс »

сейчас напишу простой код как я раньше динамическую индикацию выводил!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

это ты смотрел для Т0, а теперь посмотри для Т2
Tell Me The Truth
Импульс
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Пн ноя 29, 2010 05:52:05
Откуда: Иркутск

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

Сообщение Импульс »

FreshMan писал(а):это ты смотрел для Т0, а теперь посмотри для Т2

точно :oops:
СпойлерРегистр TCCR2:
•bit7 FOC2 - принудительное изменение уровней на выводе ОС2
•bit6 WGM20 - бит настройки режима генератора. Работает в паре с bit3
•bit5 COM21 - бит управления контактом ОС2 (PB3). Работает в паре с bit4
•bit4 COM20 - бит управления контактом ОС2 (PB3). Работает в паре с bit3
•bit3 WGM21 - бит настройки режима генератора. Работает в паре с bit6
•bit2 CS22 - бит настройки предделителя
•bit1 CS21 - бит настройки предделителя
•bit0 CS20 - бит настройки предделителя


•bit6 WGM20 - бит настройки режима генератора. Работает в паре с bit3
•bit3 WGM21 - бит настройки режима генератора. Работает в паре с bit6///для чего нужно задействовать эти биты ?
Ответить

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