Страница 1 из 2

Простой тахометр на atmega

Добавлено: Чт дек 03, 2020 15:23:01
kotokot131313131313
Всем привет, делаю тахометр, на вход которого поступают импульсы, МК считает их по прерываниям и другой таймер отсчитывает секунды.

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

#include <mega8.h>
#include <delay.h>
int rps=0;
int pr=0;
    interrupt[TIM0_OVF]void timer0_overflow(void)
{
TCNT0=(0);
if (pr==30)
{
if (rps<17) {  PORTC.1=1 }   // zajigaem led esli rps<17
else { PORTC.1=0};         

rps=0;
pr=0;
PORTC.2=1;
}
else
{pr=pr+1;PORTC.2=0;}
}
    interrupt[EXT_INT1]void ext_int1(void)
{rps=(rps+1);}
void main()
{
DDRC = 0xff;//0xff = 0b11111111  все выводы порта A сконфигурировать как выходы
DDRD=0x00;
PORTD=0xff;
TCCR0=0x05;
TCNT0=(0);
TIFR=0;
TIMSK=0x02;
GIMSK=0x80;
MCUCR=0x09;
#asm
sei
#endasm
while(1)
{

}        
// 1000 rpm eto 17 rpsec

Добавил строчки для отладки, чтобы смотреть зажжет ЛЕД если рпс меньше 17 или нет. ЛЕДы на протеусе не горят. Может код кривой?

Re: Простой тахометр на atmega

Добавлено: Чт дек 03, 2020 15:45:42
BlackKilkennyCat
код точно кривой - читать такое тяжко, отформатируйте отступы, междустрочность.
Пример:

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

#include <mega8.h>
#include <delay.h>

int rps=0;
int pr=0;

interrupt[TIM0_OVF]void timer0_overflow(void)
{
    TCNT0=(0);
    if (pr==30)
    {
         if (rps<17) 
             PORTC.1=1  // zajigaem led esli rps<17
         else 
             PORTC.1=0;         
        
         rps=0;
         pr=0;
         PORTC.2=1;
    }
    else
    {
        pr=pr+1;
        PORTC.2=0;
    }
}
    
interrupt[EXT_INT1]void ext_int1(void)
{ 
    rps=(rps+1);
}

void main()
{
    DDRC = 0xff;//0xff = 0b11111111  все выводы порта A сконфигурировать как выходы
    DDRD=0x00;
    PORTD=0xff;
    TCCR0=0x05;
    TCNT0=(0);
    TIFR=0;
    TIMSK=0x02;
    GIMSK=0x80;
    MCUCR=0x09;

    #asm
        sei
    #endasm

     while(1)
     {
     }
       
     // 1000 rpm eto 17 rpsec
} //в оригинале замыкающей скобки не было
сравните, какой вариант удобнее читать тем, кому Вы задаете вопрос, на который они отвечают совершенно на добровольных условиях, так зачем же им усложнять задачу?

Re: Простой тахометр на atmega

Добавлено: Чт дек 03, 2020 15:58:46
kotokot131313131313
Спасибо большое за поправку, совсем что-то замылился с разбором кода.
Но код все равно не работает.

Re: Простой тахометр на atmega

Добавлено: Чт дек 03, 2020 16:20:16
BlackKilkennyCat
ну, надо поставить breakpoint в timer0_overflow на TCNT0=(0);, посмотреть, попадает ли туда вообще, и сколько раз, то есть, изменяется ли pr, и отключен ли watchdog?

Re: Простой тахометр на atmega

Добавлено: Чт дек 03, 2020 19:19:00
kotokot131313131313
[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3935320#p3935320"]ну, надо поставить breakpoint в timer0_overflow на TCNT0=(0);, посмотреть, попадает ли туда вообще, и сколько раз, то есть, изменяется ли pr, и отключен ли watchdog?[/uquote]

пошел гуглить что это такое )

Re: Простой тахометр на atmega

Добавлено: Чт дек 03, 2020 19:21:01
BlackKilkennyCat
О, это полезно - дебаг, дебагер, дебаггинг. То бишь, отладка. Владение этим позволяет найти кучу проблемного.

Re: Простой тахометр на atmega

Добавлено: Чт дек 03, 2020 19:39:17
NStorm

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

    TCCR0=0x05;
    TIMSK=0x02;
    GIMSK=0x80;
    MCUCR=0x09;
За магические числа надо расстреливать. Ну блин, вот ненаглядно ведь нифига. Какие биты выставлены?
На какой частоте работает мега?
Частота прерывания таймера? Ну ок, предделитель стоит 1024 (надо не магические числа писать, а биты и комментарии! чтобы сразу было видно), значит прерывание будет в четверть частоты МК.

Добавлено after 43 seconds:
Что подключено на PORTC.2?

Добавлено after 1 minute 32 seconds:
Какой частоты входной сигнал на INT1?

Re: Простой тахометр на atmega

Добавлено: Чт дек 03, 2020 20:04:12
kotokot131313131313
да я с 12го года все пытаюсь обойтись без дебага. но пришло время этим заняться. насколько я помню это можно сделать только в Студии.

Re: Простой тахометр на atmega

Добавлено: Чт дек 03, 2020 20:08:38
NStorm
Прям в протеусе можно и даже нужно.

Re: Простой тахометр на atmega

Добавлено: Чт дек 03, 2020 20:39:40
BlackKilkennyCat
странно, но многие не хотят и увиливают от дебага, и я тоже ведь был когда-то в их числе... а сейчас не представляю, как без него.
На своём любимом ST7FOX запустил ШИМ методом тыка меняя значения регистров в отладочном режиме (по документации ШИМ работать почему-то не хотел).
Без отладочного режима был бы полный пипец: поменял, скомпилил,прошил (симулятоа на него нет), запустил, поменял, скомпилил,прошил, запустил...

Re: Простой тахометр на atmega

Добавлено: Чт дек 10, 2020 17:02:13
kotokot131313131313
[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3935464#p3935464"]странно, но многие не хотят и увиливают от дебага, и я тоже ведь был когда-то в их числе... а сейчас не представляю, как без него.
На своём любимом ST7FOX запустил ШИМ методом тыка меняя значения регистров в отладочном режиме (по документации ШИМ работать почему-то не хотел).
Без отладочного режима был бы полный пипец: поменял, скомпилил,прошил (симулятоа на него нет), запустил, поменял, скомпилил,прошил, запустил...[/uquote]

Да очень странно что я раньше не пользовался дебаггером, очень простая и интуитивная вещь. код исправил и запустил. все работает отлично )

Решил усложнить задачу и сделать в том же коде генератор синуса на прерываниях соответственно.

Re: Простой тахометр на atmega

Добавлено: Пт дек 25, 2020 11:11:05
kotokot131313131313
Продолжая тему:
Счетчик работает правильно, синус на шиме генерирует, а вот все вместе не получается - на OCR выходе вместо ШИМа выходят хаотично импульсы.
На ПРОТЕУСе все отлично, а вот на железе - ерунду генерирует.
Гдето наткнулся на информацию, что АТмега либо чтото делает, либо генерит ШИМ, изза того что нет DMA. То есть если строим синус, то только на отдельной МК.
Может кто сталкивался с этим?
Кстати делаю тахометр, который берет сигнал с ДПКВ и на табло двигает стрелку, генерируя синус и косинус.

Re: Простой тахометр на atmega

Добавлено: Пт дек 25, 2020 11:34:45
NStorm
Гдето наткнулся на информацию, что АТмега либо чтото делает, либо генерит ШИМ, изза того что нет DMA. То есть если строим синус, то только на отдельной МК.
Бред какой-то. Что-то наверное вы не так поняли. ДМА нужен совсем не для того. ШИМ мега генерит аппаратно таймеров, вне зависимости от того, чем занят проц. Только менять его надо для записи в регистр проц задействовать.
Раз в протеусе работает, а в железе нет - скорее всего помехи по входу, которые не фильтруются и дают левые значения.

Re: Простой тахометр на atmega

Добавлено: Ср дек 30, 2020 10:11:29
BOB51
Смотрим момент перезаписи нового значения из времянок в защелки.
Второе - не забываем, что запись в 16-битовые регистры не мгновенна (одной командой) - необходима защита от наложения прерываний "в разрыв" операции загрузки значения в таймер/OCRn.
8)
Насчет дебаггера...
Ядро всегда проверить можно, а вот аппаратные модули - смотреть "ограничения" - там самостоятельно пишем дополнительные отладочные модули с выводом данных на заведомо рабочую систему индикации.
(У адуриньи к примеру - печать сообщений в терминал ПК.)
:roll:

