Вопросы по С/С++ (СИ)
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Да, кстати. И я не обратил внимание на названия функций. Они читают/записывают только один байт.
- Gek0n
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт мар 04, 2010 19:53:19
- Откуда: Россия, Краснодарский край, Армавир
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Есть проблема. Пытаюсь считывать нажатие кнопки на 0 ножке порта B мк AVR ATTiny25 (всего 8 ножек). Работаю через Avr Studio 4.13.
Считываю состояние ножки строчкой: "while (PINB.0==0) {...}". Компилятор в ответ пишет что ожидал закрывающейся скобки перед константой (0). То есть он не понимает обращение к ножке порта через точку.
На других сайтах прочитал, что лучше считывать выход через регистр PORTx вместо PINx. Пожалуйста внесите ясность - как правильно считывать и устанавливать только одну ножку порта, и через какой регистр?
Считываю состояние ножки строчкой: "while (PINB.0==0) {...}". Компилятор в ответ пишет что ожидал закрывающейся скобки перед константой (0). То есть он не понимает обращение к ножке порта через точку.
На других сайтах прочитал, что лучше считывать выход через регистр PORTx вместо PINx. Пожалуйста внесите ясность - как правильно считывать и устанавливать только одну ножку порта, и через какой регистр?
Re: PICC для PIC
Вопрос конечно вообще детский...
Как вывести переменную на LCD дисплей? :confused:
LCD.H
Вместо переменной выводит какую-то джигурду... Я так понимаю, что дисплей воспринимает значение переменной как ASCII коды
http://cs407519.userapi.com/v407519171/ ... nrXCJ4.jpg
Как вывести переменную на LCD дисплей? :confused:
Код: Выделить всё
#include <htc.h>
#include "lcd.h"
//#include <pic16f628a.h>
__CONFIG ( WDTE_ON & FOSC_INTOSCIO & LVP_ON & MCLRE_ON );// Биты конфиг. контролера
//*******************************************************//
//*******************************************************//
//*******************************************************//
void main (void)
{
CMCON = 0x07;
int bar;
int test;
bar = 13;
test = bar / 6;
lcd_init();
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("Test LCD");
lcd_gotoxy(1,0);
lcd_puts(test);
}
//*******************************************************//
LCD.H
Код: Выделить всё
//***************************************************//
//****** Файл lcd.h *********************************//
//****** Модуль для работы с LCD ********************//
//****** Компилятор HI-TECH PICC ********************//
//****** Автор Клюшников Алексей. al.kl@list.ru *****//
//***************************************************//
#define X_FREC 4 // Частота кварца (Mz)
//---------- Пины ----------//
#define RS_PIN A1 // Вывод RS
#define EN_PIN A3 // Вывод EN
#define D4_PIN B0 // Вывод D4
#define D5_PIN B1 // Вывод D5
#define D6_PIN B2 // Вывод D6
#define D7_PIN B3 // Вывод D7
//---Разрешение экрана. ----------//
#define LCD_MODE_1x8 0
#define LCD_MODE_1x16_A 0
#define LCD_MODE_1x16_B 0
#define LCD_MODE_1x40 0
#define LCD_MODE_2x8 0
#define LCD_MODE_2x12 0
#define LCD_MODE_2x16 1
#define LCD_MODE_2x20 0
#define LCD_MODE_2x24 0
#define LCD_MODE_2x40 0
#define LCD_MODE_4x16 0
#define LCD_MODE_4x20 0
#define LCD_MODE_4x24 0
#define LCD_MODE_4x40 0
//----------//
extern void lcd_init(void);
extern void lcd_clear(void);
extern void lcd_gotoxy(char row, char col);
extern void lcd_puts(const char *s);
extern void lcd_putch(char);
//----------//Вместо переменной выводит какую-то джигурду... Я так понимаю, что дисплей воспринимает значение переменной как ASCII коды
http://cs407519.userapi.com/v407519171/ ... nrXCJ4.jpg
Re: Вопросы по С/С++ (СИ)
Конечно не понимает. Там же вроде бы GCC. Гуглите побитовые операции.Gek0n писал(а):Компилятор в ответ пишет что ожидал закрывающейся скобки перед константой (0). То есть он не понимает обращение к ножке порта через точку.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Вопросы по С/С++ (СИ)
avreal писал(а):Нужен eeprom_read_wotd для чтения двухбайтового объекта.
Не знаток СИ, но м.б. eeprom_read_word ?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Gek0n писал(а):Есть проблема. Пытаюсь считывать нажатие кнопки на 0 ножке порта B мк AVR ATTiny25 (всего 8 ножек). Работаю через Avr Studio 4.13.
Считываю состояние ножки строчкой: "while (PINB.0==0) {...}". Компилятор в ответ пишет что ожидал закрывающейся скобки перед константой (0). То есть он не понимает обращение к ножке порта через точку.
На других сайтах прочитал, что лучше считывать выход через регистр PORTx вместо PINx. Пожалуйста внесите ясность - как правильно считывать и устанавливать только одну ножку порта, и через какой регистр?
В GCC все делается по стандарту Си.
Отучайтесь от CV AVR
Код: Выделить всё
//считывание состояния ноги
if(PINB & (1<<PB0)) {действие}
//или так:
if(! PINB & (1<<PB0)){действие}
Так же опрашивается и в цикле while
Код: Выделить всё
while(PINB &(1<<PB0)) {...}
//или
while(! PINB &(1<<PB0)) {...}
I am DX168B and this is my favourite forum on internet!
Re: Вопросы по С/С++ (СИ)
DX168B писал(а):В GCC все делается по стандарту Си.
Если порт описан как битовое поле, то почему бы не использовать это описание. Это вполне в рамках стандарта. Надо только посмотреть описание порта в заголовочном файле на контроллер. Судя по сообщению GekOnа проблема в том, что идентификатор не может начинаться с цифры. Должно быть что-то вроде
Код: Выделить всё
PINB.b0- eess9
- Вымогатель припоя
- Сообщения: 672
- Зарегистрирован: Ср фев 29, 2012 01:58:32
- Откуда: Харьков, Украина
Re: Вопросы по С/С++ (СИ)
Спасибо всем котам за помощь.
Решение следующее:
Объявляем переменные
А теперь спокойно работаем с eeprom
За помощь в определении, что действительно надо передавать не байт , а два спасибо. Лопухнулся что-то. Но также компилятор ругался на тип unsigned int.
Решение следующее:
Объявляем переменные
Код: Выделить всё
volatile int TimT0=0b11111111;
volatile int eeprom_TimT0 EEMEM;А теперь спокойно работаем с eeprom
Код: Выделить всё
eeprom_write_word(&eeprom_TimT0,TimT0);
TimT0=eeprom_read_word(&eeprom_TimT0);За помощь в определении, что действительно надо передавать не байт , а два спасибо. Лопухнулся что-то. Но также компилятор ругался на тип unsigned int.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Для данной архитектуры, int является двухбайтным. А если хотите более кроссплатформенный код, то можно будет объявить ее, как short int. (например, unsigned short int Timer;)
Тогда она будет двухбайтной независимо от архитектуры.
А вам нужна была переменная char \ unsigned char. Она однобайтная.
ЗЫ: Знающие пусть подправят, если что-то не точно.
Тогда она будет двухбайтной независимо от архитектуры.
А вам нужна была переменная char \ unsigned char. Она однобайтная.
ЗЫ: Знающие пусть подправят, если что-то не точно.
I am DX168B and this is my favourite forum on internet!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: PICC для PIC
Через sprintf.Chiper писал(а):Вопрос конечно вообще детский...
Как вывести переменную на LCD дисплей? :confused:
- Gek0n
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт мар 04, 2010 19:53:19
- Откуда: Россия, Краснодарский край, Армавир
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
DX168B писал(а):Gek0n писал(а):Есть проблема. Пытаюсь считывать нажатие кнопки на 0 ножке порта B мк AVR ATTiny25 (всего 8 ножек). Работаю через Avr Studio 4.13.
Считываю состояние ножки строчкой: "while (PINB.0==0) {...}". Компилятор в ответ пишет что ожидал закрывающейся скобки перед константой (0). То есть он не понимает обращение к ножке порта через точку.
На других сайтах прочитал, что лучше считывать выход через регистр PORTx вместо PINx. Пожалуйста внесите ясность - как правильно считывать и устанавливать только одну ножку порта, и через какой регистр?
В GCC все делается по стандарту Си.
Отучайтесь от CV AVRКод: Выделить всё
//считывание состояния ноги
if(PINB & (1<<PB0)) {действие}
//или так:
if(! PINB & (1<<PB0)){действие}
Так же опрашивается и в цикле whileКод: Выделить всё
while(PINB &(1<<PB0)) {...}
//или
while(! PINB &(1<<PB0)) {...}
огромное спасибо всем за подсказку. Это мой первый проект на avr, так что вопрос у меня был наверное глупым. Спасибо за помощь и потраченное время.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Конечно. Промахнулся по клавише.Gudd-Head писал(а):Не знаток СИ, но м.б. eeprom_read_word ?avreal писал(а):Нужен eeprom_read_wotd для чтения двухбайтового объекта.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Так это Вам ещё повезло. Могли и пару миллионов получить.
Только strlen не виновата.
Попробуйте свою строку напечатать.
Сделайте кроме того так:
Подумайте о разнице в показаниях двух свидетелей.
Только strlen не виновата.
Попробуйте свою строку напечатать.
Сделайте кроме того так:
Код: Выделить всё
int main()
{
// без указания длины в [ ] -- компилятор автоматически выделит сколько надо
char s[]="1234567812345678";
cout << "strlen = " << strlen(s) << ", sizeof = " << sizeof(s) << eol;
system("pause");
}Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
помоему, strlen показывает размер не массива строки, а размер до первого значения конца строки '\n'
никогда ею не приходилось пользоваться. пользовался самописной.
никогда ею не приходилось пользоваться. пользовался самописной.
I am DX168B and this is my favourite forum on internet!
-
juzik
- Встал на лапы
- Сообщения: 128
- Зарегистрирован: Пт сен 23, 2011 23:49:20
- Откуда: Симферополь, Украина
Re: Вопросы по С/С++ (СИ)
Функция strlen показывает сколько символов в массиве char'ов до первого \0 (null) символа.
Т.е. ваш массив должен быть таким:
char s[17]="1234567812345678\0";
Т.е. ваш массив должен быть таким:
char s[17]="1234567812345678\0";
Re: Вопросы по С/С++ (СИ)
char s[17]="1234567812345678\0"; - здесь ноль в конце лишний.
при объявлении
char s[]="1234567812345678";
или
char s[17]="1234567812345678";
выделяется 17 байт (для sizeof(char)=1) и дополняется нулем в конце.
при объявлении
char s[]="1234567812345678";
или
char s[17]="1234567812345678";
выделяется 17 байт (для sizeof(char)=1) и дополняется нулем в конце.
-
juzik
- Встал на лапы
- Сообщения: 128
- Зарегистрирован: Пт сен 23, 2011 23:49:20
- Откуда: Симферополь, Украина
Re: Вопросы по С/С++ (СИ)
Я бы не был так в этом уверен. Какие гарантии того, что компилятор инициализирует корректно переменную? Я думаю это будет зависить от версии спецификации компилятора. И для перестраховки имеет смысл явно инициализировать все перемнные, где это имеет место.
Язык С ничего не знает о строках. Он интерпертирует их как массив символов и сам вставлять символы конца строки (\0) не умеет.
Язык С ничего не знает о строках. Он интерпертирует их как массив символов и сам вставлять символы конца строки (\0) не умеет.
- __Alexander
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Вт сен 11, 2007 10:27:08
- Откуда: Киев
Re: Вопросы по С/С++ (СИ)
умеет
вот с ИАР
char Mass[] = "123";
char Mass1[] = "abcd";
char len;
void main(void)
{
len = strlen(Mass);
len = strlen(Mass1);
}
первый len равен 3, второй 4.
А теперь идем в протеус и смотрим размещения наших массивов.
вот с ИАР
char Mass[] = "123";
char Mass1[] = "abcd";
char len;
void main(void)
{
len = strlen(Mass);
len = strlen(Mass1);
}
первый len равен 3, второй 4.
А теперь идем в протеус и смотрим размещения наших массивов.
- Вложения
-
- kot.JPG
- (96.51 КБ) 457 скачиваний
Re: Вопросы по С/С++ (СИ)
у меня вопрос по Си как понять эти символы << - это вроде смещение влево а это >> а это вправо, просто не могу понять их работу.
их вроде можно записать по другому?
пример:
while ((PIND&(1 << PD0)) == 1){}
PORTB &= ~(1 << PB0);
весь код:
их вроде можно записать по другому?
пример:
while ((PIND&(1 << PD0)) == 1){}
PORTB &= ~(1 << PB0);
весь код:
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRD = 0x00;
PORTD = 0xFF;
DDRB = 0xFF;
PORTB = 0x00;
while(1)
{
while ((PIND&(1 << PD0)) == 1){}
_delay_us(200);
if ((PINB&(1 << PB0)) == 0)
{
PORTB |= (1 << PB0);
}
else
{
PORTB &= ~(1 << PB0);
}
while ((PIND&(1 << PD0)) == 0){}
_delay_us(200);
}
}