Вроде правильно описал, так и работает..Chip115 писал(а):Проверьте ход мысли, правильно ли я понял.

Вроде правильно описал, так и работает..Chip115 писал(а):Проверьте ход мысли, правильно ли я понял.

Arlleex писал(а):Доброй ночи.
Как первести обычный бинарный код в двоично-десятичный? Причем 0000 0000 это 0000 0000, а, например, 0000 1111 - это уже получится 0011 0001 0011 0101 (для lcd).
на ассемблере пишу.
Код: Выделить всё
/***Использование динамической индикации***/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define valButton_1 30
#define valButton_2 50
// 0 1 2 3 4 5 6 7 8 9
char SEGMENT[ ] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
volatile unsigned char segcounter = 0;
volatile int display1 = 0;
// Обработчик прерывания по переполнению таймера2
ISR (TIMER2_OVF_vect)
{
PORTD = 0xFF; //гасим все разряды
PORTB = (1 << segcounter); //выбираем следующий разряд
switch (segcounter)
{
case 0:
PORTD = ~(SEGMENT[display1 % 10000 / 1000]); // здесь раскладываем число на разряды
break;
case 1:
PORTD = ~(SEGMENT[display1 % 1000 / 100]);
break;
case 2:
PORTD = ~(SEGMENT[display1 % 100 / 10]);
break;
case 3:
PORTD = ~(SEGMENT[display1 % 10]);
break;
}
if ((segcounter++) > 2) segcounter = 0;
}
/***Главная функция***/
int main (void)
{
DDRD |= (1 << PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3)|(1 << PD4)|(1 << PD5)|(1 << PD6);
DDRB |= (1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3);
PORTD = 0x00;
PORTB = 0x00;
TIMSK |= (1 << TOIE2); // разрешение прерывания по таймеру2
TCCR2 |= (1 << CS21); //предделитель на 8
sei(); //глобально разрешаем прерывания
}Gudd-Head писал(а):FreshMan писал(а):значит если и приследующей операции сложения результат будет больше 255 то флаг так и останется висет в положении 1, ва если нет то он сбросится аппаратно в ноль ? я правильно разумею ?
Свежий! Да погоняй ты уже в студии, да посмотри. А если что непонятно — спрашивай.
FreshMan писал(а):в данном случае прочерки означают что эти флаги вообще не используются ?
в данном случае прочерки означают что эти флаги вообще не используются ?
Код: Выделить всё
#include <mega8.h>
#include <1wire.h>
#include <ds18b20.h>
#include <delay.h>
#include <math.h>
int me,md,se,sd;
#define MAX_DEVICES 4
unsigned char rom_codes[MAX_DEVICES][9];
interrupt [TIM2_COMP] void timer2_comp_isr(void) //раз в секунду по прерыванию считывается температура
{
if (ds18b20_temperature(0)==-9999) sd=1 ; //проверяю считывает ли температуру
}
void out(int i) // формирование цифры для семисегментного индикатора
{
if (i==0) PORTD=0b00111111;
if (i==1) PORTD=0b00000110;
if (i==2) PORTD=0b01011011;
if (i==3) PORTD=0b01001111;
if (i==4) PORTD=0x66;
if (i==5) PORTD=0b01101101;
if (i==6) PORTD=0b01111101;
if (i==7) PORTD=0b00000111;
if (i==8) PORTD=0b01111111;
if (i==9) PORTD=0b01101111;
}
void main(void)
{
unsigned char i,devices;
#asm("sei")
devices=w1_search(0xf0,0); //проверяю есть ли датчик
while (1)
{
md=devices;
if (devices==0) se=5; // вывод результата поиска датчика
out(md); //динамическая индикация вывод переменной md на разряд тысяч
PORTB.2=0; //смещение на регистр сдвига
PORTB.1=1; //синхронизация на регистр сдвига
PORTB.1=0;
delay_us(600);
out(me); //динамическая индикация вывод переменной me на разряд сотен
PORTB.2=1;
PORTB.1=1;
PORTB.1=0;
delay_us(600);
out(sd); //динамическая индикация вывод переменной sd на десятичный разряд
PORTB.1=1;
PORTB.1=0;
delay_us(600);
out(se); //динамическая индикация вывод переменной se на единичный разряд
PORTB.1=1;
PORTB.1=0;
delay_us(600);
}
}
Код: Выделить всё
Prior to #include -ing the ds18b20.h file, you must declare which microcontroller port and port bit are used for communication with the DS18B20 through the 1 Wire bus.
Example:
/* specify the Atmega8515 port and bit used for the 1 Wire bus */
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=2
#endasm
/* include the DS18B20 functions prototypes */
#include <ds18b20.h>
pyzhman писал(а):23DRaven:
/* specify the Atmega8515 port and bit used for the 1 Wire bus */
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=2
#endasm
[/code]
она там сама куда-то вписывается
Для краткости убрал из кода инициализацию портов и тп.
Код: Выделить всё
#include <mega8.h>
#include <1wire.h>
#include <ds18b20.h>
#include <delay.h>
#include <math.h>
int me,md,se,sd;
#define MAX_DEVICES 4
unsigned char rom_codes[MAX_DEVICES][9];
interrupt [TIM2_COMP] void timer2_comp_isr(void) //раз в секунду по прерыванию считывается температура
{
if (ds18b20_temperature(0)==-9999) sd=1 ; //проверяю считывает ли температуру
}
void out(int i) // формирование цифры для семисегментного индикатора
{
if (i==0) PORTD=0b00111111;
if (i==1) PORTD=0b00000110;
if (i==2) PORTD=0b01011011;
if (i==3) PORTD=0b01001111;
if (i==4) PORTD=0x66;
if (i==5) PORTD=0b01101101;
if (i==6) PORTD=0b01111101;
if (i==7) PORTD=0b00000111;
if (i==8) PORTD=0b01111111;
if (i==9) PORTD=0b01101111;
}
void main(void)
{
unsigned char i,devices;
PORTB=0x00;
DDRB=0x07;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x32;
MCUCR=0x00;
TIMSK=0x80;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x00;
SPCR=0x00;
TWCR=0x00;
#asm("sei")
devices=w1_search(0xf0,0); //проверяю есть ли датчик
while (1)
{
md=devices;
if (devices==0) se=5; // вывод результата поиска датчика
out(md); //динамическая индикация вывод переменной md на разряд тысяч
PORTB.2=0; //смещение на регистр сдвига
PORTB.1=1; //синхронизация на регистр сдвига
PORTB.1=0;
delay_us(600);
out(me); //динамическая индикация вывод переменной me на разряд сотен
PORTB.2=1;
PORTB.1=1;
PORTB.1=0;
delay_us(600);
out(sd); //динамическая индикация вывод переменной sd на десятичный разряд
PORTB.1=1;
PORTB.1=0;
delay_us(600);
out(se); //динамическая индикация вывод переменной se на единичный разряд
PORTB.1=1;
PORTB.1=0;
delay_us(600);
}
}
Prior to #include -ing the ds18b20.h file, you must declare which microcontroller port and port bit are used for communication with the DS18B20 through the 1 Wire bus.
Код: Выделить всё
module sintable(
input [8:0] in,
output [7:0] out
);
reg [7:0] mem [0:511];
assign out = mem[in];
initial $readmemh("sin.hex",mem,0,511);
endmoduleКод: Выделить всё
00 01 02 02 03 04 05 05 06 07 08 09 09 0A 0B 0C 0D 0D 0E 0F 10 10 11 12 ... FF FF FF FF Код: Выделить всё
module sintable(
input [8:0] in,
output [7:0] out
);
reg [7:0] mem [0:511];
reg [7:0] Rout;
assign out = Rout;
initial $readmemh("sin.hex",mem,0,511);
always @(in)
Rout <= mem[in];
endmoduleКод: Выделить всё
Prior to #include -ing the 1wire.h file, you must declare which microcontroller port and port bit is used for communication through the 1 Wire protocol.
Example:
/* the 1 Wire bus is connected to ATmega8515 PORTB
the data signal is bit 2 */
#asm
.equ __w1_port=0x18
.equ __w1_bit=2
#endasm
/* now you can include the 1 Wire Functions */
#include <1wire.h>
pyzhman писал(а):Так и не нашел, где в вашей программе идет определение порта и бита из-за которых вылазит invalid redefinition.
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#include <math.h>
#asm
.equ __w1_port=0x15 ;PORTC
.equ __w1_bit=5
#endasm
#include <1wire.h>
#include <ds18b20.h>
int me,md,se,sd;
#define MAX_DEVICES 4
unsigned char rom_codes[MAX_DEVICES][9];
nterrupt [TIM2_COMP] void timer2_comp_isr(void) //раз в секунду по прерыванию считывается температура
{
if (ds18b20_temperature(0)==-9999) sd=1 ; //проверяю считывает ли температуру
}
void out(int i) // формирование цифры для семисегментного индикатора
{
if (i==0) PORTD=0b00111111;
if (i==1) PORTD=0b00000110;
if (i==2) PORTD=0b01011011;
if (i==3) PORTD=0b01001111;
if (i==4) PORTD=0x66;
if (i==5) PORTD=0b01101101;
if (i==6) PORTD=0b01111101;
if (i==7) PORTD=0b00000111;
if (i==8) PORTD=0b01111111;
if (i==9) PORTD=0b01101111;
}
void main(void)
{
unsigned char i,devices;
PORTB=0x00;
DDRB=0x07;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x32;
MCUCR=0x00;
TIMSK=0x80;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x00;
SPCR=0x00;
TWCR=0x00;
#asm("sei")
devices=w1_search(0xf0,0); //проверяю есть ли датчик
while (1)
{
md=devices;
if (devices==0) se=5; // вывод результата поиска датчика
//динамическая индикация вывод переменной md на разряд тысяч
out(md);
PORTB.2=0; //смещение на регистр сдвига
PORTB.1=1; //синхронизация на регистр сдвига
PORTB.1=0;
delay_us(600);
//динамическая индикация вывод переменной me на разряд сотен
out(me);
PORTB.2=1;
PORTB.1=1;
PORTB.1=0;
delay_us(600);
//динамическая индикация вывод переменной sd на десятичный разряд
out(sd);
PORTB.1=1;
PORTB.1=0;
delay_us(600);
//динамическая индикация вывод переменной se на единичный разряд
out(se);
PORTB.1=1;
PORTB.1=0;
delay_us(600);
}
}