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

Здесь вопросы новичков

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

Сообщение 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
aandr83
 
Сообщения: 3
Зарегистрирован: 24 ноя 2011, 01:17

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.
akl
 
Сообщения: 143
Зарегистрирован: 21 дек 2008, 07:27
Откуда: Ижевск

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

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

Если не затруднит, подскажите простенький цифровой тепературный датчик, и вид его данных которые он выдает на порт контроллера(там допустим семь разрадов...), хочу соеденить его по TWI и I2C.
aandr83
 
Сообщения: 3
Зарегистрирован: 24 ноя 2011, 01:17

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

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

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

У них интерфейс 1-wire/
Вложения
Thermometer DS18B20.rar
Исходники для ATtiny2313 и DS18b20. Вывод на дисплей 16*2
(5.81 КБ) Скачиваний: 515
Аватара пользователя
Мужик
 
Сообщения: 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(' ');   
   }


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


Вернуться в В помощь начинающим



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

Зарегистрированные пользователи: нет зарегистрированных пользователей

cron