Уведомления
Очистить все

Посмотрите на код

5 Посты
3 Пользователи
0 Likes
6,231 Просмотры
aandr83
(@aandr83)
New Member
Присоединился: 12 лет назад
Сообщения: 3
Topic starter  

Я только начинаю изучать. Проверьте правильность кода.
.include "C:Program Files (x86)AtmelAVR ToolsAvrAssembler2Appnotesm16def.inc"
.cseg
.org 0
; регистры общего назначения
.def temp0=R16
.def tra=R17
//.def temp2=R18
//.def min_t=R19
//.def max_t=R20

;Начало программы
main:
;прием

out DDRC,temp0; оператор вывода данных из РОН в другие регистры (Порт C делаем вводом)
in tra, PinC

;какая нибцдь обработка

;передача
ldi temp0,0xFF;Присваиваем РОН temp значение 11111111 (на вывод)
out DDRB,temp0; оператор вывода данных из РОН в другие регистры (Порт B делаем выводом)
in tra, PinB
rjmp main


Цитата
akl
 akl
(@akl)
Estimable Member
Присоединился: 15 лет назад
Сообщения: 144
 

... Проверьте правильность кода.
;передача
ldi temp0,0xFF;Присваиваем РОН temp значение 11111111 (на вывод)
out DDRB,temp0; оператор вывода данных из РОН в другие регистры (Порт B делаем выводом)
in tra, PinB ;???????????

Для вывода информации нужно использовать
OUT PORTB,tra
Кстати, работа порта С у mega16 определяется состоянием FUSE-бит JTAG.


ОтветитьЦитата
aandr83
(@aandr83)
New Member
Присоединился: 12 лет назад
Сообщения: 3
Topic starter  

Если не затруднит, подскажите простенький цифровой тепературный датчик, и вид его данных которые он выдает на порт контроллера(там допустим семь разрадов...), хочу соеденить его по TWI и I2C.


ОтветитьЦитата
Мужик
(@yk)
Eminent Member
Присоединился: 15 лет назад
Сообщения: 39
 

Самый ходовой - ds1820 (точность 0,5 С) или его более точный аналог DS18b20.

У них интерфейс 1-wire/


ОтветитьЦитата
Мужик
(@yk)
Eminent Member
Присоединился: 15 лет назад
Сообщения: 39
 

Все исходники по термометру прикрепил в предыдущем сообщении.

Вот сам исходник:

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>

#include <lcd.h>

#define DSPORT PORTD
#define DSDDR DDRD
#define DSPIN PIND
#define DSPINNUM 2

#define DQ_1 DSDDR &= ~(1<<DSPINNUM) // отпустить шину, вход
#define DQ_0 DSDDR |= (1<<DSPINNUM); DSPORT &= ~(1<<DSPINNUM) // подсадить шину 1-wire

#define OK 0
#define FAIL 1

char temperature[]="Temp.= ";
char reset_ok[]="reset_ok";
char reset_error[]="DS not connected";

unsigned char ds[3]= {0, 0, 0}; // целая часть, десятая часть, знак
unsigned char part=0;
unsigned char d100=0, d10=0, d=0;

unsigned char ds_reset(void);
void ds_write(unsigned char);
unsigned char ds_read(void);
void ds_convert(void);
unsigned int ds_read_temperature(void);

unsigned char ds_reset(void) {
DQ_0;
_delay_us(500); // min 480us - Импульс сброса
DQ_1;
_delay_us(80); // 80uS
if((DSPIN & (1<<DSPINNUM)) == (1<<DSPINNUM)) {
showstr(reset_error);
_delay_ms(100);
return FAIL; // если не подсажена шина то датчик не подключен
}
else{
_delay_us(500);
return OK;
}
}

void ds_write(unsigned char data) {
unsigned char count;
for(count=0; count<8; count++) {
DQ_0;
_delay_us(2); // 2us - синхроимпульс
if ((data & 0x01) == 0x01){
DQ_1;
} else DQ_0;
data = data >>1;
_delay_us(70); // 70us - Time Slot
DQ_1; // отпустили шину
_delay_us(2); // 2us - до след. бита (recovery time)
}
}

unsigned char ds1820_read(void) {
unsigned char count, data=0x00;
for(count=0; count<8; count++) {
DQ_0;
_delay_us(2);
DQ_1; // release bus
_delay_us(8);
data = data >>1; //logic shift right
if ((DSPIN & (1<<DSPINNUM)) == (1<<DSPINNUM)){
data |= 0b10000000;
}
_delay_us(70);
}
return data;
}

void ds_convert(void){
if (ds_reset() == OK) {
ds_write(0xCC); // Skip ROM command
ds_write(0x44); // Start Convert
}
}

unsigned int ds_read_temperature(void){
unsigned char temp, temp2;
if(ds_reset() == OK) {
ds_write(0xCC); // Skip ROM command
ds_write(0xBE); // Read Scratchpad
ds[0] = ds1820_read();
ds[1] = ds1820_read();

temp = ((ds[0]>>4) & 0b00001111) | (( ds[1]<<4) & 0b01110000);
temp2 = ds[0]& 0x0F;

if ((ds[1] & 0xF0) == 0) ds[2]='+';
else ds[2]='-';
ds[0]=temp;
ds[1]=temp2;

return OK;
}
else return FAIL;
}

int main (void) {
DQ_1;
ds_reset();
lcdinit();
clearlcd();
_delay_ms(100);
while(1){

home();
ds_convert();
_delay_ms(760);
showstr(temperature);
if (ds_read_temperature() == OK){ // опрос DS18B20 успешен
d=48;
d10=48;
d100=48;
while (ds[0] >= 100){
ds[0] = ds[0]-100;
d100++;
}

while (ds[0] >= 10){
ds[0] = ds[0] - 10;
d10++;
}

while (ds[0] > 0){
ds[0]--;
d++;
}

//}

if (ds[2] == '-') lcddata('-');

if (d100 != 48) lcddata(d100);
if (!((d100 == 48)&&(d10 == 48))) lcddata(d10); //
lcddata(d);

if ( (ds[1] & 0b00001000) != 0){
lcddata(',');
lcddata('5');
}
else{
lcddata(',');
lcddata('0');
}

lcddata(' ');
lcddata('C');
lcddata(' ');
lcddata(' ');
lcddata(' ');
lcddata(' ');
lcddata(' ');
}

}
}


ОтветитьЦитата