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

Purple

Members
  • Постов

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

  • Посещение

Электроника

  • Стаж в электронике
    1-2 года

Достижения Purple

Новобранец

Новобранец (2/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. К сожалению не помогло. Код Main.c #include "stm32f0xx.h" #include "LCD_Functions.h" int main(void) { InitializePortsForLCD(); LCD_SendAnInstruction(0b00111000); //Set to 8-bit mode LCD_SendAnInstruction(0b00001100); //Turn on Display and Cursor???? LCD_SendAnInstruction(0b00000110); //Set the mode to increment address by one LCD_SendAnInstruction(0b00000001); //Clear the Display /*LCD_SendACharcter('H'); LCD_SendACharcter('e'); LCD_SendACharcter('l'); LCD_SendACharcter('l'); LCD_SendACharcter('o'); LCD_SendACharcter('!');*/ LCD_Send_a_String("Hello!"); while(1) { } } А также код LCD_Functions.h #ifndef LCDFunctionsHeader #define LCDFunctionsHeader #define LCD_D0_Pin 15 #define LCD_D0_Port GPIOB #define LCD_D1_Pin 6 #define LCD_D1_Port GPIOC #define LCD_D2_Pin 7 #define LCD_D2_Port GPIOC #define LCD_D3_Pin 8 #define LCD_D3_Port GPIOC #define LCD_D4_Pin 9 #define LCD_D4_Port GPIOC #define LCD_D5_Pin 8 #define LCD_D5_Port GPIOA #define LCD_D6_Pin 9 #define LCD_D6_Port GPIOA #define LCD_D7_Pin 10 #define LCD_D7_Port GPIOA #define LCD_Enable_Pin 14 #define LCD_Enable_Port GPIOB #define LCD_ReadWrite_Pin 13 #define LCD_ReadWrite_Port GPIOB #define LCD_RegisterSelect_Pin 12 #define LCD_RegisterSelect_Port GPIOB #define time_Delay_before_Enable 1200 #define time_Delay_before_Disable 2400 void SetPortAndPinForOutput(GPIO_TypeDef *port,int pinNumber) { if(port==GPIOA){ RCC->AHBENR|=RCC_AHBENR_GPIOAEN; } if(port==GPIOB){ RCC->AHBENR|=RCC_AHBENR_GPIOBEN; } if(port==GPIOC){ RCC->AHBENR|=RCC_AHBENR_GPIOCEN; } if(port==GPIOD){ RCC->AHBENR|=RCC_AHBENR_GPIODEN; } if(port==GPIOF){ RCC->AHBENR|=RCC_AHBENR_GPIOFEN; } port->MODER&=~(1<<((pinNumber*2)+1)); port->MODER|=(1<<pinNumber*2); port->OSPEEDR|=(1<<((pinNumber*2)+1))|(1<<pinNumber*2); port->OTYPER&=~(1<<pinNumber); port->PUPDR&=~(1<<pinNumber); } void InitializePortsForLCD() { SetPortAndPinForOutput(LCD_D0_Port,LCD_D0_Pin); SetPortAndPinForOutput(LCD_D1_Port,LCD_D1_Pin); SetPortAndPinForOutput(LCD_D2_Port,LCD_D2_Pin); SetPortAndPinForOutput(LCD_D3_Port,LCD_D3_Pin); SetPortAndPinForOutput(LCD_D4_Port,LCD_D4_Pin); SetPortAndPinForOutput(LCD_D5_Port,LCD_D5_Pin); SetPortAndPinForOutput(LCD_D6_Port,LCD_D6_Pin); SetPortAndPinForOutput(LCD_D7_Port,LCD_D7_Pin); SetPortAndPinForOutput(LCD_Enable_Port,LCD_Enable_Pin); SetPortAndPinForOutput(LCD_ReadWrite_Port,LCD_ReadWrite_Pin); SetPortAndPinForOutput(LCD_RegisterSelect_Port,LCD_RegisterSelect_Pin); } void SendBitToPortAndPin(GPIO_TypeDef *port,int pinNumber,uint8_t bitState) { if(bitState){ port->BSRR|=(1<<pinNumber); } else{ port->BRR|=(1<<pinNumber); } } void LCD_Enable() { notExact_TimeDelay(time_Delay_before_Enable); SendBitToPortAndPin(LCD_Enable_Port,LCD_Enable_Pin,1); } void LCD_Set_to_Write() { SendBitToPortAndPin(LCD_ReadWrite_Port,LCD_ReadWrite_Pin,0); } void LCD_Set_to_Read() { SendBitToPortAndPin(LCD_ReadWrite_Port,LCD_ReadWrite_Pin,1); } void LCD_Instruction_Mode() { SendBitToPortAndPin(LCD_RegisterSelect_Port,LCD_RegisterSelect_Pin,0); } void LCD_Character_Mode() { SendBitToPortAndPin(LCD_RegisterSelect_Port,LCD_RegisterSelect_Pin,1); } void LCDSendAByteToTheLCDDataPins(char character) { SendBitToPortAndPin(LCD_D0_Port,LCD_D0_Pin,character & 0b00000001); SendBitToPortAndPin(LCD_D1_Port,LCD_D1_Pin,character & 0b00000010); SendBitToPortAndPin(LCD_D2_Port,LCD_D2_Pin,character & 0b00000100); SendBitToPortAndPin(LCD_D3_Port,LCD_D3_Pin,character & 0b00001000); SendBitToPortAndPin(LCD_D4_Port,LCD_D4_Pin,character & 0b00010000); SendBitToPortAndPin(LCD_D5_Port,LCD_D5_Pin,character & 0b00100000); SendBitToPortAndPin(LCD_D6_Port,LCD_D6_Pin,character & 0b01000000); SendBitToPortAndPin(LCD_D7_Port,LCD_D7_Pin,character & 0b10000000); notExact_TimeDelay(time_Delay_before_Disable); SendBitToPortAndPin(LCD_Enable_Port,LCD_Enable_Pin,0); } void notExact_TimeDelay(int timeDelay) { volatile i; for(i=0; i<timeDelay;i++) { } } void LCD_SendACharcter(char character) { LCD_Set_to_Write(); LCD_Character_Mode(); LCD_Enable(); LCDSendAByteToTheLCDDataPins(character); } void LCD_SendAnInstruction(char character) { LCD_Set_to_Write(); LCD_Instruction_Mode(); LCD_Enable(); LCDSendAByteToTheLCDDataPins(character); } void LCD_Send_a_String(const char *String_of_Characters) { while( *String_of_Characters) { LCD_SendACharcter(*String_of_Characters++); } } #endif
  2. Пока *String_of_Characters==NULL При каждой обработке *String_of_Characters++ на один увеличивается.
  3. Нашел материал по созданию библиотеки LCD1602 на STM32F030R8T6. Все шло нормально пока не дошел до использования функции отображения слова на LCD. Функция инициализации, отправки инструкций, команд все работает отлично. Функция отправки символов тоже работала нормально. Но вот когда создал функцию отправки слова, ничего не происходит. Первая строка LCD отображает квадратики. Попрбовал снова отправить по буквам по отдельности - все ок, отображает без проблем. Я подозреваю у меня ошибка в Функции отправки слова, но не могу понять где именно. Менял также время LCD таймингов - не помогло. Все єто делаю в COIDE. Ниже листинг функций: //===Функция отправки слова================================== void LCD_Send_a_String(char *String_of_Characters) { while( *String_of_Characters) { LCD_SendACharcter(*String_of_Characters++); } } //=========================================================== LCD_Send_a_String("Hello!"); // Не работает, первая строка с квадратиками //=========================================================== //===Ниже код работает======================================= LCD_SendACharcter('H'); LCD_SendACharcter('e'); LCD_SendACharcter('l'); LCD_SendACharcter('l'); LCD_SendACharcter('o'); LCD_SendACharcter('!'); //=========================================================== Буду благодарен за любую помощь!
  4. У меня другая ситуация, в Протеусе работает все отлично, а в реале ничего не работает. Я просто, написал интерфейс для общения с lcd. Пока разбираюсь с макеткой, может там накосячил. А у кого то были ситации наоборот, в Протеусе работает все ок, а в реале нет?
  5. Я пробовал, то что Вы предложили. К сожалению тот же самый результат. Просмотрел Вашу библиотеку. Боюсь, мне понадобиться некоторое время чтобы разобраться до конца, что к чему. В прерывании пробовал поставить числа и код пробела в PORTD=Segment(10); Все работало как надо. Как только возвращал назад переменные units, tens, hundreds проблема возвращалась. Может я объявил неправильно переменные и счетчик CNT?
  6. Добрый день! Делаю динамическую индикацию на 7-ми сегментных индикаторах для Мега48 на три разряда. Создал библиотеку с кодами цифр и пустым разрядом. Также имеются две кнопки для увеличения / уменьшения счетчика на 1. Все прошил и подключил работает отлично. Но возникла проблема с незначащими нулями перед числом (003 вместо 3). В библиотеке прописал код пустого разряда. При тестировании этот разряд выключен, а остальные моргают в непредсказуемом порядке и показывают нули. Я уже много способов перепробовал, чтобы убрать нули перед числом, но не получилось. Ищу совета/помощи у более опятных программеров. Привожу код моей программы и библиотеки. #define F_CPU 4000000UL #define NumberofButtons 2 #include <avr/io.h> #include <avr/interrupt.h> #include "ButtonPress.h" #include "seven_segment.h" //========variables============ volatile int units=0; //for counting the units of the CNT volatile int tens=0; //for counting the tens of the CNT volatile int hundreds=0; //for counting the hundreds of the CNT volatile int Cathode=0; //to define the cathode number volatile char CNT=0; //our counter to count the pressed UP and DOWN buttons //============================== int main(void) { DDRD=0xff; //this port for LED segments PORTD=0x00; //in the beginning is nothing on the port DDRC=0x07; //this port for the Led cathodes PORTC=0x00; //in the beginning is nothing on the port DDRB=0x00; //this port for connecting of the counter pushbuttons PORTB=0x03; //pull-ups enable to the buttons //=======Timer0_settings======== TCCR0A=(1<<WGM01); //set CTC mode from datasheet OCR0A=20; //calculated matched time 0.01sec from http://eleccelerator.com/avr-timer-calculator/ or from "Timer0_calc" TIMSK0=(1<<OCIE0A); //set the mask for our mode sei(); //enable the interrupts TCCR0B=(1<<CS00)|(1<<CS02); //set prescaler clk/1024 while(1) { //*****************Buttons_procedures********************************************** if(ButtonPressed(0,PINB,0,250)) //if increment button is pressed {if(CNT<200) //verify that CNT less than 1000 {CNT++; } else {CNT=200; //if CNT more than 999 then fix CNT to 999 } } else {if(ButtonPressed(1,PINB,1,250)) //if decrement button is pressed {if(CNT>0) //verify that CNT more than 0 {CNT--; } else {CNT=0; //if CNT less than 0 than fix CNT to 0 } } } //***************CNT_segmentation_procedure************************************** hundreds=(CNT%1000)/100; tens=(CNT%100)/10; units=CNT%10; } } ISR(TIMER0_COMPA_vect) { //========variables============= Cathode++; //increase the Cathode by one position switch(Cathode) { case 1: PORTC=(1<<Cathode); //light next digit cathode PORTD=Segment(tens); //out the tens break; case 2: PORTC=(1<<Cathode); //light next digit cathode PORTD=Segment(units); //out the units break; case 3: Cathode=0; PORTC=(1<<Cathode); //light next digit cathode PORTD=Segment(hundreds); //out the hundreds break; } } И библиотека кодов цифр: int Segment( int Symbol) { switch(Symbol) { case 0: return 0x3f; // "0" case 1: return 0x06; // "1" case 2: return 0x5b; // "2" case 3: return 0x4f; // "3" case 4: return 0x66; // "4" case 5: return 0x6d; // "5" case 6: return 0x7d; // "6" case 7: return 0x07; // "7" case 8: return 0x7f; // "8" case 9: return 0x6f; // "9" case 10: return 0x00; // " " empty space } return 0; }
  7. Добрый день! У меня возникла проблема с обработкой кнопки. Использую ATmega48PA-PU, подключил светодиод на первую ножку PORTC, а на вторую ножку подключил кнопку. Обычный простой код. В Атмел Студио все замечательно, без ошибок и тестировал все ок. Но в реале при нажатие на кнопку, светодиод загорается, а когда отжимаю кнопку он продолжает гореть и не гаснет. Вроде, код без ошибок, но все же. Может кто поможет разобраться с ситуацией. Привожу код программы: #define F_CPU 4000000UL #include <avr/io.h> int main(void) { DDRC=0x01; PORTC=0x02; while(1) { if(!(PINC & 0x02)) { PORTC|=0x01; } else { PORTC&=0xFE; } } } Заранее спасибо всем откликнувшимся...
×
×
  • Создать...