Обсуждаем контроллеры компании Atmel.
Ответить

Atmega8515 - Частотомер, работающий на Atmega8

Пт авг 24, 2012 18:11:19

Код:
#include "mega8515.h"
#asm
.equ __lcd_port=0x18
#endasm
#include "lcd.h"
#include "delay.h"

typedef unsigned char byte;
typedef unsigned long ulong;

flash byte txt[]="freq:";

byte ovf; //Счетчик переполнений таймера
byte i;
byte buff[17]; //Буфер LCD
ulong freq;

interrupt [TIM1_OVF] void tmr1_ovf() {
    ovf++; //Считаем сколько было переполнений
}

void main(){
    TCCR1A=0;
    TCCR1B=0;
    TIMSK=4;
    ACSR=0x08;
    lcd_init(16);
    #asm("sei")
    buff[16]=0;
    while (1) {
        ovf=0; //Обнуляем
        TCNT1=0;
        TCCR1B=7; //Включаем счетчик с внешним генератором, пин T1

        //Сдесь надо выдержать секунду
        //Для примера просто воспользовался delay_xx
        //На самом деле для этого лучше использовать второй счетчик
        delay_ms(999);
        delay_us(239);

        TCCR1B=0; //Выключаем счетчик
        freq=(ulong)ovf*65536+TCNT1; //Подсчитываем сколько насчитали
        i=16;
        do { //Переводим бинарное число в десятичное
            i--;
            buff[i]=freq%10+0x30;
            freq/=10;
        } while(freq!=0);
        do { //Заполняем дальше буфер
            i--;
            if (i<((sizeof txt)-1)) {
                buff[i]=txt[i];
            }else{
                buff[i]=' ';
            }
        } while(i!=0);
        lcd_clear();
        lcd_puts(buff);
    }
}

Подправил циферки: 8 на 8515. ПРоект компилится без ошибок. На протеусе на дисплее в рабочем проекте выдает freq: xxx, а тут выдает 0. Подключал все пины оставшиеся, ничего не помогает. А я не очень разобрался, как определяется вход частотомера, почему у меня может не работать?

Re: Atmega8515 - Частотомер, работающий на Atmega8

Пт авг 24, 2012 19:11:27

Вы не так регистры настраиваете,читайте даташит!

Re: Atmega8515 - Частотомер, работающий на Atmega8

Пт авг 24, 2012 19:19:27

kras писал(а):Подправил циферки: 8 на 8515.

Неа.... Проект надо заново в генераторе кода собирать.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Пт авг 24, 2012 21:14:54