Re: Простой тахометр на atmega

Добавлено: Ср дек 30, 2020 10:41:30
NStorm
b526, а с одного аккаунта писать слабо? А код приложить не надо думаете? Что вы там за биты пишете, когда в регистре TIMSK только 1 бит от таймера 0?
Еще обратите внимание на то, что предделитель для таймеров 0 и 1 - общий, и есть нюансы при работе с обоими таймерами на меге8.

Re: Простой тахометр на atmega

Добавлено: Ср дек 30, 2020 10:48:04
akl
[uquote="b526",url="/forum/viewtopic.php?p=3950733#p3950733"]...Вопрос: как влияет тимск на ШИМ на таймере 1 в меге8 ???[/uquote]TIMSK mega8 работает для Т0 только с 0 битом прерывания по переполнению (кстати, вы оперируете с 1, а это необъявленный бит). Попробуйте управлять битом TOIE0 по или.

Re: Простой тахометр на atmega

Добавлено: Ср дек 30, 2020 21:18:04
kotokot131313131313
akl писал(а):[uquote="b526",url="/forum/viewtopic.php?p=3950733#p3950733"]...Вопрос: как влияет тимск на ШИМ на таймере 1 в меге8 ???[/uquote]TIMSK mega8 работает для Т0 только с 0 битом прерывания по переполнению (кстати, вы оперируете с 1, а это необъявленный бит). Попробуйте управлять битом TOIE0 по или.
Большое спасибо, очень дельный комментарий.

