АСМ-WinAvr вопросы

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

АСМ-WinAvr вопросы

Сообщение alexval2006 »

Возникла нужда переписать кое какие наработки на асме на си WinAvr прошу проверить правильность
;--------------------------- Подпрограмма отправки содержимого temp в эфир (начиная с старшего разряда) -------------
outbyte: ldi count,0x08 ; Фиксируем количество передаваемых бит в байте (счётчик = 8)
m2: rol temp ; Сдвиг вправо через перенос регистра temp
brsh zerro ; Переход если бит нолевой
cbi PORTD,0 ; Если бит еденичный - сбрасываем в ноль разряд передачи PD0
rcall zad05t ; Удержание состояния порта D0 на время 500 микр.сек (0,5 периода передачи)
sbi PORTD,0 ; Устанавливаем в еденицу разряд передачи PD0
rcall zad05t ; Удержание состояния порта D0 на время 500 микр.сек (0,5 периода передачи)
rjmp m1 ;
zerro: sbi PORTD,0 ; Устанавливаем в еденицу разряд передачи PD0
rcall zad05t ; Удержание состояния порта D0 на время 500 микр.сек (0,5 периода передачи)
cbi PORTD,0 ; Cбрасываем в ноль разряд передачи PD0
rcall zad05t ; Удержание состояния порта D0 на время 500 микр.сек (0,5 периода передачи)
m1: dec count ; Уменьшение счётчика переданных бит на еденицу
brne m2 ; Если счётчик не пуст, уходим на отправку следующего бита
ret


вот изобразил аналог на си
//;--------------------------- Подпрограмма отправки содержимого temp в эфир (начиная с старшего разряда) -------------
outbyte(char data){
for (char count=0; count<=8; count++){
data=data >> 1;
if (data==0){
PORTD |=_BV(0); // PD=1
_delay_ms(250); // Пауза 250ms
_delay_ms(250); // Пауза 250ms
PORTD &=~_BV(0); // PD=0
_delay_ms(250); // Пауза 250ms
_delay_ms(250); // Пауза 250ms
}else{
PORTD &=~_BV(0); // PD=0
_delay_ms(250); // Пауза 250ms
_delay_ms(250); // Пауза 250ms
PORTD |=_BV(0); // PD=1
_delay_ms(250); // Пауза 250ms
_delay_ms(250); // Пауза 250ms
}
count--;

if (count!=0){
return
}
}
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение ARV »

буквально час назад в соседней теме я давал алгоритм последовательной выдачи битов по SPI - у вас все будет очень похоже. а по вашему коду есть ряд замечаний:
1. в комментах ассемблера написано, что задержки в МИКРОсекундах, а вы используете функции МИЛЛИсекундных задержек.
2. почему 2 раза по 250, а не сразу 500 в задержке?
3. если у вас цикл по count, то трогать эту переменную в конце не надо, как и не надо ее проверять - кончился цикл - значит выход из функции.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение alexval2006 »

1. мой косяк как правильно? _delay_us (500); // Пауза 500ms ?
2. вычитал что больше 255 нельзя может неправ хз
3. спасибо

outbyte(char data){
char count;
for (count=0; count<=8; count++){
data=data >> 1;
if (data==0){
PORTD |=_BV(0); // PD=1
_delay_us (500); // Пауза 500ms
PORTD &=~_BV(0); // PD=0
_delay_us (500); // Пауза 500ms
}else{
PORTD &=~_BV(0); // PD=0
_delay_us (500); // Пауза 500ms
PORTD |=_BV(0); // PD=1
_delay_us (500); // Пауза 500ms
}
}

}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение ARV »

еще замечания :) (кстати, код надо вставлять соответствующими тегами и оформлять его "красиво")
1. от нуля до 8 включительно - 9 итераций, сами посчитайте. поэтому в цикле надо писать count < 8
2. data == 0 - это что вы проверяете? наверное, надо определить, равен ли нулю бит в этой переменной? тогда так: if((data & 1) == 0)
3. если data будет сдвинута вправо до первого вывода бита - куда денется младший бит? сдвигать надо после вывода бита.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение Zheleznjakov »

вставлю свои пять копеек :)
может будет полезен.
передача и прием одного байта, старший бит "идет" первымю

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

//-------------------------------------------------------------------------------------------------
uint8_t flash_spi_io(uint8_t data)
{
   uint8_t bit_number;

   for (bit_number = 8; bit_number-- > 0;)
   {
      Pin_AT45DB_CLK_OFF();

      if ((data & 0x80) == 0x80)
         Pin_AT45DB_MOSI_ON();

      Pin_AT45DB_CLK_ON();

      data <<= 1;

      if (Pin_AT45DB_MISO_SIGNAL() != 0x00)
         data |= 1;

      Pin_AT45DB_MOSI_OFF();
   }

   return data;
}
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Реклама
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение alexval2006 »

