PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : ارتباط بین lpc1768 و atmega 8 از طریق uart



milad_elect
21-09-2015, 11:07
با سلام

میخواستم بدونم میشه ارتباط بین lpc1768 و atmega 8 از طریق uart انجام داد؟ ایا این دو میکرو با هم سازگاری دارند؟

6759
21-09-2015, 11:52
سلام
بله میشه
سورس کد میکرو(دریافت کننده)
.................................................. ............
$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600
$hwstack = 32
$swstack = 10
$framesize = 10
'************************************************* ******************************
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
'************************************************* ******************************
Dim Buffer As String * 15
Dim B As Byte
Dim Nhm As Byte
'************************************************* ******************************
Enable Interrupts
Enable Urxc
On Urxc Rcv
'************************************************* ******************************
Cls
Do
Home
Lcd Buffer
Buffer = ""
B = 0
Loop
End
'************************************************* ******************************
Rcv:
B = Inkey()
Buffer = Buffer + Chr(b)
Return
.................................................. .................................................. ......................
سورس کد 1768 (به عنوان فرستنده)
#include <LPC17xx.h>
#include "delay.h"
SendByte0 (int D){
while (!(LPC_UART0->LSR & 0x20));
LPC_UART0->THR = D;
}
main(){
unsigned int i;
LPC_SC->PCLKSEL0=0x0;
LPC_PINCON->PINSEL0=0x00000050;
LPC_UART0->LCR=0x83;
LPC_UART0->DLM=0;
LPC_UART0->FDR=0xf3;
LPC_UART0->DLL=97;
LPC_UART0->LCR=0x03;
LPC_UART0->FCR=0x07;

while(1){
for(i=0x30;i<=0x39;i++){
delay_s(10);
SendByte0 (i);
}
}
}
.................................................. ...............
هدر delay هم در ضمیمه ی مجله 9 pmm موجود هست.

milad_elect
21-09-2015, 12:45
سلام
بله میشه
سورس کد میکرو(دریافت کننده)
.................................................. ............
$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600
$hwstack = 32
$swstack = 10
$framesize = 10
'************************************************* ******************************
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
'************************************************* ******************************
Dim Buffer As String * 15
Dim B As Byte
Dim Nhm As Byte
'************************************************* ******************************
Enable Interrupts
Enable Urxc
On Urxc Rcv
'************************************************* ******************************
Cls
Do
Home
Lcd Buffer
Buffer = ""
B = 0
Loop
End
'************************************************* ******************************
Rcv:
B = Inkey()
Buffer = Buffer + Chr(b)
Return
.................................................. .................................................. ......................
سورس کد 1768 (به عنوان فرستنده)
#include <LPC17xx.h>
#include "delay.h"
SendByte0 (int D){
while (!(LPC_UART0->LSR & 0x20));
LPC_UART0->THR = D;
}
main(){
unsigned int i;
LPC_SC->PCLKSEL0=0x0;
LPC_PINCON->PINSEL0=0x00000050;
LPC_UART0->LCR=0x83;
LPC_UART0->DLM=0;
LPC_UART0->FDR=0xf3;
LPC_UART0->DLL=97;
LPC_UART0->LCR=0x03;
LPC_UART0->FCR=0x07;

while(1){
for(i=0x30;i<=0x39;i++){
delay_s(10);
SendByte0 (i);
}
}
}
.................................................. ...............
هدر delay هم در ضمیمه ی مجله 9 pmm موجود هست.




با تشکر

فرستادن ارم مشکلی نداره فقط طرف avr دریافت انجام میشه ولی بدرستی انجام نمیشه و اعداد را اشتباه میگیرد.البته از وقفه در سمت avr استفاده نکردم. با کدویژن برنامه را نوشتم.




/************************************************** ***
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
Object moved (You can see links before reply)


Project :
Version :
Date : 9/19/2015
Author : NeVaDa
Company :
Comments:




Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
************************************************** ***/


#include <mega8.h>
#include <delay.h>
#include <stdlib.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>


// Standard Input/Output functions
#include <stdio.h>


// Declare your global variables here


void main(void)
{
int a,b,d=0,c=0;


unsigned char str[],strr[];
// Declare your local variables here


// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;


// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
PORTC=0x00;
DDRC=0x03;


// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
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;


// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;


// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;


// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;


// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 4800 (Double Speed Mode)
UCSRA=0x02;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0xCF;


// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;


// LCD module initialization
lcd_init(16);


while (1)
{
d=getchar();


itoa(d,strr);
lcd_gotoxy(0,0);
lcd_puts(strr);
delay_ms(50);
lcd_clear();
delay_ms(10);


};
}

6759
23-09-2015, 17:51
سلام
یعنی چی دریافت به درستی انجام نمیشه؟؟؟
باودریت میکروت رو بزار 9600 بعد با برنامه ی 1768 که گذاشتم چک کن ببین چی میشه!

esisafa
23-09-2015, 20:41
در avr برای دریافت حتما از وقفه استفاده بشه چون بافر نداره. ولی در arm چون واحد سریال بافر داره، همیشه وقفه لازم نیست ولی باشه بهتره

milad_elect
26-09-2015, 16:23
سلام
یعنی چی دریافت به درستی انجام نمیشه؟؟؟
باودریت میکروت رو بزار 9600 بعد با برنامه ی 1768 که گذاشتم چک کن ببین چی میشه!

با سلام مجدد و تشکر از همه دوستان

یعنی عمل uart انجام میشه و atmega8 هم دریافت رو انجام میده ولی مثلا عدد 0x10 رو 0x80 دریافت میکنه. تنظیمات دو تا میکرو کاملا یکسان هست.
در مورد باودریت در سمت lpc1768 یه مقدار خطا داریم. مثلا برای باودریت 4800 مقدار 4807 بدست میاد و برای باودریت 9600 مقدار 9868 بدست میاد که از 1.1% خطا که در دیتا شیت ذکر شده بیشتره!
حالا من برای باودریت کمتر از 9600 که از 1.1% خطا کمتر داریم هم امتحان کردم که نتیجه خیلی تغییری نمیکنه.