Re: Простой тахометр на atmega

Добавлено: Ср янв 06, 2021 12:17:36
kotokot131313131313
Выяснил, что
1. при

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

GICR = (1<<INT1)|(1<<INT0); 
OCR2 генериурет ШИМ, однако не меняет скважность по заданному массиву:

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

ISR(TIMER1_COMPA_vect)
{
	OCR2=aSin[i];
	i++;
	if (i>127) i=0;
где aSin это массив.
Чтобы заработало все, необходимо отключить INT1. Как это связано не понял, установил опытным путем :dont_know:
2. При таком подходе, когда генерируется ШИМ как показано выше, OCR1a почему-то не хочет генерировать:

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

ISR(TIMER1_COMPA_vect)
{
	OCR2=aSin[i];
        OCR1A=254;
	i++;
	if (i>127) i=0;
при настройках регистров:

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

TCCR0 = 0b0000101;			
         TCNT0 = 0;
	 PORTB=0x00;
	 DDRB = (1<<PB1) |(1<<PB2)| (1<<PB3);
	 TCCR1A = (1<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(1<<WGM10)     ;          //delaem fast pwm na ocr1a
	 TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
	TCCR2=(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(0<<CS21)|(1<<CS20);
	TIMSK=(1<<OCIE1A);
	sei();
Вопрос: кто нибудь запускал ШИМ на двух выходах? и если да, то как?
п.с. Шим на OCR2 используется для СИНУСА, на OCR1a - постоянной скважности.

Re: Простой тахометр на atmega

Добавлено: Ср янв 06, 2021 13:46:53
BlackKilkennyCat
kotokot131313131313, https://radiokot.ru/artfiles/6607/ - вдруг, пригодится. Автор даже исходник приложил. МК, правда, не тот.

Re: Простой тахометр на atmega

Добавлено: Ср янв 06, 2021 13:56:41
akl
А регистр MCUCR в каком состоянии? Если в исходном, то низкий уровень на лапе(ах)INT0,1 будет держать камень в прерывании, не давая работать остальному, т.к. у остальных приоритет слабее.