CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
по формуле из таблицы "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%.
Re: CodeVision AVR в вопросах и ответах
спасибо
вроде разобрался ..
т.е подбором кварца можно снизить ошибку до нуля
т.е подбором кварца можно снизить ошибку до нуля
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Эта ошибка важна только в случае обмена микроконтроллера и компьютера. Если общаются два микроконтроллера, то не важно, соответствует ли скорость стандарту или нет.
Ставим плюсы: )
Re: CodeVision AVR в вопросах и ответах
Здравствуйте люди добрые. Помогите новичку в этом деле. Есть интересное задание "Устройство контроля температуры в двух помещениях. Температурные датчики обоих помещений подключены по интерфейсу 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 в вопросах и ответах
olya0704 писал(а):Вот то, что уже получилось...
смотреть страшно и анализировать влом
я вижу в этом винегрете куски кода, взятые из разных источников(чередование стилей форматирования) тупо накинутые на шаблон
я бы на вашем месте либо начал бы с более простых проектов, либо если так поджимает - отработал бы по отдельности каждый кусок, а потом бы лепил программу
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Re: CodeVision AVR в вопросах и ответах
Ребят а кто нибудь работал c FatFS от мистера чана на codevidion? Я никак не могу разобраться как воткнуть его библиотеку в codevidion. Как я понимаю она только под winavr работает?
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
По моиму в последних версиях она уже "воткнута" осталось только юзать.
«И всё-таки она вертится!»
Re: CodeVision AVR в вопросах и ответах
Я знаю, что там есть какая-то библиотека, а это fat fs что ли???MS24 писал(а):Ребят а кто нибудь работал c FatFS от мистера чана на codevidion? Я никак не могу разобраться как воткнуть его библиотеку в codevidion. Как я понимаю она только под winavr работает?
-
Импульс
- Потрогал лапой паяльник
- Сообщения: 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'
помогите разобрать.
Книга есть в архиве с исходником.
РАзбираю динамическую индикацию с применением прерывания по переполнению таймера
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 скачиваний
Re: CodeVision AVR в вопросах и ответах
Импульс, вникать в чужой код это дело муторное....., лично я делаю так, что и вам советую:
юзаю Atmega 8, тактирую от внутреннего генератора на 8МГц
использую второй таймер
вот его настройки:
в перывании по совпадениют мы выводим нужную нам цифру и зажигаем нужный катод или анод
в перерывании по переполнению мы тушим наши катоды или аноды
вот такой простой алгоритм
юзаю 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 в вопросах и ответах
Скажите пожалуйста :
как проще организовать динамическую индикацию-по переполнению счетчика, или нужно обязательно использовать прерывания?
Есчо прочитал про :
Таймеры-счетчики могут генерировать прерывания по трём видам событий:
- "захват" события;
- сравнение с заданной величиной;
- переполнение.
собираю сам информацию для понимания процесса.
Я только учусь ,не судите строго.
как проще организовать динамическую индикацию-по переполнению счетчика, или нужно обязательно использовать прерывания?
Есчо прочитал про :
Таймеры-счетчики могут генерировать прерывания по трём видам событий:
- "захват" события;
- сравнение с заданной величиной;
- переполнение.
собираю сам информацию для понимания процесса.
Я только учусь ,не судите строго.
Re: CodeVision AVR в вопросах и ответах
прерывание нужно оспользовать обязательно......, в том то и весь смысл чтобы зажигать разряды с определенной частотой
Tell Me The Truth
-
Импульс
- Потрогал лапой паяльник
- Сообщения: 349
- Зарегистрирован: Пн ноя 29, 2010 05:52:05
- Откуда: Иркутск
Re: CodeVision AVR в вопросах и ответах
Код: Выделить всё
TCCR2|= (1 << CS22); // clk/256 - делим основную частоту МК на 256 (предделидель для таймера)
У вас FreshMan ,ошибка, в даташите такого бита нет:CS22
есть бит CS02
или я не прав ...Хочу без пробелов разбиратся.
-
Импульс
- Потрогал лапой паяльник
- Сообщения: 349
- Зарегистрирован: Пн ноя 29, 2010 05:52:05
- Откуда: Иркутск
Re: CodeVision AVR в вопросах и ответах
сейчас напишу простой код как я раньше динамическую индикацию выводил!
Re: CodeVision AVR в вопросах и ответах
это ты смотрел для Т0, а теперь посмотри для Т2
Tell Me The Truth
-
Импульс
- Потрогал лапой паяльник
- Сообщения: 349
- Зарегистрирован: Пн ноя 29, 2010 05:52:05
- Откуда: Иркутск
Re: CodeVision AVR в вопросах и ответах
FreshMan писал(а):это ты смотрел для Т0, а теперь посмотри для Т2
точно
Спойлер
Регистр 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///для чего нужно задействовать эти биты ?