Мелкие вопросы по МК и ПЛИС.
Опа, я думал что Keil и AVR поддерживает. Просто его расхваливали как универсальный. Будем знать...
- Реклама
- Сообщения: 36
- Зарегистрирован: Ср ноя 17, 2010 15:38:40
Ногой микроконтроллера AVR можно вкл/выкл ЖКИ дисплей(HD44780) и его подсветку?
Дисплей можно, подсветку - через ключ. Смотрите ток потребления дисплея, его подсветки и сколько может выдать нога контроллера (AVR - max 40mA) в даташитах.
Конечно можно. Только буфер поставить, транзисторный ключ.
Docendo discimus
народ, подскажите по 1wire...не получается ничерта. Один датчик ds18b20 на PD.6 attyny2313...
или дайте исходник на С посмотеть у кого есть
Код: Выделить всё
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.9 Evaluation
Automatic Program Generator
© Copyright 1998-2012 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 20.07.2012
Author :
Company :
Comments:
Chip type : ATtiny2313
AVR Core Clock frequency: 12,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/
#include <tiny2313.h>
#include <1wire.h>
#include <ds18b20.h>
#include <delay.h>
// Declare your global variables here
unsigned char h[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char msek, sek, min,des,ed,des1,ed1,t0,t1,k,devices,temp,temp1;
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
// Place your code here
//t0++;
//if (t0==1){PORTD=0b00010000;PORTB=h[ed];};
//if (t0==3){PORTD=0b00001000;PORTB=h[des];};
//if (t0==5){PORTD=0b00000010;PORTB=h[ed1];};
//if (t0==9){PORTD=0b000000001;PORTB=h[des1];t0=0;};
//if (t0==2||4||6||8){PORTD=0xFF;PORTB=0xFF;};
}
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
//t1++;
//k++;
// if (t1==100) {msek++;t1=0;};
//if (k==255 & (PIND.6==0)) {min++;k=0;};
// if (msek==100){sek++;msek=0;};
// if (sek==60) {min++;sek=0;};
// if (min==99){min=0;};
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port A initialization
// Function: Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// Port B initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port D initialization
// Function: Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRD=(0<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);
// State: Bit6=P Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTD=(1<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1500,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x01;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1500,000 kHz
// Mode: CTC top=OCR1A
// 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: On
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x46;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<TOIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<ICIE1) | (0<<OCIE0B) | (0<<TOIE0) | (1<<OCIE0A);
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=(0<<INT1) | (0<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
// USI initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);
// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
DIDR=0x00;
devices=w1_init();
// Global enable interrupts
#asm("sei")
while (1)
{
//if(sek>=10){des=(sek/10);} else {des=0;};
//ed=sek-(des*10);
//if(min>=10){des1=(min/10);} else {des1=0;};
//ed1=min-(des1*10);
temp = (ds18b20_temperature());
if(temp>=1000){des1=temp/1000;}else{des1=0;};
if(temp>=100){ed1=((temp-(des1*1000))/100);};
if(temp>=10){des=((temp-((des1*1000)+(ed1*100))/10));};
if(temp>=1){ed=(temp-((des1*1000)+(ed1*100)+(des*10)));};
t0++;
if (t0==1){PORTD=0b00010000;PORTB=h[ed];};
if (t0==3){PORTD=0b00001000;PORTB=h[des];};
if (t0==5){PORTD=0b00000010;PORTB=h[ed1];};
if (t0==9){PORTD=0b000000001;PORTB=h[des1];t0=0;};
if (t0==2||4||6||8){PORTD=0xFF;PORTB=0xFF;};
}
}- Реклама
Если датчик висит на PD6, то какого хэ:
?
И, раз уж используете прерывания, то сделать:
Код: Выделить всё
PORTD=0b000000001
...
PORTD=0xFFИ, раз уж используете прерывания, то сделать:
Код: Выделить всё
asm("cli");
temp = (ds18b20_temperature());
asm("sei");Docendo discimus
в общем переписал))) теперь постоянно светится цифра 241
НО! в протеусе все работает. У кого есть библиотека ds18b20 скиньте плз!
код
код
Код: Выделить всё
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.9 Evaluation
Automatic Program Generator
© Copyright 1998-2012 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 20.07.2012
Author :
Company :
Comments:
Chip type : ATtiny2313
AVR Core Clock frequency: 12,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/
#include <tiny2313.h>
// 1 Wire Bus interface functions
#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds18b20.h>
#include <delay.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
unsigned char h[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char des,ed,des1,ed1,temp,temp1;
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port A initialization
// Function: Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// Port B initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port D initialization
// Function: Bit6=In Bit5=In Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRD=(0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);
// State: Bit6=T Bit5=T Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// 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=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<TOIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<ICIE1) | (0<<OCIE0B) | (0<<TOIE0) | (0<<OCIE0A);
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=(0<<INT1) | (0<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
// USI initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);
// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
DIDR=0x00;
// 1 Wire Bus initialization
// 1 Wire Data port: PORTD
// 1 Wire Data bit: 5
// Note: 1 Wire port settings are specified in the
// Project|Configure|C Compiler|Libraries|1 Wire menu.
w1_init();
while (1)
{
// Place your code here
w1_init();
temp = (ds18b20_temperature(0));
ed=temp%10;
des=((temp%100)-ed)/10;
ed1=((temp%1000)-ed-(des*10))/100;
des1=(temp-(ed1*100)-ed-(des*10))/100;
delay_ms(750);
PORTD.4=1;PORTB=h[ed];
delay_ms(1);
PORTD.4=0;PORTB=0xFF;
PORTD.3=1;PORTB=h[des];
delay_ms(1);
PORTD.3=0;PORTB=0xFF;
PORTD.1=1;PORTB=h[ed1];
delay_ms(1);
PORTD.1=0;PORTB=0xFF;
PORTD.0=1;PORTB=h[des1];
delay_ms(1);
PORTD.0=0;PORTB=0xFF;
}
}
У вас
а функция
Код: Выделить всё
unsigned char des,ed,des1,ed1,temp,temp1;Код: Выделить всё
float ds18b20_temperature(unsigned char *addr)Docendo discimus
Пояснение если тип используемой переменной отличается от заявленной, особенно в меньшую сторону, должна появиться ошибка компилятора, даже если она не появляется, то дальнейшие действия просты - переменная подрезается под необходимый размер, таким образом реальный результат теряется.И вполне возможно, что вам и будет показывать одно и то же число.
Если результат больше, чем 255 всегда будет подставлять (результат-255) в дальнейшие выражения.
Примерно так.Точнее мастера скажут
Если результат больше, чем 255 всегда будет подставлять (результат-255) в дальнейшие выражения.
Примерно так.Точнее мастера скажут
В поисках истины человек развивается.
что можно использовать как альтернативу реле в микроконтроллерных схемах? Нужно подключить нагрузку 220в от 100Вт к схеме ? в меня на выходе стоит ключ из кт 3102... думал туда реле подцепить... а у него размер большеват. как подключить симистор и какой?
есть ли программы отладчики кто пишет на Си для АVR ?......, чтобы можно было посмотреть как двигается рабочая точка во время исполнения проги 
Tell Me The Truth
Студия неплохо справляется только нужно смотреть ограничения симуляции для конкретного контроллера.
В поисках истины человек развивается.
не хочу вас огорчать, но на см нельзя, но зато точно можно на си.
В поисках истины человек развивается.
Люди пдскажите что нельзя вешать на внутрисхемный isp 6пин разъем? У меня на SCK висит зуммер на корпус.
На MISO висит ds18b20. На MOSI светодиодный индикатор. Можно ли так прошиться? Mega8-16pu
На MISO висит ds18b20. На MOSI светодиодный индикатор. Можно ли так прошиться? Mega8-16pu
Нельзя вешать ёмкости (перестанет прошиваться на высоких частотах) и сильно подтягивать выводы к GND и VCC - минимум 300-500ом.mr.boroda писал(а):Люди пдскажите что нельзя вешать на внутрисхемный isp 6пин разъем? У меня на SCK висит зуммер на корпус.
На MISO висит ds18b20. На MOSI светодиодный индикатор. Можно ли так прошиться? Mega8-16pu
В вашем случаи должно нормально прошиваться, если светодиод не слишком много жрёт (до 1-20ма, в зависимости от программатора).
Кто подскажет фьюзы для avrdude для внешнего кварца 12мгц atmega8-16pu? Самому страшно лезть тини одну закосячил))) а мега последняя осталась
В поисках истины человек развивается.


