cat-dog-god0 писал(а):А в каком месте программы настраиваются порты на вход/выход ???
См. даташит.
например, DDRA = 0x01 - бит 0=1 - нога 0 - выход. Если в бите 0 - вход.
cat-dog-god0 писал(а):А в каком месте программы настраиваются порты на вход/выход ???
cat-dog-god0 писал(а):Абстрактный вопрос. МК зажигает 4 светодиода (скажем эффект бегущего огня), как кнопкой менять частоту эффекта ???
слева!levaclaus писал(а):При всключении термометра
.............
str[0] = '.';
str[1] = '';
str[2] = '';
str[3] = '';
........
- "бежит" точка, возможно ли сократить?
Код: Выделить всё
#include <tiny2313.h>
#include <stdlib.h>
#include <ctype.h>
#include <delay.h>
#include <string.h>
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=2
#endasm
#include <1wire.h>
#include <ds1820.h>
#include <delay.h>
#define MAX_DEVICES 6
unsigned char rom_codes[MAX_DEVICES][9];
unsigned char digit_ar[15] = {
0b11111100, //0
0b01100000, //1
0b11011010, //2
0b11110010, //3
0b01100110, //4
0b10110110, //5
0b10111110, //6
0b11100000, //7
0b11111110, //8
0b11110110, //9
0b00000001, //.
0b00000000, // empty
0b00000010, //-
0b11000110, //*
0b01101110 //N
};
unsigned char SPlace_ar[4] = { 0b01000000,
0b00100000,
0b00010000,
0b00001000};
//unsigned char str[5];
//Ãëîáàëüíàÿ ïåðåìåííàÿ äëÿ õðàíåíèÿ ñòðîêè âûâîäà
unsigned char str[4];
//Íîìåð çíàêîìåñòà
unsigned char SignPlace = 0;
void avr_init(void);
//Timer 0 interrupt
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
unsigned char m;
bit c;
TCNT0 = 0;
if (str[SignPlace] == '.') {
m = 10;
c = 1;
};
if (str[SignPlace] == '+') {
m = 13;
c = 1;
};
if (str[SignPlace] == '-') {
m = 12;
c = 1;
};
if (str[SignPlace] == 'N') {
m = 14;
c = 1;
};
if (isprint(str[SignPlace]) == 0) {
m = 11;
c = 1;
};
if (c == 0) {
m = toint(str[SignPlace]);
}
PORTD = 0;
PORTB = 0;
PORTB = digit_ar[m];
PORTD = SPlace_ar[SignPlace];
c = 0;
SignPlace = SignPlace + 1;
if (SignPlace == 4) SignPlace = 0;
}
void main(void)
{
float znach;
unsigned char i,devices;
unsigned char str1[3];
avr_init();
#asm("cli");
devices=w1_search(0xf0,rom_codes);
#asm("sei");
if (devices == 0) {
strcpyf(str, "Err.");
while (1);
} else {
strcpyf(str, "N118"); //âûâåñòè ñòðîêó ÍÈÈÁ
};
delay_ms(2000);
while (1)
{
for (i=0;i<devices;i++)
{
#asm("cli");
znach=ds1820_temperature_10(&rom_codes[i][0])/10;
#asm("sei");
itoa((int)znach, str);
str1[0] = '+';
strcat(str1, str);
delay_ms(5);
};
};
}
void avr_init(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;
// Port D initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0x7F;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x02;//(2)
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
#asm("sei")
}Код: Выделить всё
#include <mega8.h>
#include <delay.h>
unsigned char x;
unsigned char y;
unsigned char status[4] = { 0b10000001,
0b01000010,
0b00100100,
0b00011000 };
unsigned char status2[4] = { 0b11111111,
0b01111110,
0b00111100,
0b00011000 };
interrupt [EXT_INT0] void ext_int0_isr(void)
{
x=++x;
switch (x)
{
case 1:
for(y=0;y<3;y++)
{
PORTB=status[y]; //output data
delay_ms(300); //wait for some time
}
PORTB=0;
break;
case 2:
for(y=0;y<3;y++)
{
PORTB=status2[y]; //вывод информации
delay_ms(300); //задержка
}
x=0;
}
return;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;
PORTD=0xFF;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: Off
GICR|=0x40;
MCUCR=0b0000011;;
GIFR=0b01000000;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
};
}
ururur писал(а):Ув. коты . Подскажите пожалуйста. мне нужно чтобы при нажатии кнопки на PINB.1 в коде изменялось определенное значение. Например с 0x00 на 0xFF. Насколько я понял нужно хранить эти значения в массиве, и если кнопка нажимается то подставлять вместо одного другое. Подскажите как лучше сделать на Codevisionavr
Тоесть я создаю масив
flash unsigned char mas[] = {0xFF,0x00};
а вот как при нажатии кнопки подставить значение из масива
Код: Выделить всё
char x;
if (PINB.1==0) x=0xFF;
ururur писал(а):а если нужно несколько можно сделать так
char x;
if (PINB.1==0) x=0xFF;
else
if (PINB.2==0) x=0x80;
else
if (PINB.3==0) x=0x01;
Тогда при нажатии разных кнопок в X будет записываться разные переменные?
Код: Выделить всё
char x;
if (PINB.1==0) x=0xFF;
if (PINB.2==0) x=0x80;
if (PINB.3==0) x=0x01;можно, только поведение программы будет сильно другим: в исходном варианте при нажатии одновременно нескольких кнопок переменная не изменит своего значения, т.е. реакции на групповое нажатие не будет, а во втором случае - реакция будет.Apparatchik писал(а):можно без else
слева!alex_avr писал(а):Если ставлю While(1) то прерывание перестает работать
levaclaus писал(а):интересен пример на sprintf, покажите
Код: Выделить всё
int val=-1;
sprintf (sss, "+%d", val);