Полдела получилось, действительно нужно было в описании проекта нужно поменять модель. Но теберь другая проблема. Я все подключил, вроде, как (проект-оригинал: http://my-avr.at.ua/publ/prostoj_primer_chastotometra/1-1-0-59", в протеусе запускал с мк8515 и переделанной прошивкой, все норм, а как спаял, дисплей не выдает признаков жизни. Я протестировал, напряжения есть на RS и RW, а в чем проблема? Как протестировать, работает ли дисплей вообще? Насчет подключения дисплея: там 16 ножек, я сравнил пару даташитов других LCD, везде одна распиновка. По аналогии сделал и для своего LCD. К LCD всего подключил 4(data)+3(управление)+2(питание)выводов, может нужно еще что задействовать?

Промежуточная проблема: у 8 и 8515 одинаковый размер eprom 512, но писало при прошивке, что код не умещается, я залил во flash, но может я на этом месте скосячил, и что-то надо было и в eprom записать? Немножко путаюсь, просто, где лежит программа, а где данные, может напутал?

Затем понял, что нужен adjustment, просто присоединил его к батарейкам на 5В. Не хочет работать. Что еще может быть не то?

Зы, кварц не ставлю, может на 8МГц надо что-то регулировать, чтобы мк правильно работал?
Последний раз редактировалось kras Пт авг 24, 2012 23:29:33, всего редактировалось 1 раз.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Пт авг 24, 2012 23:29:00

kras писал(а): Я все подключил, вроде, как (проект-оригинал: http://my-avr.at.ua/publ/prostoj_primer_chastotometra/1-1-0-59", в протеусе запускал с мк8515 и переделанной прошивкой, все норм, а как спаял, дисплей не выдает признаков жизни. Я протестировал, напряжения есть на RS и RW, а в чем проблема? Как протестировать, работает ли дисплей вообще? Насчет подключения дисплея: там 16 ножек, я сравнил пару даташитов других LCD, везде одна распиновка. По аналогии сделал и для своего LCD. К LCD всего подключил 4(data)+3(управление)+2(питание)выводов, может нужно еще что задействовать?

Обязательно смотрите даташит на ваш индикатор. Цоколевки бывают разные. Перепутаете + и - получите трупик. Надо подключить подстроечный резистор на контрастность иначе ничего не покажет. Короче еще раз даташит.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Пт авг 24, 2012 23:40:25

подстроечный резистор на контрастность
А как так? Если КЗ с питанием сделать, чем это будет отличаться от крайнего положения реостата? Ну понятно, что ток другой, можно подробнее? JM161B-RN, Datasheet уже нашел, но непонятно.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Сб авг 25, 2012 12:38:40

Не получается подключить, ничего не пишет!

Re: Atmega8515 - Частотомер, работающий на Atmega8

Сб авг 25, 2012 21:21:11

kras писал(а):
подстроечный резистор на контрастность
А как так? Если КЗ с питанием сделать, чем это будет отличаться от крайнего положения реостата? Ну понятно, что ток другой, можно подробнее? JM161B-RN, Datasheet уже нашел, но непонятно.

Вы хоть поняли что написали и что спрашиваете? Я не понял. Какие КЗ? Какие токи?
Я вам сказал подключить резистор на контрастность, а как все есть в даташите.
Если к выводу контрастности ничего не подключено, то индикатор ничего и не покажет.
Если соединить с питанием + или - , то либо ничего не покажет, либо черные квадраты.

Посмотрел pdf. Голимый листок, по нему и не разберетесь как подстроечный подключить. Смотрите у других производителей и проявите смекалку. Больше не покупайте таких голимых индикаторов. На рынке есть нормальные, с нормальной документацией.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Вс авг 26, 2012 15:23:32

Если соединить с питанием + или - , то либо ничего не покажет, либо черные квадраты.

Я не могу понять, почему просто с + нельзя соединить? Сейчас попробую резистор, просто у меня только на 10кОм

Re: Atmega8515 - Частотомер, работающий на Atmega8

Вс авг 26, 2012 17:50:10

Нет, не помогает, долго шаманил над схемой. Сначала после беспомощности резистора понял, что питание не на ту ножку мк подается (а программатор типо шил!), исправил, и не помогло. Потом снова подключил недавно убранное внешнее питание 5В. Потом понял, что прошиваю фьюзы, забыл их снять. Поставил новый мк, не помогло. Может не настроил тактовый генератор? А у резистора переменного 10кОм сопротивление по-равному поделено.

Почему-то еще проблема: даже когда ставлю новый непрошитый мк (у меня их много:D), на PORTC есть единицы все-равно. Как-будто они подаются с дисплея. Короче, пока ничего так и не понял, вообще не получается хоть как-то дать жизнь to LCD.
И еще так и не понял насчет PROM - туда надо что-нибудь заливать? Или программа хранится во FLASH?

Re: Atmega8515 - Частотомер, работающий на Atmega8

Пн авг 27, 2012 14:03:17

kras писал(а):Нет, не помогает, долго шаманил над схемой. Сначала после беспомощности резистора понял, что питание не на ту ножку мк подается (а программатор типо шил!), исправил, и не помогло. Потом снова подключил недавно убранное внешнее питание 5В. Потом понял, что прошиваю фьюзы, забыл их снять. Поставил новый мк, не помогло. Может не настроил тактовый генератор? А у резистора переменного 10кОм сопротивление по-равному поделено.

Почему-то еще проблема: даже когда ставлю новый непрошитый мк (у меня их много:D), на PORTC есть единицы все-равно. Как-будто они подаются с дисплея. Короче, пока ничего так и не понял, вообще не получается хоть как-то дать жизнь to LCD.
И еще так и не понял насчет PROM - туда надо что-нибудь заливать? Или программа хранится во FLASH?

Если у переменного резистора сопротивление по-равному поделено тоже показывать не будет. Из своего опыта 10:1 (делитель 10к на +, 1к на - , от их середины на контрастность). Но не факт что у вашего прокатит.
Программа всегда пишется во FLASH. Если не правильно зашить фьюзы очень вероятно что не заработает. Особенно если с частотой не разобрались.
Я бы советовал вам сначало либо проверить LCD без мк, либо написать простенькую программу просто с выводом на LCD "Привед Медвед!". Примеров в инете найдете море.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Чт авг 30, 2012 08:53:23

Сделал программку, выдающую "Hello, World", не заработала. В Proteuse все работает, хотя делал уже по старой памяти, то есть косяки могут быть с одной стороны в железе. Но может я забываю что-то подключить, что в Proteuse игнорируется? Например, подсветку я совсем не включаю.

... А ведь подсветка тоже какие-то косяки выдает. То мне кажется, что что-то меняется, когда я вставляю батарейку, но это так слабо заметно. Сопротивление - 68Ом. На Adjusment подается около 3 В, если не больше, но не выводится и все!

Re: Atmega8515 - Частотомер, работающий на Atmega8

Чт авг 30, 2012 20:06:03

kras писал(а):Сделал программку, выдающую "Hello, World", не заработала. В Proteuse все работает, хотя делал уже по старой памяти, то есть косяки могут быть с одной стороны в железе. Но может я забываю что-то подключить, что в Proteuse игнорируется? Например, подсветку я совсем не включаю.

... А ведь подсветка тоже какие-то косяки выдает. То мне кажется, что что-то меняется, когда я вставляю батарейку, но это так слабо заметно. Сопротивление - 68Ом. На Adjusment подается около 3 В, если не больше, но не выводится и все!

Какие косяки может выдать подсветка??? Она тупо подключается к питанию!
Какое отношение имеют Adjusment и батарейка к выводу "Hello, World" ???
Пишите нормально, не сумбурно. Мне еще угадывать что на самом деле у вас творится?

Возмите просто подключите светодиод к порту и помигайте им например с частотой 1 Гц. Тогда узнаете правильно ли вы запустили мк. И выбросте все ваши батарейки. Только МК - резистор - светодиод. И конечно обвязка по питанию.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Чт авг 30, 2012 21:32:40

Ну странно, я же уже и таймер, и ацп пробовал, правда, на атмеге8а. А 8515 тестил, только на другой плате, получалось, ну надо еще раз попробовать. Насчет подсветки - подключил к питанию через 68Ом, а она так тускло загорается:( Питание=батарейки у меня, отсек на 4штуки=5В. А без подсветки не будет работать?

Re: Atmega8515 - Частотомер, работающий на Atmega8

Пт авг 31, 2012 02:12:52

Существуют дисплеи совсем без посветки.Это вообще как опция идет. Если нет, можно добавить, лишь бы места в корпусе хватило.Так что можете пока о ней вообще не думать.

Сделайте как вам советуют нормальный контраст.выставьте на максимум, если все черное, то уменьшайте, пока не посветлеет.
Потом уже пробуйте выводить.

И выход с дисплея может быть, если нога R/W в воздухе висит.Это означает, что дисплей на вывод.Можно ее просто насовсем к минусу припаять.Все равно пока нечего с него читать.

и вообще какие то странные у вас батарейки 4 штуки пять вольт.это они по 1.25 что ли? надеюсь вы их к Мк не подключали?То что на аккумуляторе написано 1.2 вольта это еще ни о чем не говорит.вообще они заряженные могут быть и 1.5 вольта, как вы будете оправдываться перед Мк?шесть вольт как нож в спину.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Сб сен 01, 2012 09:57:17

нормальный контраст
ОО, а у меня вообще ноль ответа от LCD на подкрутку резистора! Ну буду пробовать, просто еще резистор с тонкой настройкой
как нож в спину
А я может напутал? В даташите видел, что 7В предельное напряжение питания. Да, у меня по 1.5В батарейка, но как-то в уроках говорили, что это норм.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Сб сен 01, 2012 14:44:53

kras писал(а):
нормальный контраст
ОО, а у меня вообще ноль ответа от LCD на подкрутку резистора! Ну буду пробовать, просто еще резистор с тонкой настройкой
как нож в спину
А я может напутал? В даташите видел, что 7В предельное напряжение питания. Да, у меня по 1.5В батарейка, но как-то в уроках говорили, что это норм.

– 2.7 - 5.5V for ATmega8515L
– 4.5 - 5.5V for ATmega8515
Где 7В ? Предельное, это значит она выдержит, но никто вам не гарантирует его нормальную работу на предельных режимах.
Подойдет обычный подстроечный резистор.
Я вам уже писал, что если вы перепутали полярность напряжения на LCD, то он уже труп.
Достаточно один раз и не надолго, обдумайте еще раз эту мысль.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Пт сен 07, 2012 03:58:32

Собрал новую схему с другим дисплеем LCM1602K - нет ответа от нее. Поэтому вопрос в алгоритме, наверное, что-то не так понимаю. Все делаю на CVAvr.
1. К порту C припаял 3+4 выхода дисплея.
2. Питания и земли панельки под мк и дисплея припаял к соответствующим выходам программатора напрямую.
3. Поставил подстроечный резистор (10кОм пополам), крайние ножки на питание и землю, промежуточная на VEE - регулировку контрастности.
4. Для теста припаял диод к выходу PORTB.0 и сделал делитель напряжения для ножки PORTA.0 (подумал, может АЦП есть).
5. Написал программу для мигания PORTB.0, заработала, но время идет некорректно: delay_ms(999) длится не 1секунду, а дольше раз в 8.
6. Пошел дальше, кинул стандартный код LCD с нета. Не заработало, хотя в PROTEUS все ок!
7. Решил воспользоваться генератором кода, там по умолчанию частота 8МГц, подключил LCD, добавил 3 строчки из проекта пункта 6, итог:
Код:
#include <mega8515.h>

// Alphanumeric LCD functions
#include <alcd.h>

// Declare your global variables here

void main(void)
{
char *_str="Hell!"; //Создаем выводимую строку
// Declare your local variables here

// Input/Output Ports initialization
// Port A 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
PORTA=0x00;
DDRA=0x00;

// 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
// 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
PORTC=0x00;
DDRC=0x00;

// 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;

// Port E initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTE=0x00;
DDRE=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=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;

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

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

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

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

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

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

     
     

//#asm
//   .equ __lcd_port=0x15 ;PORTC
//#endasm  // Инициализируем PORTC как порт ЖКИ

     
     lcd_gotoxy(0, 0); // Переводим курсор на первый символ первой строки
     lcd_puts(_str);   // Выводим строку _str на дисплей
     
     while (1){ // безконечный цикл
     };
     
}

Прошиваю FLASH, при этом фьюзы не меняю. Дисплей молчит! А в Proteus все ок.
8. Кручу резистор вправо-влево - ноль эмоций у LCD.
Больше ничего не делал. Если я все необходимое назвал, то где мог ошибиться?

Re: Atmega8515 - Частотомер, работающий на Atmega8

Пт сен 07, 2012 09:59:15

Ващета в меге 8515 нет АЦП.

Re: Atmega8515 - Частотомер, работающий на Atmega8

Пт сен 07, 2012 11:48:34

Ну ок, но не могу разобраться я с LCD.
Ответить