Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 142 из 159 ПерваяПервая ... 4292132139140141142143144145152 ... ПоследняяПоследняя
Показано с 1,411 по 1,420 из 1581

Тема: Микроконтроллеры AVR

  1. #1411
    Добавлено через 19 минут(ы):

    Спасибо большое, действительно по rjmp был неправильный переход. Сменил все rjmp на jmp, переход стал правильный. И все равно нет прерывания. Сделал маленькую программу и в ней не работает. Посылаю, хотя извиняюсь, занимаю ваше время. Просто интересно, где ошибка. Может кристалл виноват? Причем прерываний нет ни по Т0, ни по Т1 и Т2.
    ;******************* ******************** ******************** ******************** ****
    .include "C:\prog\T032\m32def 1.inc"


    .cseg

    .org 0
    jmp Res


    .org $A
    jmp INDI






    .org $80


    Res:


    ;Запрет прерываний
    cli


    ;Очистка регистра, содержащего информацию об источнике сброса
    clr r16
    out MCUCSR,r16

    ;НАСТРОЙКА СТЕКА
    ldi r16,HIGH(RAMEND)
    out SPH,r16
    ldi r16,LOW(RAMEND)
    out SPL,r16


    ;=================== ==НАСТРОЙКА ПОРТОВ И РЕГИСТРОВ=========== ===





    ;Настроить порт D
    ldi r16,0b11100000 ;SV1,SV2,SV3,*,*,*,* ,*
    out DDRD,r16
    ldi r16,0b00011100
    out PORTD,r16

    ;=================== =РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ТАЙМЕРА Т0================== ========


    ldi r16,0b00000001 ;разрешение прерывания .Т0
    out TIMSK,r16
    ldi r16,0b0000010 ;делитель на 8 (11 - на 64)
    out TCCR0,r16


    ;Разрешение прерываний
    sei


    Main:
    sbi PORTD,7 ;SV1
    jmp Main


    INDI: ;вывод на индикацию
    sbi PORTD,6 ;SV2 (2,4576 / 8 = 307,2 кГц
    reti




    ;******************* ******************** ******************** ***********
    .exit

    В программе 2 файла: T032.asm и m32def1.inc в папке c/prog/T032
    Последний раз редактировалось Владимир 100; 13.09.2022 в 21:28.


  2. #1412

    Регистрация
    01.07.2014
    Адрес
    Томск
    Сообщений
    439
    Позывной
    UA9HGC
    Нажмите на изображение для увеличения. 

Название:	таймер.jpg 
Просмотров:	85 
Размер:	68.2 Кб 
ID:	378776Так попробуйте.

  3. #1413
    ничего не видно. Крупнее нельзя?

  4. #1414

    Регистрация
    01.07.2014
    Адрес
    Томск
    Сообщений
    439
    Позывной
    UA9HGC
    Сейчас попробую.
    Нажмите на изображение для увеличения. 

Название:	таймер 2.png 
Просмотров:	60 
Размер:	261.4 Кб 
ID:	378782
    Последний раз редактировалось SafSerg; 14.09.2022 в 16:27.

  5. Спасибо от Владимир 100

  6. #1415
    Спасибо, все равно не получается, увеличиваю, размывается. Если откуда-то, может, ссылка есть? Я сделал короткую программу для проверки прерывания, посылаю, может, найдете ошибку.
    Спасибо большое, действительно по rjmp был неправильный переход. Сменил все rjmp на jmp, переход стал правильный. И все равно нет прерывания. Сделал маленькую программу и в ней не работает. Посылаю, хотя извиняюсь, занимаю ваше время. Просто интересно, где ошибка. Может кристалл виноват? Причем прерываний нет ни по Т0, ни по Т1 и Т2.
    ;******************* ******************** ******************** ******************** ****
    .include "C:\prog\T032\m3 2def 1.inc"


    .cseg

    .org 0
    jmp Res


    .org $A
    jmp INDI






    .org $80


    Res:


    ;Запрет прерываний
    cli


    ;Очистка регистра, содержащего информацию об источнике сброса
    clr r16
    out MCUCSR,r16

    ;НАСТРОЙКА СТЕКА
    ldi r16,HIGH(RAMEND)
    out SPH,r16
    ldi r16,LOW(RAMEND)
    out SPL,r16


    ;=================== ==НАСТРОЙКА ПОРТОВ И РЕГИСТРОВ=========== ===





    ;Настроить порт D
    ldi r16,0b11100000 ;светодиод1,светодиод2,*,*,*,*,* ,*
    out DDRD,r16
    ldi r16,0b00011100
    out PORTD,r16

    ;=================== =РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ТАЙМЕРА Т0================== ========


    ldi r16,0b00000001 ;разрешение прерывания .Т0
    out TIMSK,r16
    ldi r16,0b0000010 ;делитель на 8 (11 - на 64)
    out TCCR0,r16


    ;Разрешение прерываний
    sei


    Main:
    sbi PORTD,7 ;светодиод1
    jmp Main


    INDI: ;вывод на индикацию
    sbi PORTD,6 ;светодиод2 (2,4576 / 8 = 307,2 кГц
    reti

  7. #1416

    Регистрация
    01.07.2014
    Адрес
    Томск
    Сообщений
    439
    Позывной
    UA9HGC
    Сюда не помещается файл можно попробовать на почту моя ua9hgc@mail.ru.

    ldi r16,0b0000010 ;делитель на 8 (11 - на 64)

    out TCCR0,r16
    di r16,0b00000001 ;разрешение прерывания .Т0
    out TIMSK,r16
    надо так.

  8. Спасибо от Владимир 100

  9. #1417
    Вот для примера участок кода из моей программы для частотомера на Atmega16 (частоту в автоматическом тюнере измерял).
    .cseg
    .....
    .ORG $012
    rjmp TIM ; прерывание по переполнению Т0
    ......

    ;_______________ процедура инициализации частотомера_______
    FRQ_M_step:

    ldi temp, (1<<TOIE0) ;разр. прерывания Timer0
    out TIMSK,temp


    ; инициализация таймера Т1
    clr temp
    clr temp2
    out TCNT1L,temp
    out TCNT1H,temp2 ; обнуление регистра TCNTN1
    ldi temp,(1<<CS10)|(1<<C S11)|(1<<CS12); внешняя частота на входе T1 по фронту
    out TCCR1B,temp ; пуск таймера Т1


    ldi temp,240 ;значение коэфф деления (16)
    out TCNT0,temp ;загружаем таймер
    ldi temp,(1<<CS00)|(1<<C S01); на входе T0 clk/64
    out TCCR0,temp ; пуск таймера Т0
    ldi temp,(1<<PSR10) ; сброс прескалера
    out SFIOR,temp
    clt
    sei ; очистка флага-маячка
    WAIT9: brtc WAIT9 ; ожидание флага-маячка
    ret


    ;======= Обработка прерывания таймера Т0 ==================== ===
    TIM: ;прерывание Timer0
    cli
    ldi temp,(0<<CS10)|(0<<C S11)|(0<<CS12);
    out TCCR1B,temp ; остановка таймера Т1
    ldi temp,(0<<CS00)|(0<<C S01);
    out TCCR0,temp ; остановка таймера Т0


    in temp,TCNT1L ; Чтение младшего
    in temp2,TCNT1H ; Старшего
    set
    sei
    reti ;конец обработчика прерывания таймера

  10. Спасибо от Владимир 100

  11. #1418

    Регистрация
    14.06.2018
    Адрес
    Санкт-Петербург
    Сообщений
    1,027
    Попался на глаза ассемблерный код для avr-gcc, вспомнил про тему. Данный код собирался с ключами -nostartfiles -nodefaultlibs, чтобы avr-gcc ничего не добавлял, в том числе таблицу векторов. Так-то он самовольничает, пихает и таблицу, и стек конфигурить лезет.. А может мне вектора и не нужны, а нужны пара десятков свободных байтов?
    Вернусь к теме. Вот так в gas (gcc assembly) выглядит таблица векторов прерываний и код переключающий светодиод. Секция .vectors будет размещена с нулевого адреса (типа ORG 0), и сразу за ней секция .text с кодом main, где и стек установится, и пустой цикл закрутится.
    Выравнивание этих секций 16 бит (flash/progmem), как и у опкодов, так что если проверить map или дизассемблер, то каждый вектор займёт по два байта. Иной раз можно и очевидные вещи повторить. (;
    Код:
    .section .vectors
    vector_table:            ; atmega8
        rjmp main         ; 0 Reset Handler
        rjmp def_vect         ; 1
        rjmp def_vect         ; 2
        rjmp def_vect         ; 3
        rjmp def_vect         ; 4
        rjmp def_vect         ; 5
        rjmp def_vect         ; 6
        rjmp def_vect         ; 7
        rjmp def_vect         ; 8
        rjmp toggle_led        ; 9 Timer0 Overflow
        rjmp def_vect           ; A
        rjmp def_vect           ; B
        rjmp def_vect           ; C
        rjmp def_vect           ; D
        rjmp def_vect           ; E
        rjmp def_vect         ; F
        rjmp def_vect           ; 10
        rjmp def_vect           ; 11
        rjmp def_vect           ; 12
        def_vect: rjmp vector_table
    .global toggle_led
    toggle_led: ; blinked on timer0 ovf (uC's alive)
            sbis 0x10, 7 ; PIND
            rjmp set_pin
            cbi 0x12, 7 ; led on D7
            rjmp ed
            set_pin: sbi 0x12, 7 ; PORTD
            ed:
        reti
    .section .text
    main:    ldi 16, 0xff ; stack
        out 0x3d, 16 ; SPL
        ldi 16, 0x03 ; and
        out 0x3e, 16 ; SPH
        ldi 16, (1<<7) ; led port direction
        out 0x11, 16
        ldi 16, 0b00011111 ; enables 2 sec watchdog
        out 0x21, 16
        ldi 16, 0b00000101 ; timer0 clock/1024
        out 0x33, 16
        ldi 16, 1    ; timer0 ovf
        out 0x39, 16 ; timsk
        sei ; sreg
        loop:
        wdr
        rjmp loop

  12. #1419

    Регистрация
    12.09.2006
    Адрес
    Болгария, Силистра, KN34PC
    Сообщений
    1,489
    Позывной
    LZ2WSG
    Самый "короткий код" для расчета этого? (расчет AD9850)
    Код:
    uint32_t f = (uint32_t)(((uint64_t)frequency << 32) / F_MCLK);
    С Arduino былo так, а вот с ATtiny13 и PIC ищу "покороче". Где-то в компиляторах нет и uint64_t :/.

    С float работает, но ... ресурсоёмкoe. (расчетная приведенная погрешность: ок. 1-2 Hz на 3 500 000 Hz)
    Код:
    float fr = f * 34.360030370;  //  2^32 / F_MCLK = 4294967296 / 125000000 = 34.359738368 
    f = (uint32_t)fr;
    ...
    Последний раз редактировалось veso74; 16.11.2022 в 16:10.


  13. #1420

    Регистрация
    14.06.2018
    Адрес
    Санкт-Петербург
    Сообщений
    1,027
    Это сложный вопрос. На Си, вероятно придется читать stackoverflow и перебирать облегченные библиотеки, сравнивая размер кода. Может ещё ключи от компилятора крутить после просмотра мап-файла. Возможно дизассемблирование, но ожидаемый результат проще получить программируя тоже на ассемблере и отключив "режим Бога" для компилятора и линковщика.

    Встречный вопрос, уже простой: А что, при попытке где-нибудь в мэйне мирно описать тип ui64, компилятор начинает возражать? (Не пробовал для МК создавать свои типы, редко программирую к сожалению.) Да, Скорее всего это были издержки перевода. Думаю, имелось в виду что не во всех библиотеках есть такой тип. Сами операции все равно придется описывать врукопашную. Просто пошутил.

    Мне тоже не хватает темы про программирование МК, поэтому отметился. Это 32-битное умножение и 64-битное деление вместе с другим полезным кодом в t13 не влезало, это я подкоркой запомнил. В редких конкретных случаях "объезжал на хромой козе" без полных математических операций, "триками". Но с программированием сишки, я думаю, так не получится из-за непредсказуемости операндов и требуемой точности результата.

Страница 142 из 159 ПерваяПервая ... 4292132139140141142143144145152 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Микроконтроллеры PIC
    от R2DAD в разделе Конструкции на микроконтроллерах для радиолюбителей
    Ответов: 140
    Последнее сообщение: 29.10.2023, 10:32
  2. СОМ порт и микроконтроллеры
    от alex74 в разделе Технический кабинет
    Ответов: 1
    Последнее сообщение: 31.03.2008, 11:04

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •