Jump to content

Lev@

Members
  • Content Count

    197
  • Joined

  • Last visited

Community Reputation

-1 Плохой

About Lev@

  • Rank
    Осваивающийся
  1. Прикрутил 18b20 и сделал вывод информации
  2. с выводом переменных понятно: unsigned char temp; ................................. temp = 45; sprintf(lcd_buff,"%u", temp); lcd_puts(lcd_buff); ...................................
  3. ... о а как вывести значение переменной - число?
  4. Добавил кода: #define CMD_MOVE_LEFT 0b00011000 // ||||- * // |||-- * // ||--- RL: 1-shift right, 0-shift left // |---- SC: 1-display shift, 0-cursor move #define CMD_MOVE_RIGHT 0b00011100 // ||||- * // |||-- * // ||--- RL: 1-shift right, 0-shift left // |---- SC: 1-display shift, 0-cursor move а програмке, такой: sprintf(lcd_buff, "1.System"); lcd_puts(lcd_buff); lcd_write(0x90); sprintf(lcd_buff, "2.Function"); lcd_puts(lcd_buff); while(1) { __delay_ms(197); __delay_ms(197); __delay_ms(197); __delay_ms(197); __delay_ms(197); for ((i = 0; i <= 15; i++) { __delay_ms(100); lcd_write(CMD_MOVE_LEFT);} __delay_ms(197); __delay_ms(197); __delay_ms(197); __delay_ms(197); __delay_ms(197); for ((i = 0; i <= 15; i++) { __delay_ms(100); lcd_write(CMD_MOVE_RIGHT);} ; } ... типа подобие менюшки бегающей. теперь буду прикручивать клавиатуру и "русские" символы
  5. Нашел проблему с железом - все работает
  6. Ну и по старой традиции в "железе" ничего не работает((( вот такой у мну экран raystar rc1602b
  7. ...ля нашел ошибку - еще плохо знаю камень(точнее совсем не знаю - дата от 877 не подходит ) // ADCON1 = 0x06; // Disable analog pins on PORTA PORTA = 0; ANSEL = 0; не правильно инициализировал порт А
  8. Чето я совсем потеряшку поймал Вот файлик : #include <stdio.h> #include <pic.h> #include <htc.h> #include "io_pins.c" #include "function_lcd.h" #define _XTAL_FREQ 4000000 // ПРОТОТИПЫ ФУНКЦИЙ extern void pic_init(void); extern void Lcd_Strobe(void); extern void lcd_init(void); extern void SET_DATA(char); extern void lcd_write(char); extern void lcd_clear(void); void main(void) { pic_init(); lcd_init(); __delay_us(10); while(1) { ; } } это файлик с функциями function_lcd.h : #define _XTAL_FREQ 4000000 void pic_init() { ADCON1 = 0x06; // Disable analog pins on PORTA TRIS_EN = 0; TRIS_RS = 0; TRISD = 0; } void Lcd_Strobe(void) { LCD_EN=1; __delay_us(1); LCD_EN=0; } void SET_DATA(char d) //SET { PORTD = d; } void lcd_write(unsigned char c) // WRITE { SET_DATA(c); // __delay_us(2); Lcd_Strobe(); __delay_us(40); } void lcd_clear(void){ //CLEARNING LCD_RS = 0; lcd_write(0x01); __delay_ms(2); } void lcd_init(){ LCD_RS = 0; LCD_EN = 0; __delay_ms(150); // wait 15mSec after power applied, SET_DATA(0x30); Lcd_Strobe(); __delay_ms(5); SET_DATA(0x30); Lcd_Strobe(); __delay_us(100); SET_DATA(0x30); Lcd_Strobe(); __delay_us(200); SET_DATA(CMD_SETFUNCTION); Lcd_Strobe(); __delay_us(200); lcd_write(CMD_SETFUNCTION); // Set interface length lcd_write(CMD_SETDISPLAY); // Display On, Cursor off, Cursor Blink off lcd_clear(); __delay_us(10); lcd_write(CMD_SETMODE); // Set entry Mode } Файлик с описаниями/присвоениями io_pins.c #define LCD_RS RA3 #define LCD_EN RA2 #define TRIS_EN TRISA2 #define TRIS_RS TRISA3 #define D0_PIN RD0 #define D1_PIN RD1 #define D2_PIN RD2 #define D3_PIN RD3 #define D4_PIN RD4 #define D5_PIN RD5 #define D6_PIN RD6 #define D7_PIN RD7 #define CMD_SETFUNCTION 0b00111000 // |||||- * // ||||-- * // |||--- F: 1-5x10 dots, 0-5x8 dots // ||---- N: 1-2 lines, 0-1 lines // |----- DL:1-8 bits, 0-4 bits #define CMD_SETDISPLAY 0b00001111 // |||- B: 1-on, 0-off blinks // ||-- C: 1-on, 0-off cursor // |--- D: 1-on, 0-off display #define CMD_SETMODE 0b00000110 // ||- S : 1-shift, 0-not shift // |-- ID: 1-Inc, 0-Dec #define CMD_SHIFT 0b00010000 // ||||- * // |||-- * // ||--- RL: 1-shift right, 0-shift left // |---- SC: 1-display shift, 0-cursor move Курсор стоит на второй ячейке и мигает))) теперь я могу сразу вводить данные, но можно сначала курсор поставить в нужное место... ?!
  9. Алекс, нужна помощь - я еще не сильно понимаю Си по этому помоги с вот этим куском кода. Ничего не понял sprintf(lcd_buff, "Hello !!!"); lcd_gotoxy(0,0); lcd_puts(lcd_buff); .............................. /*******************************************************/ void lcd_puts(char * s){ while(*s) lcd_putch(*s++); } /*******************************************************/ void lcd_putch(char c){ RS_PIN = 1; lcd_write(chr_to_cyr(c)); } /*******************************************************/
  10. С датчиком температуры разобрался - и в железе работает. Теперь хочу выводить все на ЖК 16*2 Пишу пробный код: #include <stdio.h> #include <pic.h> #include <htc.h> #define _XTAL_FREQ 4000000 #define LCD_RS RA3 #define LCD_RW RA2 #define LCD_EN RA1 #define LCD_DATA PORTD // void lcd_init(); void pic_init(); void lcd_out(); void main(void) { pic_init(); lcd_init(); lcd_out(); for(;; } /* ИНИЦИАЛИЗАЦИЯ PIC */ void pic_init() { ADCON1 = 0x06; // Disable analog pins on PORTA TRISA=0; TRISB=0; TRISD=0; PORTA=0b11111111; PORTB=0; PORTD=0; } /* ИНИЦИАЛИЗАЦИЯ LCD - 8 bit mode */ void lcd_init() { PORTA=0; __delay_ms(150); // Ждем больше 1 сек __delay_ms(150); __delay_ms(150); __delay_ms(150); __delay_ms(150); __delay_ms(150); __delay_ms(150); LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; LCD_DATA = 0b00110000; __delay_ms(4); LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; LCD_DATA = 0b00110000; __delay_us(100); LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; LCD_DATA = 0b00110000; __delay_us(40); LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; LCD_DATA = 0b00111111; // 0 0 1 DL N F * * __delay_us(40); LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; LCD_DATA = 0b00001111; // 0 0 0 0 1 D C B __delay_us(40); LCD_DATA = 0b00000001; // Очистка дисплея LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; LCD_DATA = 0b00000110; // 0 0 0 0 0 1 I/D S __delay_us(40); RB0 = 1; } void lcd_out() { LCD_RS = 0; LCD_EN = 1; LCD_DATA = 0x00; __delay_us(50); LCD_RS = 0; LCD_EN = 0; __delay_us(100); __delay_us(155); LCD_RS = 0; LCD_EN = 1; LCD_DATA = 0x33; __delay_us(50); LCD_RS = 0; LCD_EN = 0; } Моделирую в протеусе - полная тишина. Походу даже инициализация не прошла...
  11. Продолжаю мучать Си и железо. Прога для измерения температуры. Отображение с помощью светодиодной шкалы... датчик 18b20+pic16f887+8LED #include <stdio.h> #include <pic.h> #include "usart.h" #define STATE TRISA1 #define PIN RA1 #define _XTAL_FREQ 4000000 char temperature; unsigned char temp_drob; unsigned char sign; // ОБЪЯВЛЕНИЕ ФУНКЦИЙ void get_temp(); // 1.ЗАМЕР ТЕМПЕРАТУРЫ void TX(unsigned char cmd); // 2.ПЕРЕДАЧА настроек датчику unsigned char RX(); // 3.ПОЛУЧЕНИЕ данных температуры static bit INIT(void); // 4.Инициализация датчика // *****ОСНОВНАЯ ПРОГРАММА***** void main(void){ unsigned char i; ANSEL=0; INTCON=0; // purpose of disabling the interrupts. TRISD=0b00000000; while(1) { get_temp(); if (temperature>0) i=0; if (temperature>10) i=1; if (temperature>20) i=2; if (temperature>30) i=3; if (temperature>40) i=4; if (temperature>50) i=5; if (temperature>60) i=6; if (temperature>70) i=7; switch (i) { case 0: PORTD=0b00000001;break; case 1: PORTD=0b00000011;break; case 2: PORTD=0b00000111;break; case 3: PORTD=0b00001111;break; case 4: PORTD=0b00011111;break; case 5: PORTD=0b00111111;break; case 6: PORTD=0b01111111;break; case 7: PORTD=0b11111111;break; default: ; } __delay_ms(150); } } // ТУТА БУДУТ ФУНКЦИИ void get_temp(void) { // 1.ЗАМЕР ТЕМПЕРАТУРЫ static bit init; unsigned char temp1; unsigned char temp2; init = INIT(); if (!init) { //успешно инициализировались? TX(0xCC); TX(0x44); __delay_ms(150); //ждем 750 мс __delay_ms(150); __delay_ms(150); __delay_ms(150); __delay_ms(150); } init = INIT(); //повторная инициализация if (!init) { TX(0xCC); TX(0xBE); //команда на чтение temp1 = RX(); //читаем младший байт temp2 = RX(); //читаем старший байт } temp_drob = temp1 & 0b00001111; //Записываем дробную часть в отдельную переменную temp_drob = ((temp_drob*6)+2)/10; //Переводим в нужное дробное число temp1 >>= 4; sign = temp2 & 0x80; //определяем знак температуры temp2 <<= 4; temp2 &= 0b01110000; temp2 |= temp1; //помещаем все в одну переменную if (sign) { //если минус temperature = 127-temp2; //глобальная переменная temp_drob = 10 - temp_drob; //глобальная переменная } else temperature = temp2; } void TX(unsigned char cmd){// 2.ПЕРЕДАЧА настроек датчику unsigned char temp = 0; unsigned char i = 0; temp = cmd; for (i=0;i<8;i++) { if (temp&0x01) { STATE = 0; //передаем 1 __delay_us(5); STATE = 1; __delay_us(70); } else { //передаем 0 STATE = 0; __delay_us(70); STATE = 1; __delay_us(5); } temp >>= 1; } } unsigned char RX() { // 3.ПОЛУЧЕНИЕ данных температуры unsigned char d = 0; unsigned char i = 0; for (i=0;i<8;i++) { STATE = 0; //прижимаем линию __delay_us(6); STATE = 1; d>>=1; //освобождаем место под новый бит if (PIN == 1) d |= 0x80; //если 1 то записываем 1 __delay_us(70); //ждем до положенного времени } return d; } static bit INIT(void){ // 4.Инициализация датчика static bit b; STATE = 1; STATE = 0; //Проваливаем линию __delay_us(500); //Ждем 500 мкс STATE = 1; //Переключаемся на вход __delay_us(65); //Ждем 65 мкс b = PIN; //Смотрим чего там на линии __delay_us(450); //Дожидаемся до положенного временного интервала return b; //Возвращаем 0 или 1 } завтра буду оптимизировать код(большая часть кода - sarge и стандартные библиотеки) и делать в железе(в Протеусе - работает) еще распишу работу с датчиком - то что я понял... ))) Line term.zip
  12. Вот скрин проэкта Чтобы не забывать буду писать все свои шаги... может кому-то еще пригодится. организация функции задержки во включенном файле pic.h есть такое: /****************************************************************/ /* Built-in delay routine */ /****************************************************************/ #pragma inline(_delay) extern void _delay(unsigned long); // NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) #endif В заголовок добавить нужно еще значение тактовой частоты: #define _XTAL_FREQ 4000000 в коде проги: __delay_us(500); ... вопрос к знающим:
  13. Пасиб ребята за помощь! по конфигу: В шапке проги указан #include <htc.h> Захожу в него, тама в начале есть такое: #ifndef _PIC_H_ #define _PIC_H_ #ifndef _HTC_H_ #include <htc.h> #endif #ifdef _HAS_OSCVAL_ extern unsigned char __osccal_val(void); #endif #include <chip_select.h> #endif На сколько я понимаю этот кусок добавляет нам еще часть <htc.h> и <chip_select.h>, захожу в <chip_select.h>: /* * Select device-specific header file */ #ifndef _CHIP_SELECT_H_ #define _CHIP_SELECT_H_ ..... ..... ..... #ifdef _16F887 #ifdef _LEGACY_HEADERS #include <legacy/pic16f887.h> #else #include <pic16f887.h> #endif #endif ....... ....... и в <pic16f887.h> есть все.... что не так? ************************************************************************* Кажется понял: HI-TECH C PRO for the PIC10/12/16 MCU family (Lite) V9.60PL5 Copyright (C) 1984-2009 HI-TECH SOFTWARE (1273) Omniscient Code Generation not available in Lite mode (warning) Error [800] C:\Users\ZloyLeva\AppData\Local\Temp\s5jc.; 41. undefined symbol "WDTE_OFF" Error [800] C:\Users\ZloyLeva\AppData\Local\Temp\s5jc.; 41. undefined symbol "FOSC_INTRC_NOCLKOUT" ********** Build failed! ********** (1273) Omniscient Code Generation not available in Lite mode (warning) - Типа в лайт версии это не работает?
  14. Походу различие есть и еще и наверное будут Пример для порта В в 887 есть регистр ANSELH который отвечает за то каким будет вход цифровой или аналоговый а в 877 такого не нашел Код моей мигалки теперь такой(кнопка отжата - светимся, нажата - гасим) #include <pic.h> __CONFIG(0xEFFF); #define bt1 RB0 // кнопка #define led0 RD0 // светодиод podgot (); // подготовка МК main () { podgot(); PORTD=1; while(1) { // начало бесконечного цикла if (bt1==1){ PORTD=0b11111111; } PORTD=0b00000000; } // конец бесконечного цикла } // === подготовка МК podgot () { ANSELH = 0b00000000; //Переключаем на цифровые входы TRISB = 0b11111111; // направление работы ножек порта TRISD = 0b00000000; // направление работы ножек порта PORTD = 0; // очищаем порт PORTB = 0; // очищаем порт } ****************************************** ПОЗЖЕ************ Почему кода пишу слово конфигурации __CONFIG(FOSC_INTRC_NOCLKOUT); А если объявить в начале #define FOSC_INTRC_NOCLKOUT 0xFFFC или __CONFIG(0xFFFC); Ведь тама в начале файлик в котором все должно быть описано?
  15. Компилятор достался бесплатно(условно), пока месть буду осиливать его - считаю дергаться можно когда уже чего-то можешь. Мануал жаль на английском, буду значит осиливать такой. ... ... спасибо, камень новый для меня буду учить по ходу движения)))
×
×
  • Create New...