Помогите с прошивкой МК atmega8a C++

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 8
Зарегистрирован: Вт фев 05, 2013 20:50:01

Сообщение ilshat »

Здравствуйте товарищи! Есть код для контроллера на с++(писал не я). т.к. опыта компиляции прошивки у меня нет не могли бы вы мне помочь?
Спойлер

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

#include <mega8.h>  //основной заголовочный файл для ATMega8
#include <stdio.h> //базовые функции ввода-вывода
#include <delay.h> //функция задержки
#define ADC_VREF_TYPE 0x40 //константа для задания источника опорного напряжения АЦП
#define MUX_NUM_MASK 0x0F //маска для защиты 4 старших бит регистра АDMUX от неверного номера ножки входного сигнала АЦП
#define PACK_MASK_6 0x3F //маска бит №0-5 для 6 младших разрядов результата АЦП в 8-битном слове отсылаемого на ПК массива данных
#define PACK_MASK_4 0x3C //маска бит №2-5 для 4 старших -/-
#define PACK_NUM_0 0x00  //идентификаторы байт отсылаемого массива
#define PACK_NUM_1 0x40 
#define PACK_NUM_2 0x80
#define PACK_NUM_3 0xC0
#define REL_1_ON 0x01 //признак работы реле 1
#define REL_2_ON 0x02 //признак работы реле 2

//объявление глобальных переменных
unsigned int adc_data; //переменная для хранения результата АЦП, 16 бит
unsigned char pack[4]; //массив из 4х 8-битных слов для посылки данных через USART
unsigned char n; //счетчик для отправки байтов

void read_adc(unsigned char pin_number) //Функция однократного выполнения АЦП
{
ADMUX = (pin_number & MUX_NUM_MASK) | (ADC_VREF_TYPE & 0xFF); //задание номера ножки входного сигнала
delay_us(60); //пауза для стабилизации входного напряжения на АЦП
ADCSRA |= 0x40; //запуск АЦП 6-м битом
while (!(ADCSRA & 0x10)); //пустой цикл ожидания завершения АЦП (пока 4-й бит не станет = 1)
ADCSRA |= 0x10; //обнуление 4-ого бита записью в него логической 1
adc_data = ADCW; //запись результата АЦП
}

void USART_transmit(unsigned char data) //функция отправки байта через USART
{
while (!(UCSRA & 0x20)); //цикл ожидания опустошения буфера данных UDR (пока 5-й бит регистра URDE не станет = 1)
UDR = data; //помещение данных в буфер, отправка
}

void main(void)
{
//инициализация портов ввода/вывода
//Port B (8 ножек)
DDRB=0x00;      //все ножки = входы
PORTB=0x00;     //на всех ножках логический 0

//Port C (7 ножек)
DDRC=0x00;  //все ножки = входы
PORTC=0x00; //на всех ножках логический 0

//Port D (8 ножек)
DDRD=0x00; //все ножки = входы
PORTD=0x00; //на всех ножках логический 0

//инициализация таймеров/счетчиков
//Timer/Counter 0 - выкл
TCCR0=0x00;
TCNT0=0x00;
//Timer/Counter 1 - выкл
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
//Timer/Counter 2 - выкл
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

//внешние прерывания - выкл
MCUCR=0x00;
//прерывания таймеров/счетчиков - выкл
TIMSK=0x00;
//инициализация USART
//порядок битов в пакете: 8 Data, 1 Stop, No Parity
//Rx (приемник): выкл
//Tx (передатчик): вкл
//режим передачи: асинхронный
//скорость передачи: 9600 бит/с
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x2F;
//аналоговый компаратор: выкл
ACSR=0x80;
SFIOR=0x00;
//инициализация АЦП
ADMUX = (ADC_VREF_TYPE & 0xFF); //источник опорного напряжения АЦП - ножка AVCC, на AREF - конденсатор, выравнивание результата АЦП по правому краю регистра ADCL
ADCSRA=0x87; //АЦП разрешено, циклический режим выключен, запретить прерывание по окончании АЦП, делитель частоты = 128, частота АЦП 57.600 кГц
//разрешить прерывания глобально
#asm("sei")
delay_ms(200);
while (1)   //главный цикл программы
     {
      read_adc(0x05); //АЦП1 - температура
      pack[0] = (adc_data & PACK_MASK_6) | PACK_NUM_0; //1ое слово массива, биты 0-5: 6 младших бит АЦП1
      adc_data = adc_data >> 4; //сдвиг результата АЦП1 на 4 разряда вправо
      pack[1] = (adc_data & PACK_MASK_4) | PACK_NUM_1; //2ое слово массива, биты 2-5: 4 старших бита АЦП1     
      read_adc(0x04); //АЦП2 - положение ИМ
      pack[4] = (adc_data & PACK_MASK_6) | PACK_NUM_2; //3е слово массива, биты 0-5: 6 младших бит АЦП2
      adc_data = adc_data >> 4; //сдвиг результата АЦП2 на 4 разряда вправо
      pack[3] = (adc_data & PACK_MASK_4) | PACK_NUM_3; //4е слово массива, биты 2-5: 4 старших бита АЦП2
     if(!(PINB.0)) pack[3] |= REL_1_ON; //0й бит 4ого слова - состояние реле 1
     if(!(PINB.1)) pack[3] |= REL_2_ON; //1й бит 4ого слова - состояние реле 2     
       for(n=0; n<4 ; n++)
       {
        USART_transmit(pack[n]); //цикл отправки 4х слов 8-битного массива
        delay_ms(20); //пауза между байтами
       }
     }
}
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

компилятор си - не загадка, кодевижин, но в проекте не указана частота работы, исходя из данных по уарту
//режим передачи: асинхронный
//скорость передачи: 9600 бит/с
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x2F;

по моим подсчетам получается 7.372800 МГц
Так действительно задумано ?
Вложения
m8.rar
(46.29 КБ) 136 скачиваний
Контактная информация:
Реклама
Родился
Сообщения: 8
Зарегистрирован: Вт фев 05, 2013 20:50:01

Сообщение ilshat »

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

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

ilshat писал(а):Да так и задумано у меня там кварц такой уже впаян на плате =)как.. если не секрет как вы скомпилировали его? код вроде рабочий но винавр выдавал тучу ошибок..
Избавлю Юру от дополнительных нажатий на баттоны и Вас от мучительного ожидания ответа:
компилятор си - не загадка, кодевижин
аля CVAVR :)
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 8
Зарегистрирован: Вт фев 05, 2013 20:50:01

Сообщение ilshat »

Спасибо! постараюсь разобраться с ним... просто скачал винавр, делал по инструкции... а тут все в ошибках))
Реклама
Ответить

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