Írtam egy AVR-GCC programot, helyes?
/*BT tesztprogram: Digitalis Kapcsolo
Hardver: ATmega8 @ 7.372800MHz
PC Szoftver: Hyper terminal @ 9600 baud, Nincs Paritas Bit, 1 Stop Bit, Flow Control = NONE
*/
#define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
#define USART_BAUDRATE 9600 // soros kommunikacio sebessege: 9600 bps
#define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1) // UBRR
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <util/delay.h>
void KonfigUART() // UART beallitasa
{
// 9600 bps soros kommunikacio sebesseg beallitasa
UBRRL = UBRR_ERTEK; // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
UBRRH = (UBRR_ERTEK>>8); // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
// Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
//Ado es Vevo aramkorok bekapcsolasa + az RX interrupt engedelyezese
UCSRB |= (1 << RXEN) | (1 << RXCIE) | (1 << TXEN); //
}
char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
{
while(!(UCSRA & (1<<RXC))) // Varakozas amig nincs uj bejovo adat
{
// Varakozas
}
//Most mar van beerkezett adat, amit kiolvasunk a pufferbol
return UDR;
}
void UARTAdatKuld(char data) // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
{
while(!(UCSRA & (1<<UDRE))) // Varakozas amig az Ado kesz nem lesz az adatkuldesre
{
// Varakozas
}
// Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
UDR=data;
}
void UARTSzovegKuld( char *p)
{
while(*p)
{
UARTAdatKuld( *p++);
}
}
int main(void) // Foprogram
{
DDRC = _BV(PC0); // PC0 kimenet
DDRC = _BV(PC1); // PC1 kimenet
DDRC = _BV(PC2); // PC2 kimenet
DDRC = _BV(PC3); // PC3 kimenet
DDRC = _BV(PC4); // PC4 kimenet
DDRC = _BV(PC5); // PC5 kimenet
KonfigUART(); // UART Konfiguralasa
sei(); // Altalanos megszakitasok engedelyezese
while(1)
{
// Ures ciklus (mindent az ISR-en belul kezelunk)
}
return 0;
}
ISR(USART_RXC_vect) // RX interrupt, ezek az utasitasok futak le ha bejovo adat erkezik
{
char data;
data = UARTAdatFogad(); // A berekezo bajt fogadasa
if(data == 'q') // Ha a fogadott bajt 'q'-vel egyezik meg, BE
{
PORTC |= _BV(PC0); // PC0 lábra +5V
UARTSzovegKuld("Be1"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'w') // Ha a fogadott bajt 'w'-val egyezik meg, KI
{
PORTC &=~_BV(PC0); // PC0 lábra 0V
UARTSzovegKuld("Ki1"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'e') // Ha a fogadott bajt 'e'-vel egyezik meg, BE
{
PORTC |= _BV(PC1); // PC1 lábra +5V
UARTSzovegKuld("Be2"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'r') // Ha a fogadott bajt 'r'-val egyezik meg, KI
{
PORTC &=~_BV(PC1); // PC1 lábra 0V
UARTSzovegKuld("Ki2"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 't') // Ha a fogadott bajt 't'-vel egyezik meg, BE
{
PORTC |= _BV(PC2); // PC2 lábra +5V
UARTSzovegKuld("Be3"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'z') // Ha a fogadott bajt 'z'-vel egyezik meg, KI
{
PORTC &=~_BV(PC2); // PC2 lábra 0V
UARTSzovegKuld("Ki3"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'u') // Ha a fogadott bajt 'u'-sel egyezik meg, BE
{
PORTC |= _BV(PC3); // PC3 lábra +5V
UARTSzovegKuld("Be4"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'i') // Ha a fogadott bajt 'i'-vel egyezik meg, KI
{
PORTC &=~_BV(PC3); // PC3 lábra 0V
UARTSzovegKuld("Ki4"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'o') // Ha a fogadott bajt 'o'-val egyezik meg, BE
{
PORTC |= _BV(PC4); // PC4 lábra +5V
UARTSzovegKuld("Be5"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'p') // Ha a fogadott bajt 'p'-vel egyezik meg, KI
{
PORTC &=~_BV(PC4); // PC4 lábra 0V
UARTSzovegKuld("Ki5"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'a') // Ha a fogadott bajt 'a'-val egyezik meg, BE
{
PORTC |= _BV(PC5); // PC5 lábra +5V
UARTSzovegKuld("Be6"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 's') // Ha a fogadott bajt 's'-vel egyezik meg, KI
{
PORTC &=~_BV(PC5); // PC5 lábra 0V
UARTSzovegKuld("Ki6"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'd') // Ha a fogadott bajt 'd'-vel egyezik meg, MIND KI
{
PORTC = 0x00; //mindent kikapcsol
UARTSzovegKuld("Ki7"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
else if(data == 'f') // Ha a fogadott bajt 'f'-vel egyezik meg, MIND BE
{
PORTC = 0xFF; //mindent bekapcsol
UARTSzovegKuld("Be7"); // Szoveg kiirasa
UARTAdatKuld('n'); // Kovetkezo sor
UARTAdatKuld('r'); // Ugras a sor elejere
}
}
1. Semmi részletet nem tudunk a hardverről.
2. Töltsd le és próbáld ki. Ha nem jó, akkor szedd szét, és modulonként teszteld. Sőt szerintem avr szimulátorok is vannak a neten.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!