Układ komunikacji po RS232 wykorzystujący mikrokontroler Atmega8
Założenia przy wykonywaniu projektu:
-zbudowanie układu prototypowego do wielorakich zastosowań
-napisanie programu komunikującego się z układem w Visual Studio 2013
-oprogramowanie procesora przygotowane w Atmel Studio 6.1
-wykorzystanie umieszczenie na płytce urządzenia złącz do komunikacji (d'sub 15 oraz 10pin ISP)
-szeroki zakres zasilania dzięki zastosowaniu stabilizatora 7805 (zalecane 9-12V)
-wyprowadzenie portu C mikrokontrolera jako przetwornika A/D
-wyprowadzenie dwóch osobnych pinów 10 bitowego przetwornika A/D
- 12 sterowanych wyjść na płytce
-zastosowanie standardowych pinów z rostawem 2.54mm dla wyjść układu
-dwa wyjścia ze zmiennym przebiegiem prostokątnym o regulowanym wypełnieniu w zakresie od 0 do 100% (PWM)
-zastosowanie układu scalonego MAX232 do zmiany napięć na magistrali RS232 w komputerze na standard TTL
-zastosowanie rezonatora kwarcowego w celu zwiększenia częstotliwości pracy rdzenia kontrolera oraz poprawienia stabilności jego pracy
-możliwość dołączenia dodatkowych modułów z różnorakimi funkcjami
-zastosowanie montażu powierzchniowego w możliwie największym stopniu
-możliwość zastosowania wyprowadzeń układu jako wejścia jak i wyjścia
Spis elementów:
-Atmega8 TQFP 32pin
-MAX232 so16
-złącze d'sub 15pin
-złącze ISP 10pin
-Kondensatory 22pF
-Kondensatory 100nF
-listwa goldpin 2.54mm
-rezonator kwarcowy 16MHz
-Kondensatory elektrolityczne 100uF
-Kondensatory elektrolityczne 1uF
-złącze AK550
-Dławik 10uH
-Rezystory 10k Ohm oraz 0 Ohm
Schematy
Wsad do procesora:
/*
* Atmega8_Uart_nadawca.c
*
* Created: 2014-03-20 00:12:22
* Author: Patryk Gałczyk
*/
#include <stddef.h>
#include <avr/io.h> //Dodawanie plików z funkcjami programu
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned char tablica [5];
volatile unsigned char us=0; //Definiowanie zmiennych
volatile char wd=0;
static void uart_9600()
{
#define BAUD 9600
#include <util/setbaud.h> //Definiowanie prędkości przesyłu danych
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
}
void UART_master_init()
{
uart_9600();
UCSRB=0b10011000;
UCSRC=0b10000011; //8 bitów danych, 2 bity stopu,
} //bez parzystości, Tryb asynchroniczny
ISR(USART_RXC_vect)
{
tablica[us]=UDR;
us++;
if (us==4) //Funkcja odpowiedzialna za
{ //odbiór danych z magistrali RS232
us=0;
TCCR1A=0b00000001;
if (tablica[0]==0)
{
}
else
{
TCCR1A=TCCR1A|0b11000000;
tablica[0]=tablica[0]<<2;
OCR1AL=tablica[0];
}
if (tablica[1]==0)
{
}
else
{
TCCR1A=TCCR1A|0b00110000;
tablica[1]=tablica[1]<<2;
OCR1BL=tablica[1];
}
tablica[2]=tablica[2]<<2;
PORTD=tablica[2];
PORTC=tablica[3];
}
wd=1;
}
int main() //Funkcja głowna programu
{
DDRB=0b110;
PORTB=0b110;
DDRD=0b11111100;
PORTD=0b11111100; //Definiowanie stanów IO
DDRC=0b111111;
PORTD=0b111111;
TCCR1A=0b11110001; //Uruchamianie timera odpowiedzialnego
TCCR1B=0b00001001; //za generowanie sugnału PWM
OCR1AL=0;
OCR1BL=0;
UART_master_init(); //Wywołanie funkcji uinicjacji modułu UART
sei(); //Odblokowanie przerwań procesora
while(1)
{
if (wd==1) //Funkcja resetująca zmienne pomocnicze
{
_delay_ms(100);
us=0;
wd=0;
}
}
}
Funkcja odpowiedzialna za przesył danych do układu
Pochodzi dedykowanego programu (cała aplikacja w załączniku)
private void button4_Click(object sender, EventArgs e)
{
int portd = 0;
int portc = 0;
if (port.IsOpen)
{
Byte[] tosend1 = { (Byte)trackBar1.Value };
port.Write(tosend1, 0, 1);
Byte[] tosend2 = { (Byte)trackBar2.Value };
port.Write(tosend2, 0, 1);
if (checkBox1.Checked == false)
{ portd = portd + 32; }
if (checkBox2.Checked == false)
{ portd = portd + 16; }
if (checkBox3.Checked == false)
{ portd = portd + 8; }
if (checkBox4.Checked == false)
{ portd = portd + 4; }
if (checkBox5.Checked == false)
{ portd = portd + 2; }
if (checkBox6.Checked == false)
{ portd = portd + 1; }
Byte[] tosend3 = { (Byte)portd };
port.Write(tosend3, 0, 1);
portd = 0;
if (checkBox12.Checked == false)
{ portc = portc + 32; }
if (checkBox11.Checked == false)
{ portc = portc + 16; }
if (checkBox10.Checked == false)
{ portc = portc + 8; }
if (checkBox9.Checked == false)
{ portc = portc + 4; }
if (checkBox8.Checked == false)
{ portc = portc + 2; }
if (checkBox7.Checked == false)
{ portc = portc + 1; }
Byte[] tosend4 = { (Byte)portc };
port.Write(tosend4, 0, 1);
portc = 0;
}
}