Thảo luận Tất cả hỏi đáp newbie về AVR và liên quan - tập trung tại đây!

Lâm Diễm

Học sinh phổ thông
các bác cho em hỏi chút ah!
làm thế nào để để sử dụng ngắt ngoài của ATMEGA 32 điều khiển bằng nút bấm, khi mà ta nhấn nút bấm lần 1 chương trình dừng hoạt động và khi ta nhấn nút lần 2 chương trình hoạt động lai bình thường k ah???
Cụ thể là em có đề bài là tìm hiểu về ngắt của atmega 32. Sử dụng ngắt timer tạo xung 1 Hz(đèn LED nhấp nháy), ngắt ngoài điều khiển bằng nút bấm, bấm lần 1 đèn sáng bấm lần 2 đèn tắt! Rất mong các a/c trong diễn đàn giúp đỡ em cảm ơn ah!!!
 

mta_cdt

Super Moderator
Thành viên BQT
các bác cho em hỏi chút ah!
làm thế nào để để sử dụng ngắt ngoài của ATMEGA 32 điều khiển bằng nút bấm, khi mà ta nhấn nút bấm lần 1 chương trình dừng hoạt động và khi ta nhấn nút lần 2 chương trình hoạt động lai bình thường k ah???
Cụ thể là em có đề bài là tìm hiểu về ngắt của atmega 32. Sử dụng ngắt timer tạo xung 1 Hz(đèn LED nhấp nháy), ngắt ngoài điều khiển bằng nút bấm, bấm lần 1 đèn sáng bấm lần 2 đèn tắt! Rất mong các a/c trong diễn đàn giúp đỡ em cảm ơn ah!!!
Cái này đơn giản mà bạn, không cần thiết là phải dừng toàn bộ chương trình, chỉ cần khi nhấn nút bạn đảo bít đó là đuơc.
Vd trong trình phục vụ ngắt bạn viết là led !=led; là được. Bạn nhớ khai báo chân led là đầu ra nha.
 

Ha Hai

Học sinh phổ thông
có bác nào lưu chuỗi vào eeprom chưa , giúp em với em lưu 4 chuỗi mà nó cứ lưu hết về địa chỉ bắt đầu mà lưu ko đúng chuỗi nhờ các bác xem giùm
#include <mega8.h>
#include <alcd.h>
#include <delay.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

unsigned char *a="01634709835";
unsigned char *b="09179472770";
unsigned char *c="09741413050";
unsigned char *d="abcdefnhyk0";
unsigned char a1[12],a2[12],a3[12],a4[12];

/////////xu ly luu eeprom\\\\\\\\\\\\

unsigned char Data[12];
unsigned int uuu=0;
//////ghi vao eeprom\\\\\\\\\\
void ghi_eeprom(unsigned int Address, unsigned char Data[12])
{
unsigned int nnn=0;
nnn=Address;
while(nnn<=(Address+12))
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = nnn;
EEDR = Data[nnn];
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
nnn++;
}
while(uuu<=12)
{
Data[uuu]=' ';
uuu++;
}
}
//////////doc tu eeprom\\\\\\\\\\\\\\\\

unsigned char doc_eeprom(unsigned int Address)
{
unsigned int aaa=0;
aaa=Address;
while(aaa<=(Address+12))
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address register */
EEAR = aaa;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
Data[aaa]=EEDR;
aaa++;
}
return aaa;
}

void main(void)
{

PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;

UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;


lcd_init(16);

#asm("sei")
ghi_eeprom(0,a);
doc_eeprom(0);
strcpy(a1,Data);
ghi_eeprom(12,b);
doc_eeprom(12);
strcpy(a2,Data);
ghi_eeprom(24,c);
doc_eeprom(24);
strcpy(a3,Data);
ghi_eeprom(36,d);
doc_eeprom(36);
strcpy(a4,Data);


while (1)
{

printf("%s",a1);
printf("\r\n");
delay_ms(1000);

printf("%s",a2);
printf("\r\n");
delay_ms(1000);

printf("%s",a3);
printf("\r\n");
delay_ms(1000);

printf("%s",a4);
printf("\r\n");
delay_ms(1000);
}
}
 

Đính kèm

Sửa lần cuối bởi điều hành viên:

mta_cdt

Super Moderator
Thành viên BQT
có bác nào lưu chuỗi vào eeprom chưa , giúp em với em lưu 4 chuỗi mà nó cứ lưu hết về địa chỉ bắt đầu mà lưu ko đúng chuỗi nhờ các bác xem giùm
Bạn viết bằng phần mềm gì vậy. Lần sau nhớ đưa code vào thẻ code cho mọi người dễ theo dõi.
 

Quảng cáo Google