Например TDA7294

Форум РадиоКот • Просмотр темы - Освоение USART, совсем запутался, помогите.
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт май 16, 2025 04:16:50

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 33 ]    , 2
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Пн окт 19, 2015 01:54:59 
Встал на лапы

Зарегистрирован: Ср окт 22, 2014 04:24:01
Сообщений: 84
Рейтинг сообщения: 0
Вернемся к нашим попугаям )))
Принято решение собрать на Atmega8 с железным USART работа по прерыванию по INT1
(модераторам прошу перенести тему в соответствующий раздел)

Код:
/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 19.10.2015
Author  :
Company :
Comments:


Chip type               : ATmega8A
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*******************************************************/

#include <mega8.h>

// Declare your global variables here

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
USART_Transmit( unsigned char data )
}

// Standard Input/Output functions
#include <stdio.h>

void USART_Transmit( unsigned char data );
void USART_Init( unsigned int ubrr);

void main(void)
{
// Declare your local variables here

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

// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=0 Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// 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=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Any change
GICR|=(1<<INT1) | (0<<INT0);
MCUCR=(0<<ISC11) | (1<<ISC10) | (0<<ISC01) | (0<<ISC00);
GIFR=(1<<INTF1) | (0<<INTF0);

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Sync. Master UCPOL=0
// USART Baud Rate: 15625
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (1<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0xFF;

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);

// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

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

while (1)
      {
      // Place your code here

      }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Вт окт 20, 2015 10:48:44 
Встал на лапы

Зарегистрирован: Ср окт 22, 2014 04:24:01
Сообщений: 84
Рейтинг сообщения: 0
Многоуважаемый vladlen-from-vrtp поделился вариантом на PIC12F629 как раз то что мне нужно, но перечитав весь даташит на этот контроллер так и не нашел регистр отвечающий за настройку нужной мне тактовой частоты (SCLK) прошу помощи как мне допилить данный код чтобы можно было выставлять частоту, или ткните носом где это в коде :(
Код:
// PIC12F629 Configuration Bit Settings

// 'C' source line config statements

#include <xc.h>
#include <stdint.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF       // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
//========
#define _XTAL_FREQ  4000000L

//========
#define MOSI      GP0
#define MISO      GP1
#define SCK       GP2
#define SS        GP5

#define GPIO_Tx   GP4
#define TRIS_Tx   TRISIObits.TRISIO4

//========
//
//========
const uint8_t arr_data[] = {
    0x00
};

unsigned char flag;

enum {
    reset = 0,
    in = 1,   //приняли байт
};
//========
//
//========
void Init_MCU(void);
void SPI_write_LSB (uint8_t);
void SPI_send_arr_data(void);
//========
//
//========
void Init_MCU(void) {

    GPIO = 0;
    CMCON = 7;
    TRISIO = 0b00010010; //GP4,GP1 input

    GPIF = 0;
    GPIE = 1;
    IOCB4 = 1;  //GP4 interrupt
    PEIE = 1;
    GIE = 1;
}
//========

void main(void) {
    Init_MCU();
    SS=1;
   
    while (1) {
        switch(flag) {
            case in: SPI_send_arr_data();
            break;
        }
        __delay_ms(100);
    }
}
//========
//
//========

void SPI_send_arr_data(void) {
    SS = 0;
    for (uint8_t i = 0; i<sizeof (arr_data); i++) {
        SPI_write_LSB(arr_data[i]);
    }
    SS = 1;
    flag = reset;
}
//========
//
//========
void SPI_write_LSB (uint8_t data) {
    unsigned char mask = 0x01;
    while (mask) {
        if (data & mask)MOSI = 1;
        else MOSI = 0;
        SCK = 1;
        __delay_us(46);
        SCK = 0; //
        __delay_us(46);
        mask <<= 1;
    }
}
//========
//
//========

interrupt void IRQ(void) {
    flag = GPIO;
    if (GPIF && GP4 == 0) {
        flag = in;
    }
    GPIF = 0;
}
//========
//
//========


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Ср окт 21, 2015 04:56:49 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 14
Зарегистрирован: Сб сен 19, 2009 07:02:19
Сообщений: 378
Рейтинг сообщения: 0
У этого МК внутренний осциллятор может работать только на 4МГц. У более поздних можно настройкой OSCCON выбрать другие частоты (8МГц, 4МГц, 2МГц и т.д. до 31КГц ). Для 675-го внутренний осциллятор можно лишь настроить поточнее, используя калибровочную константу. В XC8 для этого есть макрос:
Код:
...
OSCCAL = _READ_OSCCAL_DATA();
...
Но эта константа должна быть в последней ячейке памяти МК в виде retlw 0xXX. Нормальные программаторы её сохраняют, PicKit ещё и восстанавливает потёртую, это нужно учесть. Попытка использовать константу при её отсутствии, вызовет зависание МК по понятным причинам.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Чт окт 29, 2015 19:43:19 
Встал на лапы

Зарегистрирован: Ср окт 22, 2014 04:24:01
Сообщений: 84
Рейтинг сообщения: 0
После долгих изучений, анализа и прочего, в голове сложилась картина что это вовсе не UART а SPI, вот только передача идет не по битно 8n1 а единым целым 128bit апаратно это реализовать нереально, вопрос как программно это можно реализовать. Гугл да и все остальные форумы выдают только программную реализацию SPI на 8 максимум 16bit


Вернуться наверх
 
Открыт интернет-магазин MEAN WELL.Market – весь ассортимент MEAN WELL, выгодные цены

Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России. На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Чт окт 29, 2015 20:53:50 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2916
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 23681
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Frosty85 писал(а):
а единым целым 128bit апаратно это реализовать нереально, вопрос как программно это можно реализовать.

Не вижу никаких препятствий к аппаратной реализации "единых целых 128 бит".
SPI - это просто сдвиговый регистр и переданные подряд 16 байт дадут искомые 128 бит.
Все равно начало и конец пакета по SPI определит синхронизирующий CS.


Вернуться наверх
 
LED-драйверы MOSO - надежные решения для индустриальных приложений

Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO подробнее>>
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Чт окт 29, 2015 22:34:02 
Встал на лапы

Зарегистрирован: Ср окт 22, 2014 04:24:01
Сообщений: 84
Рейтинг сообщения: 0
Да согласен, но судя по анализу сигнала при вашем варианте аппаратного SPI между байтами передаваемой информации будет другой временной интервал (если судить по шине SCK) там идет тактовый импульс на 8 бит потом временная задержка и снова тактовый импульс на 8 бит)

А в моем случае этой временной задержки недолжно быть, т.е. последовательная передача всех 136 бит


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Пт окт 30, 2015 02:33:27 
Первый раз сказал Мяу!

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Чт май 01, 2014 07:28:15
Сообщений: 28
Рейтинг сообщения: 0
Frosty85 писал(а):
А в моем случае...


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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Пт окт 30, 2015 03:17:53 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2916
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 23681
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Frosty85 писал(а):
А в моем случае этой временной задержки недолжно быть, т.е. последовательная передача всех 136 бит

Херню не надо городить.
Совершенно безразлично какая временная задержка между байтами и даже между битами. защелкивание в сдвиговом регистре приемника происходит по фронту тактирующего импульса и главное, чтобы значение бита совпадало с ЭТИМ ФРОНТОМ.
Можно даже тактирующие клоки модулировать по частоте совершенно произвольно. Временные задержки НЕ ОПРЕДЕЛЯЮТ ГРАНИЦЫ БАЙТ.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Пт окт 30, 2015 18:26:17 
Встал на лапы

Зарегистрирован: Ср окт 22, 2014 04:24:01
Сообщений: 84
Рейтинг сообщения: 0
Хорошо раз я не совсем догоняю, или не могу внятно обьяснить, покажу на примерах.
Вот стандартный SPI
Вложение:
Комментарий к файлу: Стандартный SPI
487ae5c4ed894c3d9d4a8740d53249d8.png [3.51 KiB]
Скачиваний: 440


А в моем случае нужно сделать вот такой вариант SPI
Вложение:
Комментарий к файлу: Нестандартный SPI
log.jpg [152.44 KiB]
Скачиваний: 264


первый канал - данные в виде 136 бит
второй канал - SCK
третий канал - входной сигнал на разрешение передачи данных (не путать с SS)

Как видно из картинок, в сандартном SPI есть промежуток между байтами это видно по SCK
А в моем случае его нет и идет все единой цепочкой, плюс ко всему в стандартном SPI тактовая частота SCK начинает выдаваться как только придет управляющая команда с SS (сброс в логический 0 ), а в моем случае этот тактовый сигнал начинает генерироваться с момента подачи питания на МК и относительно него уже формируется выходные данные.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Пт окт 30, 2015 18:35:04 
Встал на лапы

Зарегистрирован: Ср окт 22, 2014 04:24:01
Сообщений: 84
Рейтинг сообщения: 0
Как вариант исполнения, на той же самой Atmega8 управляющий сигнал привязать к внешнему прерыванию INT1 или INT0, тактовую частоту задать с любого выхода к примеру pd6 ну а вывод данных реализовать на таймере T1

Это только мое предположение. не пинайте и не ругайте, я только учусь.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Сб окт 31, 2015 06:25:25 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2916
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 23681
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Вы плохо понимаете о чем Вам говорят. Ну то есть вообще не понимаете.
Клоки в синхронном интерфейсе потому и называются клоками, что они ЖИЗНЬ. Жизнь и внутреннее время интерфейса.
Если клоки нелинейны в реальном времени, то сам интерфейс ничего об этом не знает. Для него время всегда линейно, а пробелы между группами клоков - анабиоз. Как и для контроллера, кстати. Можно остановить клоки и он впадет в спячку, продолжить - и он не заметит украденного у него времени. И дело тут не в том как назвать интерфейс, а В ПРИНЦИПЕ ЕГО СИНХРОННОСТИ.
Нижний сигнал задает начало отсчета 136 бит. И далее число бит равно числу КЛОКОВ. Хоть бы даже последний придет через год, а предпоследний через 20 миллисекунд.
Кроме того, пауза между клоками отдельных байт в SPI определяется построением программы. То есть если грузить выходной буфер SPI немедленно как он освободится (в прерывании), то и зазор будет определяться соотношением частоты SPI и машинным циклом МК.
При соотношении 1:10 разглядеть зазор на диаграмме будет невозможно.
А если соотношение 1:2, то сформировать 8-битным контроллером вывод без зазоров ПРИНЦИПИАЛЬНО НЕВОЗМОЖНО, поскольку он 8-битный и требуется загрузка каждого байта.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Сб окт 31, 2015 09:57:31 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1337
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4558
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Frosty85, а зачем кучу тем создавать, в которых Вам одно и то же разжёвывают ? :facepalm:
То AVR, то PIC, то Си, то АСМ, то UART, то уже SPI, 128 бит, потом уже откуда то взялось число 136, ..... Определитесь уже, наконец, что Вы делаете, на чём и для чего ...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Освоение USART, совсем запутался, помогите.
СообщениеДобавлено: Сб окт 31, 2015 16:09:29 
Встал на лапы

Зарегистрирован: Ср окт 22, 2014 04:24:01
Сообщений: 84
Рейтинг сообщения: 0
я просто не знаю как удалить тему ((( или закрыть ее.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 33 ]    , 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y