Вот поправил

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

outbyte(char data){
char count;
  for (count=0; count<8; count++){              
	if((data & 1) == 0){
	  PORTD |=_BV(0);  // PD=1
      _delay_us (500); // Пауза 500ms
	  PORTD &=~_BV(0); // PD=0                        
      _delay_us (500); // Пауза 500ms
	}else{
      PORTD &=~_BV(0); // PD=0
      _delay_us (500); // Пауза 500ms
	  PORTD |=_BV(0);  // PD=1                        
      _delay_us (500); // Пауза 500ms 
    }                                                
    data=data >> 1;
  }
}
Реклама
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение Zheleznjakov »

вы вроде пишите что страший бит первый, а реально младший первый?
позволю себе поправить...

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

void outbyte(uint8_t data)
{
	uint8_t count;

	for (count = 8; count-- > 0;)
	{
		if ((data & 0x80) == 0)
		{
			PORTD |= _BV(0); // PD=1
			_delay_us(500); // пауза 500ms
			PORTD &= ~_BV(0); // PD=0
		}
		else
		{
			PORTD &= ~_BV(0); // PD=0
			_delay_us(500); // пауза 500ms
			PORTD |= _BV(0); // PD=1
		}

		_delay_us(500); // Пауза 500ms

		data <<= 1;
	}
}
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение alexval2006 »

спасибо я только познаю премудрости си потому могу косячить

Не компилитса
вот как то так

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

outbyte(uint8_t data){
uint8_t count = 0x80; // начинать со старшего бита
  for (; count; count>>= 1){ 
   if ((data & 0x80) == 0){
	 PORTD |=_BV(0);  // PD=1
      _delay_us (500); // Пауза 500ms
     PORTD &=~_BV(0); // PD=0                       
      _delay_us (500); // Пауза 500ms
   }else{
      PORTD &=~_BV(0); // PD=0
      _delay_us (500); // Пауза 500ms
     PORTD |=_BV(0);  // PD=1                       
      _delay_us (500); // Пауза 500ms
    }                                               
	data <<= 1;
  }
}
Последний раз редактировалось alexval2006 Сб дек 11, 2010 17:49:09, всего редактировалось 1 раз.
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение Zheleznjakov »

обычная конструкция, почитайте что нибудь по языку си.
для меня более понятна, так как позволяет сразу определить что первым идет старший бит, т.е. 8,7,6,5, и т.д.
что именно пишет компилятор?
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение alexval2006 »

исправил пост выше
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение Zheleznjakov »

не в обиду, но как то страшно получилось :)
плохо для понимания, с точки зрения оптимальности не очень.
да же если работает, лучше переписать для большей наглядности кода.
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение Zheleznjakov »

может поможет, есть книги довльно интересные
Ален И.Голуб - Правила программирования на С и С++
Программирование на языке C для AVR и PIC микроконтроллеров
могу выслать
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение alexval2006 »

объясните эту строку for (count = 8; count-- > 0;)
литература приветсвуетса alexval2006 пёс rambler.ru

вот так компилируются

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

outbyte(uint8_t data){
uint8_t count = 0x80; // начинать со старшего бита
  //for (; count; count>>= 1){ 
   for (;count = 8; count-- > 0){
   if ((data & 0x80) == 0){
	 PORTD |=_BV(0);   // PD=1
      _delay_us (500); // Пауза 500ms
     PORTD &=~_BV(0);  // PD=0                       
      _delay_us (500); // Пауза 500ms
   }else{
      PORTD &=~_BV(0); // PD=0
      _delay_us (500); // Пауза 500ms
     PORTD |=_BV(0);   // PD=1                       
      _delay_us (500); // Пауза 500ms
    }                                               
	data <<= 1;
  }
}
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение Zheleznjakov »

книжки отправил
рекомендую обе сразу
после прочтения должны все вопросы отпасть
хотя ещё по основам си не помешала бы
но что-то под рукой не нашел
гляньте сами что нибудь
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: АСМ-WinAvr вопросы

Сообщение alexval2006 »

что то я совсем запутался с процедурой отправки данных определились а с процедурой приема что то я заблудился

на асме это выглядит так

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

