Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Генератор двоичного кода


Автор: supercelt 1.8.2015, 20:59
Помогите пожалуйста разобраться.
Дано. Atmega 16
Двоичный код: 100101100001110101011001110
Нужно вывести его на порт С 0 пин с частотой 125 кгц. По положительной части задающего такта.
Сначала я сделал таймер с СТС что бы на порт В 3пин выводился такт с частотой 125. Потом я пытался сделать так что когда имеем положительную часть такта на порте В 3 пин, то на порт С 0 пин вывести тоже 1. Выводить цифры это уже следующий шаг. 
Так вот проблема в том что импульс на PC0 немного запаздывает от импульса PB3. Хотя я видел в нете скрины что вывод на порт импульса в точности совпадает с тактом. Мой код и схема ниже.

Код

#define F_CPU 16000000
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER0_COMP_vect){
    if(PINB & (1 << 3)){
        PORTC |= (1 << 0);
    } else {
        PORTC &= ~(1 << 0);
    }
}

int main(void)
{
    DDRC |= (1 << 0); //Port C - Out
    DDRB |= (1 << 3); //Port B Pin 3 - Out
    PORTB &= ~(1 << 3);
    OCR0 = 64;
    TCCR0 |= (0 << WGM00)|(1 << WGM01); 
    TCCR0 |= (0 << CS02)|(0 << CS01)|(1 << CS00); //предделитель 0
    TCCR0 |= (0 << COM01)|(1 << COM00);
    TIMSK |= (1 << OCIE0);
    asm("sei");
    while(1)
    {
        asm("nop");
    }
}


http://radikal.ru/fp/44e52de4ccb04c1baa99d8c6dc7c224a

Автор: Romikgy 1.8.2015, 23:26
протеус не показатель задержек!

Цитата(supercelt @  1.8.2015,  19:59 Найти цитируемый пост)
#define F_CPU 16000000

плюс на частотах выше 8 мегагерц протеус вообще ведет себя как хочет... я все логику проверяю на частотах ниже 8.... 

Автор: xvr 3.8.2015, 15:22
Цитата(supercelt @  1.8.2015,  20:59 Найти цитируемый пост)
Так вот проблема в том что импульс на PC0 немного запаздывает от импульса PB3.

Разумеется будет запаздывать. У вас обновление порта С делается програмно, а обновление порта B - аппаратно. А любая программа требует времени для исполнения, так что как минимум задержка на вход в прерывание и исполнение пары команд между портом B и C будут.

Переносите оба выхода на один порт (что бы можно было оба бита обновить одновременно одним выводом) и делайте генерацию выходной частоты програмно (в обаботчике прерываний от таймера)


Автор: ФедосеевПавел 4.8.2015, 11:07
И ещё. Хотя я может и не разобрался.

PortB.3 и PortC.0 настроены как выходы, а в ISR PortB.3 считывается, но нигде не изменяется.

При обмене данными по синхросигналам всегда есть периоды с достоверными и недостоверными данными. Если нужно, чтобы достоверные данные были по фронту PortB.3 - выставляйте их на PortC.0 по спаду PortB.3, когда данные на PortC уже считаются недействительными для приёмника.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)