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

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт мар 19, 2021 11:55:56

Спасибо, за комплименты и ценные советы по оформлению. Наглядность моего кода повысилась.

Но прерывание не появилось. Может все таки есть идеи в чем дело?


Насчет МК - эта крошка поражает своими возможностями, но я что-то устала, от отсутствия информации кроме даташита, что-то очень сложно найти.
Мне только славные рыцари с этого форума помогают.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт мар 19, 2021 12:35:34

Lilia, попробуйте отсечь всё лишнее пока для теста. Для начала банально поставить кнопку на PA2, на какой-нибудь другой пин светодиод и попробовать по прерыванию включать-выключать светодиод. Так-то приведенный фрагмент вроде правильный. Судя по ДШ ничего более и не надо для работы прерывания включать вроде бы.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт мар 19, 2021 13:23:51

Что нужно поставить, чтобы хотя в симуляторе студии погонять attiny1607? У мну xp и семёрка. Какая студия или какое либо другое программное обеспечение от мелкочипов?
Заинтриговали вы меня этой тинькой...

Добавлено after 8 minutes 42 seconds:
Lilia, не спешите опускать руки. Я поглядел в даташит, и у меня уже моск вскипел... Прорвёмся, разберёмся...

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс апр 04, 2021 17:15:01

Небольшой вопросик по AVR СИ.
Надо записать в порт А старшую тетраду, при этом не испортив младшую тетраду порта.
Придумал такое, не знаю правильно или нет:
Код:
temp = (data & 0xF0); 
PORTA = (temp | (PINA & 0x0F));

сэмулировать чтоб посмотреть не знаю как, сразу вставлять в программу - если это неправильно, то это вряд ли будет единственной ошибкой. В общем, межуюсь.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс апр 04, 2021 17:27:51

не знаю правильно или нет

Во-первых, не правильно, во-вторых, не помешало бы указать о каких AVR идет речь, потому что на новых для подобных целей есть специальные регистры. Если говорить про старые AVR, то там если пины сконфигурированы как входы, то PORTx включает подтяжки, т.е. если какой-то пин сконфирурирован именно так, то чтение PINx будет возвращать 1, но только до той поры пока ты на вход не повесишь какую-нибудь кнопку и не нажмешь ее, тогда прочитаешь 0, соответственно и запишешь тоже 0... Читать нужно не уровень на входе, а данные защелки, т.е. сам PORTx. Ну и не зря на новых AVR появились дополнительные регистры с атомарным доступом, по нормально на время подобных операций нужно отключать прерывания...

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс апр 04, 2021 17:34:16

Авр старый (тини26), прерываний нет. То есть, если буду читать сам porta то нормально будет?

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс апр 04, 2021 17:37:20

Код:
PORTA = ((temp & 0xF0) | (PORTA & 0x0F));

Изображение
Последний раз редактировалось Demiurg Вс апр 04, 2021 18:14:28, всего редактировалось 1 раз.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс апр 04, 2021 18:01:00

Раз уж заговорили про порты, то подкинули мне на днях новую tiny1614 и вчера я набросал несколько простых классов для работы с портами на С++20, может кому-то будет интересно:

Работает это так:

Все операции атомарные, на макросах такое сделать довольно проблематично...

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт июн 03, 2021 20:38:34

