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

Здесь вопросы новичков
Ответить
aandr83
Сообщения: 3
Зарегистрирован: 24 ноя 2011, 01:17

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

Сообщение aandr83 » 25 ноя 2011, 21:59

Я только начинаю изучать. Проверьте правильность кода.
.include "C:\Program Files (x86)\Atmel\AVR Tools\AvrAssembler2\Appnotes\m16def.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
Сообщения: 144
Зарегистрирован: 21 дек 2008, 07:27
Откуда: Ижевск
Контактная информация:

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

Сообщение akl » 26 ноя 2011, 05:21

aandr83 писал(а):... Проверьте правильность кода.

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

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

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

OUT PORTB,tra
Кстати, работа порта С у mega16 определяется состоянием FUSE-бит JTAG.

aandr83
Сообщения: 3
Зарегистрирован: 24 ноя 2011, 01:17

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

Сообщение aandr83 » 26 ноя 2011, 13:02

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

Аватара пользователя
Мужик
Сообщения: 39
Зарегистрирован: 15 ноя 2008, 21:36

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

Сообщение Мужик » 28 ноя 2011, 21:22

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

У них интерфейс 1-wire/
Вложения
Thermometer DS18B20.rar
Исходники для ATtiny2313 и DS18b20. Вывод на дисплей 16*2
(5.81 КБ) 530 скачиваний

Аватара пользователя
Мужик
Сообщения: 39
Зарегистрирован: 15 ноя 2008, 21:36

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

Сообщение Мужик » 28 ноя 2011, 21:23

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

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

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

#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(' ');	
	} 


  }
}

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость