при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Код: Выделить всё
Compiling C: lcd_lib.c
avr-gcc -c -mmcu=atmega168p -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./lcd_lib.lst -std=gnu99 -Wundef -MMD -MP -MF .dep/lcd_lib.o.d lcd_lib.c -o lcd_lib.o
Linking: main.elf
avr-gcc -mmcu=atmega168p -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -Wundef -MMD -MP -MF .dep/main.elf.d main.o lcd_lib.o --output main.elf -Wl,-Map=main.map,--cref -lm
lcd_lib.o: In function `I2C_StartCondition':
E:\1\mod_168/lcd_lib.h:25: multiple definition of `I2C_StartCondition'
main.o:E:\1\mod_168/lcd_lib.h:25: first defined here
lcd_lib.o: In function `I2C_StopCondition':
E:\1\mod_168/lcd_lib.h:32: multiple definition of `I2C_StopCondition'
main.o:E:\1\mod_168/lcd_lib.h:32: first defined here
lcd_lib.o: In function `I2C_SendByte':
E:\1\mod_168/lcd_lib.h:38: multiple definition of `I2C_SendByte'
main.o:E:\1\mod_168/lcd_lib.h:38: first defined here
lcd_lib.o: In function `I2C_Init':
E:\1\mod_168/lcd_lib.h:46: multiple definition of `I2C_Init'
main.o:E:\1\mod_168/lcd_lib.h:46: first defined here
lcd_lib.o: In function `I2C_SendPocket':
E:\1\mod_168/lcd_lib.h:51: multiple definition of `I2C_SendPocket'
main.o:E:\1\mod_168/lcd_lib.h:51: first defined here
lcd_lib.o: In function `I2C_RecieveByte':
E:\1\mod_168/lcd_lib.h:63: multiple definition of `I2C_RecieveByte'
main.o:E:\1\mod_168/lcd_lib.h:63: first defined here
lcd_lib.o: In function `I2C_RecieveLastByte':
E:\1\mod_168/lcd_lib.h:73: multiple definition of `I2C_RecieveLastByte'
main.o:E:\1\mod_168/lcd_lib.h:73: first defined here
make.exe: *** [main.elf] Error 1
> Process Exit Code: 2
> Time Taken: 00:01Код: Выделить всё
#ifndef LCD_LIB_H
#define LCD_LIB_H
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
// отправка команды СТАРТ
void I2C_StartCondition(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));//ожидание установки бита TWIN
}
// отправка СТОП
void I2C_StopCondition(void)
{
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}
//отправка байта
void I2C_SendByte(unsigned char c)
{
TWDR = c;//загрузка значения в регистр данных
TWCR = (1<<TWINT)|(1<<TWEN);//начаало передачи байта данных
while (!(TWCR & (1<<TWINT)));//ожидание установки бита TWIN
}
//инициализация I2C как передатчика
void I2C_Init (void)
{
TWBR=0xFF;//скорость передачи
}
//отправка SLA_W + байт данных
void I2C_SendPocket (unsigned char value,unsigned char adres_rw)
{
I2C_StartCondition(); // генерируем условие СТАРТ
I2C_SendByte(adres_rw); //оправляем адрес устройства+бит запись
I2C_SendByte(value);//отправляем байт данных
I2C_StopCondition();//генерируем условие СТОП
}
//добавляем функции чтения по I2C
//чтение байта
unsigned char I2C_RecieveByte(void)
{
unsigned char dat;//переменная хранения значения
TWCR |= (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
while (!(TWCR & (1<<TWINT)));//ожидание установки бита TWIN
dat = TWDR;//читаем регистр данных
return dat;
}
//чтение последнего байта
unsigned char I2C_RecieveLastByte(void)
{
unsigned char dat;//переменная хранения значения
TWCR |= (1<<TWINT)|(1<<TWEN)|(0<<TWEA);//чтение последнего байта
while (!(TWCR & (1<<TWINT)));//ожидание установки бита TWIN
dat = TWDR;//читаем регистр данных
return dat;
}Код: Выделить всё
#include "lcd_lib.h"
#include "codetable.h"
//адрес LCD переходника
#define LCD_ADDR 0b00100111
//макрос адреса + бит записи
#define SLA_W LCD_ADDR<<1
//создаем переменную Эквивалент регистра порта
unsigned char Led_port=0;
//макрос отправки пакетов LCD
#define I2C_SendPocketLCD(x) I2C_SendPocket (x,SLA_W)
/*
таблица соответствия
Po - RS
P1 - R/W
P2 - E
P3 - подсветка
P4 - D4
P5 - D5
P6 - D6
P7 - D7
*/
/* установка лог. "1" на линии RS */
#define LCD_RS_SET I2C_SendPocketLCD (Led_port|=0x01)
/* установка лог. "0" на линии RS */
#define LCD_RS_CLR I2C_SendPocketLCD (Led_port&=~0x01)
/* установка лог. "1"(запись) R/W*/
#define LCD_RW_SET I2C_SendPocketLCD (Led_port|=0x02)
/* установка лог. "0"(Чтение) R/W */
#define LCD_RW_CLR I2C_SendPocketLCD (Led_port&=~0x02)
/* установка лог. "1" на линии E */
#define LCD_E_SET I2C_SendPocketLCD (Led_port |=0x04)
/* установка лог. "0" на линии E */
#define LCD_E_CLR I2C_SendPocketLCD (Led_port &=~0x04)
/* установка лог. "1" на линии подсветки */
#define LCD_BT_SET I2C_SendPocketLCD (Led_port|=0x08)
/* установка лог. "0" на линии подсветки */
#define LCD_BT_CLR I2C_SendPocketLCD (Led_port&=~0x08)
/* функция передачи тетрады в жки */
inline static void LCD_CommonFunc(unsigned char t)
{
t<<=4;
LCD_E_SET;
_delay_us(50);
I2C_SendPocketLCD (Led_port|t);
LCD_E_CLR;
_delay_us(50);
}Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include "lcd_lib.h"
#include "main.h"
#include <avr/wdt.h>
ISR (__vector_default)
{
return;
}
//unsigned char cc=5;
ISR (TIMER0_OVF_vect)
{
static char delenie_in_two = 0;
if(++delenie_in_two == 2)
{
delenie_in_two = 0;Следуя моей логике, можно применять ровно те микросхемы, которые имеются в наличии (либо доступны) и позволяют достичь поставленной цели. Обозначение производителя не имеет вообще никакого значения.scorpi_0n писал(а): Следуя вашей логике уже в самом смысле отсутствует смысл.
слева!Как число 42000 не может входить в 16 битную переменную… с каким знаком?*Trigger* писал(а):150*280 в 16 бит со знаком не влезает.
У меня 65353 получается. Все правильно.hosturik писал(а):не перестаю удивляться. Почему после таког выражения v_batt = (150*280) / 128;
в переменной v_batt находится число 65353?
Если бы она участвовало в правой части оператора присваивания, то давало бы, так как когда производится операция между знаковым и беззнаковым целым, до операции знаковое будет преобразовано в беззнаковое.hosturik писал(а):
И то, что у меня v_batt объявлена так: volatile unsigned int v_batt; ничего не дает?
Данная запись эквивалентна ADMUX = (1<<REFS0)|(1<<ADLAR);hosturik писал(а):ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
Код: Выделить всё
; 16 bit right shift
lsr r20
ror r21
;
; 16 bit left shift
lsl r21
rol r20
Благодарю. Думаю в моем случае можно сделать такptr128 писал(а):На примере AVR. Пусть у нас число располагается в двух регистрах. Старший байт в r20 и младший в r21Код: Выделить всё
; 16 bit right shift lsr r20 ror r21 ; ; 16 bit left shift lsl r21 rol r20
ptr128 писал(а):Код: Выделить всё
; 16 bit left shift lsl r21 rol r20