Ребята привет! Пытаюсь обуздать АЦП прерывание по переполнению на Тиньке13, что не правильно делаю, или не понимаю что делаю? в протусе PORTB.1 прыгает, выдает меандр, а не должен(( Остальные ведут себя нормально, пока только симуляция в Протусе, в железе не делал.
Код:
Chip type               : ATtiny13
AVR Core Clock frequency: 9,600000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*******************************************************/

#include <tiny13.h>
#include <delay.h>

unsigned int adc0,adc2;
bit flag1,flag2;

#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 2
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
// Bandgap Voltage Reference: Off
#define ADC_VREF_TYPE ((0<<REFS0) | (0<<ADLAR))

// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
   input_index=0;
ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x6A;
adc0=adc_data[0];
adc2=adc_data[2];
}


void reley(void){
     if(adc2>220 && adc2<300) {PORTB.0=1;}
            else {PORTB.0=0;}

     if(adc2>310 && adc2<350) {PORTB.3=1;}
            else {PORTB.3=0;}
           
     if(flag2==0){
        if(adc2 > 400 && adc2 < 460) {flag1=1;PORTB.1=1;}
            else {PORTB.1=0;flag1=0;}
           

        if(adc2 > 490 && adc2 < 515) {flag1=1;PORTB.2=1;}
            else {PORTB.2=0;flag1=0;}
     }
     
     if(flag1==0){
        if(adc0 > 400 && adc0 < 460) {flag2=1;PORTB.1=1;}
            else {PORTB.1=0;flag2=0;}
         
        if(adc0 > 490 && adc0 < 515) {flag2=1;PORTB.2=1;}
            else {PORTB.2=0;flag2=0;}
     }
}
void main(void)
{
// Crystal Oscillator division factor: 8
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (1<<CLKPS1) | (1<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 1 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x6A;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);

// ADC initialization
// ADC Clock frequency: 150,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: Timer0 Overflow
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADMUX=FIRST_ADC_INPUT | ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
ADCSRB=(1<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);


// Global enable interrupts
#asm("sei")

while (1){
   reley();     
   }
}

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт июн 03, 2021 20:52:33

kote52, замысел опишите, гадать что должна делать ваша программа никто не будет.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт июн 03, 2021 21:10:58

kote52, замысел опишите, гадать что должна делать ваша программа никто не будет.

Простое управление стеклоподъемниками, нажатие кнопок считывается при помощи АЦП, пассажирская дверь дублируется на водительской стороне. Два канала АЦП один для водительской двери - четыре кнопки (две водительское стекло две пассажирское), второй канал для пассажирской двери две кнопки. Сделал два канала ацп для того чтобы, если управляю водительским стеклом была возможность управлять пассажиру его стеклом в этот момент. Но если водитель управляет пассажирским стеклом, пассажир не может управлять его стеклом.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт июн 04, 2021 10:03:17

а 2 канала АЦП зачем? одним нельзя, что-ли, все кнопки опросить? я ж так понимаю, у вас будет резисторный делитель напряжения, сигнал с которого будет поступать на АЦП?

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт июн 04, 2021 10:51:56

а 2 канала АЦП зачем? одним нельзя, что-ли, все кнопки опросить? я ж так понимаю, у вас будет резисторный делитель напряжения, сигнал с которого будет поступать на АЦП?

Исходил из наличия резисторов и выше описал почему! Так это проблема два канала опросить? Да просто чисто для образования хочу понимать как это делать в первую очередь! Писать код под две нажатые кнопки на разных дверях(водительское стекло вверх пассажирское виз к примеру), чтоб понималось что и куда нажалось и что с этим делать че т сложно и муторно((

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс июн 06, 2021 21:21:10

ARV, NStorm, ну так как парни поможете обуздать опрос 2х каналов АЦП или зря писал? :beer:

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт июл 23, 2021 17:46:53

У меня проблема с тем же Attiny1607.

Надо настроить тики от внешнего генератора (ecs-5032mv-100-cn-tr).
Регистры настройки тиков защищены. Снимаю защиту, изменить делитель получается, а переключить внешний генератор - никак.
Причем если в регистре MCLKCTRLA в режиме отладки натыкать нужные биты - то программа пойдет выполняться. Иначе подвиснет ожидая while.

Подскажите, где же тут собака порылась?

Код:
   CCP = CCP_IOREG_gc; // снять защиту от записи регистров   
   CLKCTRL.MCLKCTRLB = 0x00; //выключаем делитель
         
   CCP = CCP_IOREG_gc; // снять защиту от записи регистров   
   CLKCTRL.MCLKCTRLA = 0x03; //CLKCTRL_CLKSEL_gm; //включаем внешний осциллятор
   while((CLKCTRL.MCLKSTATUS & 0x80) == 0); //ждем включения осциллятора
Вложения
io-gen.jpg
(95.05 KiB) Скачиваний: 109

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт июл 23, 2021 20:41:06

А бит FUSE.OSCCFG залочен или нет?

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт июл 27, 2021 15:58:11

Нет, не залочен. Бит FUSE.OSCCFG.OSCLOCK в нуле.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср июл 28, 2021 08:36:56

Так а если выкинуть этот while, МК переключится на внешний такт?

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср июл 28, 2021 11:18:01

Нет, не переключается.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср авг 18, 2021 19:37:27

Может кому-то будет интересно.

Сегодня провёл сравнение по размеру кода, генерируемого разными версиями avr-gcc:

Проект ampcontrol:
Проект matrixclock:
Вывод такой - вплоть до 8 версии качество оптимизации улучшалось, а потом начало становиться хуже. Ну, или есть какие-то новые тайные опции у компилятора, которые могли бы вернуть размер кода на прежний уровень.

Да, разница между лучшим и худшим вариантом не более 3%, но иногда, когда прошивка уже впритирку подбирается к размеру flash, это может быть существенно.
Ответить