Так же немного в другой программе при попытке инициализировать прерывание по таймеру на каждую строчку выдает ошибку . программа полностью была скопирована с учебника.
TCCR1A=0x0;
TCCR1B=0xD;
TCNT1H=0x0;
TCNT1L=0x0;
OCR1AH=0xF;
Но есть файлы с дефайнами для всех регистров (или почти всех) для каждого контроллера. Подключите его. По сути io.h в avr studio это и делает, а вы ручками, ручками...
Так,для общего развития,откройте файл с дефайнами (можно даже обычным блокнотом),и посмотрите что там понаписано. Думаю первоночальный вектор разбора "почему неработает" будет дан
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Я уже окончательно запутался. Каким то образом сделал что бы программа работала, но при этом прерывание по таймеру не работает вообще.
Можете подсказать как правильно написать программу с прерыванием по таймеру для вывода например числа 111 на семисегментный индикатор. Использую атмегу8. И какие дополнительные файлы нужно иметь кроме стандартного кодевижена. Могут ли быть проблемы из-за расположения проекта в другой директории чем сама программа кодевижен?
для 7-сегментной индикации нужно или взять библиотеку,или (что в учебных целях предпочтительней)сделать ее самому.Почти не важно на каком контроллере ее будете применять.
#define _1 _B|_C ;что-бы светилась 1-ка,нужно подать напряжение на ноги _B и _C
....
#define _8 _A|_B|_C|_D|_E|_F|_G ;на эти ноги подаем лог.1 , что-б светилась 8-ка
#define _OFF 0 ;что-бы потушить все сегменты надо на все ноги порта выдать 0
......
....
#define _SEG PORTB ;за управлением сегментов отвечает порт В
Теперь что-бы зажечь светодиоды с ОА в виде цифры 1,нужно просто прописать
такую строчку:
_SEG = _1 ; ноги в портВ отвечающие за сегменты _В и _С станут лог. 1-ками
сделай сначала такую фиговинку для всех цифр,потом дальше копать будем
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
За основу взял то что снизу. Заработало, только у меня частота проца ниже и видно мерцание. (частоту не повышу так как использую без кварца) Где подправить что бы не мерцало? Зачем в "выборе" стоит delay_ms(5), возможно ли обойтись без нее? Если да, то как исправить программу?
#include <mega8.h>
#include <delay.h>
unsigned int amper_out=0;
unsigned int volt_out=0;
unsigned int temp=0;
void amper_print(unsigned char data){
unsigned char i; //Функция вывода тока
unsigned char temp1;
if (cur_dig == 0) // это если в первом знакоместе
{
temp1 = buf[data] & ~(1<<0); // берем символ из массива и добавляем бит точки
}
else
{
temp1 = buf[data]; // иначе - не трогаем ничего, берем символ из массива
}
for( i=0; i<8; i++){ //Цикл для вывода 8 бит данных из массива
PORTD.0 = temp1 & 1<<i ; //Выводим в линию DATA текущий бит
PORTD.1=0; //Опускаем линию CLK в лог.0
PORTD.1=1; //Поднимаем линию CLK в лог.1
}
}
void volt_print(unsigned char data){
unsigned char i; //Функция вывода тока
unsigned char temp1;
if (cur_dig == 1) // это если в первом знакоместе
{
temp1 = buf[data] & ~(1<<0); // берем символ из массива и добавляем бит точки
}
else
{
temp1 = buf[data]; // иначе - не трогаем ничего, берем символ из массива
}
for( i=0; i<8; i++){ //Цикл для вывода 8 бит данных из массива
PORTD.6 = temp1 & 1<<i ; //Выводим в линию DATA текущий бит
PORTD.7=0; //Опускаем линию CLK в лог.0
PORTD.7=1; //Поднимаем линию CLK в лог.1
}
}
Обработчик прерывания по переполнению Т2 медлнно работает(всмысле событие происходит редко),
надо например режим СТС заюзать вместо OVF,что-б чаще вызывался.
А делеи нужны что-б фонарики хоть по чуть-чуть успели посветить прежде чем померкнут
Эта программулина применяется походу с 16разрядным сдвиговым регистром,отвечающим за сегменты.
Вы разобрались как эта ваша "основа" работает?
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Если долго мучатся, то что нибудь получится. Поудалял все лишнее и сделал счетчик. Ошибка была в том что я подавал новый сигнал на ноги индикатора не потушив его перед этим, что вызвало затерание, так же в самом первоначальном коде в "выборе" при сравнении числа, получалось что последняя цыфра светилась в три раза дольше чем остальные что приводило к мерцанию, либо не одинакового свечению цыфр. Вот что у меня получилось.
#include <mega8.h>
#include <delay.h>
unsigned int nom=0;
unsigned int nom1=0;
volatile int cur_dig ;
Я недоволен -
0b11000000, //0
0b11111001, //1
Залей все это дело в макросы.Потому-что завтра тебе понадобиться к другим ногам перепаять или с ОА дисплей использоать.Придется помучиться немного лишний раз
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Впринцыпе это пока не столь важно, и так уже перепаевал 20 раз. У меня стоят теперь удобные разьемы к которым можно легко менять провода. Хотя завтра попробую написать под макросы, еще не имел с таким делом. Так же только что нашел в уголку ЖКИ wh1602d-yyk-ctk, буду пробовать его использовать. Так что думаю завтра вопросы появятся новые.