;--------------------------- Подпрограмма приёма текушего байта в temp (начиная с старшего разряда) -----------------
inbyte:     ldi         count,0x08       ;  Фиксируем количество принимаемых бит в байте (счётчик = 8)
m2:         clc                          ;  Устанавливаем в ноль (инверсный значению принимаего бита) флаг переноса "С"
            sbis        PIND,5           ;  Анализ состояния приёмного порта D5
            sec                          ;  Устанавливаем в еденицу (инверсный значению принимаего бита) флаг переноса "С"
m1:         sbis        PIND,5           ;  \
            rjmp        m3               ;   \    Сканирование порта на следующее
            brsh        m1               ;    >   противоположное состяние.
            rjmp        m4               ;   /    (ожидание изменения уровня сигнала, что является стартом 
m3:         brlo        m1               ;  /     для приёма следующего бита или байта)
m4:         rol         temp             ;  Сдвиг регистра temp влево через перенос
            rcall       zad075t          ;  Формируем задержку 0,75 периода передачи ( 750 микросек)
            dec         count            ;  Уменьшение счётчика принятых бит на еденицу
            brne        m2               ;  Если счётчик не пуст, уходим на приём следующего бита
            ret                          ;  Конец П/П приёма байта

а вот то убожество что получаетса у меня запутался в конец

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

//;##############################################
//;##      Передающий блок дистанционного      ##
//;##############################################
//ATmega8
 #define F_CPU 1600000UL
 #include <avr/io.h>        // Библиотека ввода/вывода
 #include <util/delay.h>    // Библиотека для работы с задержками
//*****************************************************************************
unsigned char  temp;          // Вспомогательный регистр
//*****************************************************************************
#define RFOUT   0       // Порт вывода данных на радиомодуль
#define RFIN    1       // Порт приёма данных с радиомодуля
#define PORTX1 PORTD    // выбран порт PORTD

//;-------------------------- Определение констант --------------------------------------------------------------------
//*****************************************************************************
void setup(void);
//;******************************************************
//;*                Модуль инициализации                *
//;******************************************************
//;-------------------------- Инициализация портов В/В ---------------------------------
 void setup(void){ 
 					
 DDRD= 0b00000001;	//Настраиваем порт D0 на вывод (передача на радиомодуль) D1 на ввод
 PORTD=0b11111100;  //по умолчанию в ноль. Все остальные порты на ввод без резисторов.
  
 DDRC= 0b00000000;	//Настраиваем порты на ввод.	
 PORTC=0b11111111;	//без резисторов времено поставил резисторы      
 
 DDRB= 0b00000000;	//Настраиваем порты на ввод.	
 PORTB=0b11111111;	//без резисторов 		

//*******0,5 сек задержка (гарантированное время входа в рабочий режим радиомодуля)************
 _delay_us (500); // Пауза 500ms
}        
//*********************************************************************************************
//***********Подпрограмма отправки посылки в эфир (начиная с старшего разряда)*****************

void outbyte(unsigned char data){
unsigned char i;

  for (i=8; i>0; i--){
     if ((data&0x80)==0x00){   // Выводим данные на RFOUT начиная с старшего разряда
	     PORTX1 |=_BV(RFOUT);  // установим RFOUT в "1"                    
         _delay_us(500);       // пауза 500ms
		 PORTX1 &=~_BV(RFOUT); // установим RFOUT в "0"
	 }else{                    // иначе           
		 PORTX1 &=~_BV(RFOUT); // установим RFOUT в "0"
        _delay_us(500);        // пауза 500ms
		 PORTX1 |=_BV(RFOUT);  // установим RFOUT в "1" 
	 }
	 _delay_us(500);           // пауза 500ms
	 data=data<<1;             // Сдвиг влево
  }       

}
//***********Подпрограмма приёма посылки из эфира (начиная с старшего разряда)*****************
void inbyte(void){
unsigned char count=0x80;
unsigned char flag_c;	   
      
  for (count = 8; count-- > 0;){         // цикл приёма 8бит данных в переменную temp 
		
	if ((PIND & 0x01)!=1){               // если PIND,1не равно 0
       flag_c |=_BV(0); // flag_c=1
     }
	  //m1:
		 
		 if ((PIND & 0x01)==1){          // если PIND,1=1
		                                 // то проверяем флаг С на = 0 
			 if ((flag_c & 0x01)==0x00){ // если flag_c=0
		 
             }
		 }else{                          // иначе проверяем флаг С на = 1 
			 if ((flag_c & 0x01)==0x01){ // если flag_c=1
		 
             }
		 }
		 

   temp <<= 1;//сдвигаем данные влево
  }  
}
//**********************************************************************************************
int main(void){ 
  setup();
  while(1){
  outbyte(0b10000000);
  }//end while(1)
return 1;
}

Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»