Перейти к содержанию

teapot

Members
  • Постов

    23
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные teapot

  1. Доброго времени суток.

    Учусь работать с STM32F0 +ST7789.

    Провожу инициализацию дисплея. Но есть непонятная вещь. При подаче питания, МК исполняет свою программу как надо, но дисплей пустой. Подключаюсь к МК через ST-Link Utility, после подключения нажимаю кнопку разъединить. И дисплей показывает то, что прописано программой.

    Я так понимаю, дисплей начинает работать только после сброса мк утилитой при разъединении. Как можно это обойти, что б экран работал сразу после подачи питания на плату?

    П.с. физический сброс выводом nrst на gnd погоды не меняет.

  2. Дело не в доверии, а в том, что с LCD по SPI разбираюсь впервые. В наличии есть только ST7789, но в протеусе его нет. Зато есть ST7735. Протеус хоть и глючный, но можно посмотреть то, что в железе не получиться, так как осциллографа нет. Вот и играюсь, чтоб немного опыта поднабрать и проще было с другим экранчиком. Все ж лучше чем ничего. Да и, к тому же,  на протеусе ST7735 запускали и в сети есть примеры работ. 

  3. Инвертировал CLK. Ничего не поменялось.

    Спойлер

    Screenshot_4.png.ae76368ad56ed28f6e962d88d8553d98.png

    Добавил:

    Изменил SSP1CON1.CKP = 1; на SSP1CON1.CKP = 0; - данные пошли как надо: получаю на дебагере то, что отправляю. Но ошибки остались от LCD. Я так понимаю здесь уже будет проблема не в SPI, а в самом коде инициализации дисплея?

  4. Да тут и кода то почти нет=)

    Инициализация SPI и функции отправки:

    Спойлер
    /***********************Аппаратный SPI на передачу для PIC16F1619***************
    
    Заметка от 27.01.2022
    *******************************************************************************/
    // Установка линий SPI
    sbit SCK_Dir at TRISB6_bit;                 //SCK Master cleared
    sbit MOSI_Dir at TRISB7_bit;                 //MOSI output
    // Master SPI mode only
    #define   SMPEND        0x80           // Input data sample at end of data out
    #define   SMPMID        0x00           // Input data sample at middle of data out
    
    /* SSPCON1 REGISTER */
    #define   SSPENB        0x20           // Enable serial port and configures SCK, SDO, SDI
    #define   SPI_FOSC_4    0              // SPI Master mode, clock = Fosc/4     clockcycle 0.5 uS
    #define   SPI_FOSC_16   1              // SPI Master mode, clock = Fosc/16
    #define   SPI_FOSC_64   2              // SPI Master mode, clock = Fosc/64    clockcycle 8 uS
    #define   SPI_FOSC_TMR2 3              // SPI Master mode, clock = TMR2 output/2
    #define   SLV_SSON      4              // SPI Slave mode, /SS pin control enabled
    #define   SLV_SSOFF     5              // SPI Slave mode, /SS pin control disabled
    // Инициализация аппартного SPI
    void SPI_Init_SPI_PIC16F1619(){
      SCK_Dir=0;                   //SCK Master output
      MOSI_Dir=0;                  //MOSI output
    
      SSP1STAT &= 0x3F;
      SSP1CON1 = 0x00;
      SSP1CON1 |= SPI_FOSC_4        ;
      SSP1STAT |= SMPMID;           // выбор фазы
      SSP1STAT.CKE = 1;             // фронт
      SSP1CON1.CKP = 1;             // уровень
      RB7PPS = 0b00010001;         // RB7 SDA на output
      RB6PPS = 0b00010000;         // RB6 SCL на output
      SSP1CON1 |= SSPENB;           // Включить SPI
    }
    // Функция отправки данных
    void SPI_SendByte(unsigned char _data){
      SSPBUF = _data;
      while(!SSP1STAT.BF) ;       //Ждем передачи отправленных байт
      SSP1STAT.BF=0;              //Сбрасываем флаг отправки data
    }
    void SPI_SendByte16(unsigned int _data){
      char Low = _data & 0x00ff;
      char Hig = _data>>8;
      SSPBUF=Low;
      while(!SSP1STAT.BF) ;       //Ждем передачи отправленных байт
      SSP1STAT.BF=0;              //Сбрасываем флаг отправки data
      SSPBUF=Hig;
      while(!SSP1STAT.BF) ;       //Ждем передачи отправленных байт
      SSP1STAT.BF=0;              //Сбрасываем флаг отправки data
    }

     

    и в отдельном файле пытаюсь инициализировать ST7735:

    Спойлер
    #define _DC PORTC.F7
    #define CS_EN PORTC.F6
    // Color definitions                    //BRG  RGB?
    #define BLACK   0x0000
    #define BLUE    0x0F01
    #define RED     0x00F0
    #define GREEN   0x0007
    #define CYAN    0x0703
    #define PURPLE  0x0F81
    #define YELLOW  0x00FE
    #define WHITE   0xFFFF
    //#define RST PORTC.F5
    void send_CMD(char data_out){
        CS_EN = 0;
        _DC=0;
        SPI_SendByte(data_out);
        CS_EN = 1;
    }
    void send_DAT(char data_out){
        CS_EN = 0;
        _DC=1;
        SPI_SendByte(data_out);
        CS_EN = 1;
    }
    void send_DAT16(unsigned int data_out){
        CS_EN = 0;
        _DC=1;
        SPI_SendByte16(data_out);
        CS_EN = 1;
    }
    void init_ST7735(){
    
    Send_CMD(0x01);
    Delay_ms(12);
    /*
    Send_CMD(0x11);
    Delay_ms(12);
    
    Send_CMD(0x3A);
    Send_DAT(0x05);
    
    Send_CMD(0x36);
    Send_DAT(0xA0);
    
    Send_CMD(0xB1);
    Send_DAT16(0x000F);
    Send_DAT16(0x000F);
    Send_DAT16(0x000F);
    
    Send_CMD(0x29);    */
    //CS_EN = 1;
    }

     

    Ну и main:

    Спойлер
    #include "SPI_PIC16F1619.h"
    #include "MY_ST7735.h"
    
    void main(){
      TRISB = 0b00000000;
      TRISC = 0b00000000;
      PORTC = 0b00000000;
      SPI_Init_SPI_PIC16F1619();
      init_ST7735();
    
      while(1){
               
               Delay_ms(1000);
               }
    }

     

     

  5. Еще раз обращаюсь к знающим людям.

    Настроенным SPI (выше) отправляю 1, с контролера выходит 2 (смотрю дебагером spi в proteuse), отправляю 2 получаю 4. отправляю 3 - получаю 6.

    Если смотреть на это дело в двоичном коде, происходит сдвиг битов. Кроме того, к контроллеру в протеусе подключен LCD на ST7755 и он выкидывает в лог ошибку:
     

    [LCD] CS released, data transfer breaks on bit (rx 8, tx 8) [LCD1]

    В чем может быть проблема?

    Спойлер

    Screenshot_3.png.2807f42b1de666dd2539ee2c0eff27f5.png

     

  6. 20 часов назад, Alex сказал:

    Попробуйте без библиотек.
    Если Вы добрались до даташита и до информации в нём, касаемой ремапа, то Вам, скорее всего, не составит труда проинициализировать этот простой модуль без всяких библиотек.

    Пробовал уже по разному. Недели полторы бъюсь, а воз и ныне там. У енгельском я неразумны, датасшит читаю с переводчиком. Может чего недоходит.
    Вот пример, без библиотек, который тоже никак не проходит:

    Спойлер

     

    sbit CS_EN at RC6_bit;
    sbit CS_EN_Dir at TRISC6_bit;
    //sbit RST at RC1_bit;
    //sbit RST_Dir at TRISC1_bit;
    sbit DC_ at RC7_bit;
    sbit DC_Dir at TRISC7_bit;
    sbit SCK_Dir at TRISB6_bit;                 //SCK Master cleared
    sbit MOSI_Dir at TRISB7_bit;                 //MOSI output
    // Master SPI mode only
    #define   SMPEND        0x80           // Input data sample at end of data out
    #define   SMPMID        0x00           // Input data sample at middle of data out
    
    /* SSPCON1 REGISTER */
    #define   SSPENB        0x20           // Enable serial port and configures SCK, SDO, SDI
    #define   SPI_FOSC_4    0              // SPI Master mode, clock = Fosc/4     clockcycle 0.5 uS
    #define   SPI_FOSC_16   1              // SPI Master mode, clock = Fosc/16
    #define   SPI_FOSC_64   2              // SPI Master mode, clock = Fosc/64    clockcycle 8 uS
    #define   SPI_FOSC_TMR2 3              // SPI Master mode, clock = TMR2 output/2
    #define   SLV_SSON      4              // SPI Slave mode, /SS pin control enabled
    #define   SLV_SSOFF     5              // SPI Slave mode, /SS pin control disabled
    void SPI_Init_(){
      CS_EN_Dir = 0;
      SCK_Dir=0;                   //SCK Master output
      MOSI_Dir=0;                  //MOSI output
      //RST_Dir=0;                   //Reset output
      DC_Dir=0;                    //Данные/Команда
    
      SSPSTAT = 0b00000000;
      SSPCON1 = 0b00000000;
      SSPCON1 |= SPI_FOSC_4;
      SSPSTAT |= SMPMID;           // выбор фазы
      SSPSTAT.CKE = 1;             // передача по переднему фронту
      SSPCON1.CKP = 0;             // по низкому уровню
      RB7PPS = 0b00010001;         // RB7 SDA на output
      RB6PPS = 0b00010000;         // RB6 SCL на output
      SSPCON1 |= SSPENB;           // Включить SPI
    
      CS_EN = 1;
    }
    void SPI_SendByte(char _data){
      SSPBUF=_data;
      while(!SSPCON1.WCOL) ;       //Ждем передачи отправленных байт
      SSPBUF = 0x00;				//Очищаем буфер
      SSPCON1.WCOL=0;              //Сбрасываем флаг
    }
    void main(){
      SPI_Init_();
      while(1){
               SPI_SendByte(0x77);
               Delay_ms(500);
               }
    }

     

    Добавлено:
    Закомментировал "

    while(!SSPCON1.WCOL) ;

    " и пошли данные. Что то я с флагом накосячил. Пойду датасшит докуривать.


    Еще ДОБАВИЛ:
    Действительно накосячил с флагом. Код ниже подправил. Работает. Дебагер SPI протеуса ловит отправляемые данные. Сейчас буду подгонять сигналы, для начала, под ST7735.

    Спойлер

     

    sbit CS_EN at RC6_bit;
    sbit CS_EN_Dir at TRISC6_bit;
    //sbit RST at RC1_bit;
    //sbit RST_Dir at TRISC1_bit;
    sbit DC_ at RC7_bit;
    sbit DC_Dir at TRISC7_bit;
    sbit SCK_Dir at TRISB6_bit;                 //SCK Master cleared
    sbit MOSI_Dir at TRISB7_bit;                 //MOSI output
    // Master SPI mode only
    #define   SMPEND        0x80           // Input data sample at end of data out
    #define   SMPMID        0x00           // Input data sample at middle of data out
    
    /* SSPCON1 REGISTER */
    #define   SSPENB        0x20           // Enable serial port and configures SCK, SDO, SDI
    #define   SPI_FOSC_4    0              // SPI Master mode, clock = Fosc/4     clockcycle 0.5 uS
    #define   SPI_FOSC_16   1              // SPI Master mode, clock = Fosc/16
    #define   SPI_FOSC_64   2              // SPI Master mode, clock = Fosc/64    clockcycle 8 uS
    #define   SPI_FOSC_TMR2 3              // SPI Master mode, clock = TMR2 output/2
    #define   SLV_SSON      4              // SPI Slave mode, /SS pin control enabled
    #define   SLV_SSOFF     5              // SPI Slave mode, /SS pin control disabled
    void SPI_Init_(){
      CS_EN_Dir = 0;
      SCK_Dir=0;                   //SCK Master output
      MOSI_Dir=0;                  //MOSI output
      //RST_Dir=0;                   //Reset output
      DC_Dir=0;                    //Данные/Команда
    
      SSPSTAT = 0b00000000;
      SSPCON1 = 0b00000000;
      SSPCON1 |= SPI_FOSC_4;
      SSPSTAT |= SMPMID;           // выбор фазы
      SSPSTAT.CKE = 1;             // передача по переднему фронту
      SSPCON1.CKP = 0;             // по низкому уровню
      RB7PPS = 0b00010001;         // RB7 SDA на output
      RB6PPS = 0b00010000;         // RB6 SCL на output
      SSPCON1 |= SSPENB;           // Включить SPI
    
      CS_EN = 1;
    }
    void SPI_SendByte(char _data){
      SSPBUF=_data;
      while(!SSP1STAT.BF) ;       //Ждем передачи отправленных байт
      SSP1STAT.BF=0;              //Сбрасываем флаг отправки data
    }
    void main(){
      TRISC=0b00000000;;
      PORTC=0b00000000;
      SPI_Init_();
      while(1){
               SPI_SendByte(0x45);
               Delay_ms(500);
               PORTC.F0 =~ PORTC.F0;
               }
    }

     

     

  7. Доброго времени суток!
    Пытаюсь инициализировать аппаратный SPI в PIC16F1619 по средствам библиотек Mikroc pro for pic.

    Согласно датасшиту на МК, за линиями SDI, SCK, SS зарезервированы выводы RB4, RB6, RC6. SDO необходимо назначить.

    Назначаю с помощью Peripheral_Pin_Select:

       

    Unlock_IOLOCK();
    PPS_Mapping(10, _OUTPUT, _SDO);    //На выход SPI
    Lock_IOLOCK();

    Далее пытаюсь инициализировать SPI со стандартными настройками из библиотеки SPI_Remappable:

    SPI1_Init();                           // Initialize SPI module

     Пытаюсь, что-нибудь отправить, на всех задействованных выводах ничего не происходит.

    void main() {
       Unlock_IOLOCK();
       PPS_Mapping(10, _OUTPUT, _SDO);    //Íà âûõîä SPI
       Lock_IOLOCK();
       SPI1_Init();                       // Initialize SPI module
    
      while(1){
               SPI1_Write(0x73);
               Delay_ms(500);
      }
    }

    Прошу помощи в инициализации SPI.

    П.С. Симулирую все это дело в протеусе. Учусь работать с SPI (пока с помощью библиотек)для последующего запуска LCD на SS7735/SS7789. 

  8. "Плохая идея" - в железе будет видно, поменять не проблема, если что не так.

    "Это как и куда стыковать " - удобнее апперировать одним 10-битным данным нежели его кусками, т.е не ХХ_YYYYYYYY и не XXXXXXXX_YY, а ZZZZZZZZZZ, но как я понял для этой серии мк это невозможно.

    "Используйте битовые операции." - это как? Я обращаюсь в регистр и изменяю ужный бит.

  9. Мне нужен АЦП для отслеживания малейшего изменения во входящем сигнале без определения полной величины, из-за чего использую только младший бит.

    "у вас PCGF3:PCGF0 = 0000 - все входы аналоговые " - все верно, используются все с последовательным перебором (с соответствующими изменениями в ADCON1), Что б не писать весь код составляемой программы, создал новый проект, приведенный выше, для разбора модуля АЦП, а вернее работы с ним. Для тестового проекта ваши замечания верны и приняты во внимание. Спасибо большое за помощь. Извиняюсь, если ввел в заблуждение.

    На данный момент интересует вопрос (на будущее) можно ли состыковать старший и младший бит и работать сразу с 10-битной величиной или для 16-х это невозможно?

    П.С. Почему-то mikroc ругается на прямое обращение к конкретным битам, из-за чего паузы вместо отслеживания бита.GO/-DONE.

  10. А что именно неправильно в ADCON1: 7 бит - правое выравнивание, 6-4 не исполльзуются, по этому нули, 3-0 - опорное напряжение по Vdd - согласно даташиту.

    Тестирую в протеусе - ошибок нет. В железе пока не пробовал.

  11. Сам АЦП запустил, все работает, однако ADCON1 остался без изменений и все работает

    int temp, t;
    void main() {
    TRISA=0b00000001;
    PORTA=0b00000000;
    TRISB=0b00000001;
    PORTB=0b00000000;
    TRISC=0b00000000;
    PORTC=0b00000000;
    
    ADCON1 = 0b10000000;
    ADCON0 = 0b10000001;
     PORTB.F1=1;
      Delay_ms(1000);
      PORTB.F1=0;
     ADCON0 = 0b10000101;
     Delay_ms(1);
     temp=ADRESL;
    while(1){
      ADCON0 = 0b10000101;
      Delay_ms(1);
      t=ADRESL;
      if (temp!=t) PORTB.F1=1;
      else PORTB.F1=0;
    }
    }
    

    Можно ли как нибудь объединить старший и младший бит в одно?

  12. мда... грусно... вот это для кого в даташите написано?

    teapot еще раз нарушишь П.2.9 правил форума, выпишу редонли на пару дней

    Мда.. действительно грустно...

    "Учитель! Я прочитал главу но не понял ее, объясните"

    "вот это для кого в этой главе написано?"

    "но я же и прошу вас объяснить это"

    "иди читай а то поставлю два"

    А вообще, прежде чем кого-то посылать, может, стоит самому сходить

    i32084.jpg

    А за картинку спасибо. У меня на английском, с переводчиком разбирался.

  13. В общем как то так. Только разбираюсь...

    int temp;
    void main() {
    TRISA=0b00000001;
    PORTA=0b00000000;
    TRISB=0b00000001;
    PORTB=0b00000000;
    TRISC=0b00000000;
    PORTC=0b00000000;
    
    ADCON0 = 0b10000001;
    ADCON1 = 0b10000000;
    
    PORTB.F1=1;
    Delay_ms(1000);
    PORTB.F1=0;
    
    temp=ADRESL; // смотрим AN0 и запоминаем значение в темр
    Delay_ms(10);
    if (temp!=ADRESL) PORTB.F1=1; // Сравниваем значение в темр с вновь считаным AN0
    Delay_ms(1000);
    PORTB.F1=0;
    
    }
    

  14. Здравствуйте.

    не могу разобраться с модулем АЦМ в pic16f876a. Пишу код в mikroс pro for pic 6.4.

    Работал с модулеи АЦП в pic12f675, благо есть в библиотеке микроси поддержка АЦП, однако как ни пытался прикрутить библиотечные функции из примера к 876-му ничего не вышло - компилятор просто не знает что делать с этими функциями.

    Пробовал конфигурировать МК по датасшиту, разобрался с ADCON0 и ADCON1, но как снять показания с AN0, так и не пойму.

    Может направит кто в нужную сторону?

  15. Не смотря на дату созданной темы, вставлю я свои 5 копеек. Когда сам только начинал постигать mikroC, все гурьбой кричали, мол учи сначала архитектуру МК а только потом лезь в языки - оно то да, но если сугубо погружаться в них полностью и всяк, а если поморгать светодиодом, иль, что другое простенькое сделать. так лезть с головой в архитектуру это извращенство! хотя это сугубо мое мнение.

    Определил я для себя одно: прежде чем лезть в программирование МК, нужно поставить конкретную задачу для чего это вообще нужно. По архитектуре пройтись конечно стоит, что бы знать куда, копать, но для начала можно просто узнать какой функционал МК действительно понадобится и откинуть все остальное - пока откинуть, а позже может и вернуться, опять же если надо будет. Перелопатил я кучу умной литературы, по рекомендации тех же "архитектурщиков", и естественно для меня, человека нового в этом всем, полученная информация была как с другой планеты, которая не могла сразу поместится в мою голову, а соответственно оперировать какими-то понятиями было просто нереально. И лишь случайно в поисках новой, более понятной литературы напоролся на сайт какого-то кружка детского, где было описано начало работы с МК. Хоть в статьях на этом сайте и были какие то расхождения с теми заумными книжками, но они были написаны для школьников, и естественно направление моим трудам было задано. И всем "архитекторам" могу сказать, что врубился в работу портов ввода вывода, в таймеры, только после того, как просмотрел как это все работает, естественно написав перед этим программу по примерам.

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

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

    http://ehob.by/index...ikrokontrollery

    П.С. Есть такой метод - от противного. Для начала можно, что то сделать, и после копать как это работает.

  16. Все оказалось, как обычно, бонально просто:

    В настройках проекта, перевел Master Clear Enable в положение Disable (было Enable) - отключил MCLR

    Икод заработал без дополнительных настроек.

    void main() {
     while(1)
        {
        GPIO.GP0 = 1;
        Delay_ms(500);
        GPIO.GP0 = 0;
        Delay_ms(500);
        }
    }
    

    Предпологаю, что если не выключить MCLR в настройках, а при пайке притянуть ногу МК отвечающую за MCLR через резистор на киллоом 10 на "+", то же должно заработать.

    Кстате, Манчестер то же дпошел=)

    Вопрос исчерпан. Всем спасибо!

  17. СМCON = 7

    ADCON0.0 = 0

    void main() {
    CMCON = 7;
    ADCON0 = 0;
    TRISIO.GP0 = 0;
    GPIO.GP0 = 0;
    while(1)
    {
    GPIO.GP0 = 1;
    Delay_ms(500);
    GPIO.GP0 = 0;
    Delay_ms(500);
    }
    }
    

    реакция та же - никакая=)

    если прописать ADCON0.0 = 0 не компилируется

    Можно ли поподробней, за что отвечает каждая из команд?

  18. повесил в протеусе только светодиод через резистор и вшил код ниже

    void main() {
    TRISIO.GP2 = 0;
    GPIO.GP2 = 0;
    while(1)
    {
    GPIO.GP2 = 1;
    Delay_ms(500);
    GPIO.GP2 = 0;
    Delay_ms(500);
    }
    }

    Эффекта НОЛЬ. Проблема в том что с этим МК сталкиваюсь впервые и как он должен работать - не имею понятия, собственно с синтаксисом для него та же ерунда (копаю нет, складываю обрывки инфы в кучу)

  19. Здравствуйте, уважаемые.

    Написал код манчестера использя встроеную библиотеку mikroc pro для PIC16F877 (на приемнике и передатчике). Работает все отлично.

    Появилась необходимость сделать передатчик на PIC12F675. Но вот тот же код переписать под этот МК неудалось. (нет генирации на GP0/ тестил в протеусе)

    Есть сомнения в указании портов при конфигурации (выделил жирным)

    /* --------------- Конфигурация МК под манчестер-код ------------------------*/
    sbit MANTXPIN at [b]GP0[/b]_bit;
    sbit MANTXPIN_Direction at [b]TRISIO0[/b]_bit;
    /*---------------------- Конец конфигунации ---------------------------------*/
    short a;
    void main() {
    a=123;
    Man_Send_Init();				 // Инициализация передатчика
    while (1) {					 // Бесконечный цикл
    Man_Send(0x0B);			 // Отправка стартового бита
    Delay_ms(100);				 // Пауза
    
    Man_Send(a);				 // Отправка значения а
    Delay_ms(90);				 // Пауза
    
    Man_Send(0x0E);			 // Отправка конечного бита сообщения
    Delay_ms(500);				 // Пауза
    }
    }
    

    Есть какие мысли по поводу?

×
×
  • Создать...