Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Да, кстати. И я не обратил внимание на названия функций. Они читают/записывают только один байт.
Аватара пользователя
Gek0n
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт мар 04, 2010 19:53:19
Откуда: Россия, Краснодарский край, Армавир
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Gek0n »

Есть проблема. Пытаюсь считывать нажатие кнопки на 0 ножке порта B мк AVR ATTiny25 (всего 8 ножек). Работаю через Avr Studio 4.13.

Считываю состояние ножки строчкой: "while (PINB.0==0) {...}". Компилятор в ответ пишет что ожидал закрывающейся скобки перед константой (0). То есть он не понимает обращение к ножке порта через точку.

На других сайтах прочитал, что лучше считывать выход через регистр PORTx вместо PINx. Пожалуйста внесите ясность - как правильно считывать и устанавливать только одну ножку порта, и через какой регистр?
Аватара пользователя
Chiper
Грызет канифоль
Сообщения: 251
Зарегистрирован: Ср окт 07, 2009 18:37:22
Откуда: BMSTU

Re: PICC для PIC

Сообщение Chiper »

Вопрос конечно вообще детский...
Как вывести переменную на 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 коды :D

http://cs407519.userapi.com/v407519171/ ... nrXCJ4.jpg
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Вопросы по С/С++ (СИ)

Сообщение hybroid »

Gek0n писал(а):Компилятор в ответ пишет что ожидал закрывающейся скобки перед константой (0). То есть он не понимает обращение к ножке порта через точку.
Конечно не понимает. Там же вроде бы GCC. Гуглите побитовые операции.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

avreal писал(а):Нужен eeprom_read_wotd для чтения двухбайтового объекта.

Не знаток СИ, но м.б. eeprom_read_word ?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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)) {...}
I am DX168B and this is my favourite forum on internet!
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: Вопросы по С/С++ (СИ)

Сообщение BorisSPB »

DX168B писал(а):В GCC все делается по стандарту Си.

Если порт описан как битовое поле, то почему бы не использовать это описание. Это вполне в рамках стандарта. Надо только посмотреть описание порта в заголовочном файле на контроллер. Судя по сообщению GekOnа проблема в том, что идентификатор не может начинаться с цифры. Должно быть что-то вроде
Аватара пользователя
eess9
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Re: Вопросы по С/С++ (СИ)

Сообщение eess9 »

Спасибо всем котам за помощь.
Решение следующее:
Объявляем переменные

Код: Выделить всё

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: Вопросы по С/С++ (СИ)

Сообщение DX168B »

Для данной архитектуры, int является двухбайтным. А если хотите более кроссплатформенный код, то можно будет объявить ее, как short int. (например, unsigned short int Timer;)
Тогда она будет двухбайтной независимо от архитектуры.
А вам нужна была переменная char \ unsigned char. Она однобайтная.

ЗЫ: Знающие пусть подправят, если что-то не точно. :)
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PICC для PIC

Сообщение Аlex »

Chiper писал(а):Вопрос конечно вообще детский...
Как вывести переменную на LCD дисплей? :confused:
Через sprintf.
Аватара пользователя
Gek0n
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт мар 04, 2010 19:53:19
Откуда: Россия, Краснодарский край, Армавир
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Gek0n »

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: Вопросы по С/С++ (СИ)

Сообщение avreal »

Gudd-Head писал(а):
avreal писал(а):Нужен eeprom_read_wotd для чтения двухбайтового объекта.
Не знаток СИ, но м.б. eeprom_read_word ?
Конечно. Промахнулся по клавише.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Protobear
Прорезались зубы
Сообщения: 244
Зарегистрирован: Вс апр 17, 2011 21:38:10

С++

Сообщение Protobear »

Странная работа функции strlen
выдает на 3 символа более длинную строку чем есть - в чем может быть дело?
#include<iostream>

using namespace std;

int main()
{
char s[16]="1234567812345678";

cout << strlen(s);
system("pause");
}
Вложения
2.jpg
(11.78 КБ) 459 скачиваний
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Так это Вам ещё повезло. Могли и пару миллионов получить.
Только 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: Вопросы по С/С++ (СИ)

Сообщение DX168B »

помоему, strlen показывает размер не массива строки, а размер до первого значения конца строки '\n'
никогда ею не приходилось пользоваться. пользовался самописной.
I am DX168B and this is my favourite forum on internet!
juzik
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Re: Вопросы по С/С++ (СИ)

Сообщение juzik »

Функция strlen показывает сколько символов в массиве char'ов до первого \0 (null) символа.
Т.е. ваш массив должен быть таким:
char s[17]="1234567812345678\0";
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Вопросы по С/С++ (СИ)

Сообщение a_skr »

char s[17]="1234567812345678\0"; - здесь ноль в конце лишний.

при объявлении
char s[]="1234567812345678";
или
char s[17]="1234567812345678";
выделяется 17 байт (для sizeof(char)=1) и дополняется нулем в конце.
juzik
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Re: Вопросы по С/С++ (СИ)

Сообщение juzik »

Я бы не был так в этом уверен. Какие гарантии того, что компилятор инициализирует корректно переменную? Я думаю это будет зависить от версии спецификации компилятора. И для перестраховки имеет смысл явно инициализировать все перемнные, где это имеет место.

Язык С ничего не знает о строках. Он интерпертирует их как массив символов и сам вставлять символы конца строки (\0) не умеет.
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Re: Вопросы по С/С++ (СИ)

Сообщение __Alexander »

умеет

вот с ИАР


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 скачиваний
mastech
Грызет канифоль
Сообщения: 269
Зарегистрирован: Чт мар 11, 2010 17:45:37
Откуда: г.фрязино

Re: Вопросы по С/С++ (СИ)

Сообщение mastech »

у меня вопрос по Си как понять эти символы << - это вроде смещение влево а это >> а это вправо, просто не могу понять их работу.

их вроде можно записать по другому?

пример:

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);
}
Ответить

Вернуться в «Разные вопросы по МК»