UART senden-empfangen Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
|
|
|
BID = 922371
epfuscher Gerade angekommen
Beiträge: 11
|
|
Bitte um Hilfe:
Hallo,
folgende Aufgabe:ATMEGA328P
2uC: S1..TASTER1, S2..TASTER2,L1..Led1, L2..LED2
S1 an uC1 soll LED2 an uC2 schalten(Wenn Tasrer betätigt->LED EIN)
S2 an uC2 soll LED1 an uC1 schalten(Wenn Tasrer betätigt->LED EIN)
das ganze soll mit UART realisiert werden.
Funktioniert nicht:(
Hier mein erarbeiterter Code:
Code : |
#include <avr/io.h>
#include <stdio.h>
void UART_init(); //Definition der Funktion UART_init
unsigned char UART_receive();//UART Empfangs-funktion
void UART_transmit(unsigned char data);//UART Sende-funktion
volatile unsigned char wert = 0;
int main ()
{
UART_init();//UART initialisieren
DDRC = 0x00;//Alles Eingänge
PORTC = 0x00;
DDRB |= (1<<PORTB5);//AUSGANG
PORTB |= (1<<PORTB5);//PB5 ist Ausgang (LED low aktiv)
while(1)
{
if( UART_available() ) // gibts was an der UART?
{
wert = UART_receive();//Wert empfangen
switch(wert)
{
case 'E': PORTB &= ~(1<<PORTB5); break; //LED leuchtet
case 'A': PORTB |= (1<<PORTB5); break; //LED leuchtet nicht
}
}
if ((PINC & (1<<PINC5)))
{
UART_transmit('E');//LED Ein-Befehl schicken
}
else
{
UART_transmit('A');
}
}
}
void UART_init()//Funktion UART_init
{
DDRD |= (1<<1);
DDRD &= ~(1<<0);
PORTD |= 0x02;
UCSR0B = (1<<RXEN0) | (1<<TXEN0);//RX und TX (Empfangen und Senden) enabled
UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);//8-Bit Betrieb und 1 Stopbit
UBRR0H = 0;
UBRR0L = 103;//Laut Tabelle (Datenblatt) bei 16 MHz für Baud = 9600 --> 103; UBRR0H nicht benötigt, da 2^8 = 256
}
uint8_t UART_available()
{
if( UCSR0A & (1<<RXC0) ) // gibts was an der UART zu holen?
return TRUE;
return FALSE;
}
unsigned char UART_receive()
{
while ( ! (UCSR0A & (1<<RXC0)));//Warten auf Empfang
return UDR0;//Empfangene Daten zurückgeben
}
void UART_transmit(unsigned char data)
{
while( ! (UCSR0A & (1<<UDRE0)));//Warten auf leeres Datenregister
UDR0 = data;//Daten senden
} |
|
Bitte im Detail wo der Hund ist;)
mfg |
|
BID = 922882
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
Das sieht, kurz überflogen, OK aus. Du brauchst nur die IO-Einrichtung nicht extra machen, das macht die UART-Hardware für RxD und TxD automatisch.
-> Laufen beide Prozessoren wirklich mit 16MHz?
-> Du machst UART_available() nicht bekannt
-> Du sendest permanent 'A', wenn der Taster nicht gedrückt ist, nicht gut! Abhilfe: letzten Wert des Tasters wegspeichern und nur Änderungen auswerten, Delay von ein paar Millisekunden einfügen (nicht schön, funktioniert aber)
-> hast du die UART richtig verdrahtet? RxD und TxD müssen gekreuzt verbunden werden, nicht 1:1.
-> Masseverbindung richtig?
-> es gibt keinen Grund, die Variable wert volatile zu setzen
Schaltplan, Bild des Aufbaus?
_________________
|
|
BID = 923022
hajos118 Schreibmaschine
Beiträge: 2453 Wohnort: Untermaiselstein
|
Noch ein beliebter Fehler:
- Prescaler für Taktrate richtig gesetzt?
_________________
Interpunktion und Orthographie dieses Beitrags sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Wer einen Fehler findet, darf ihn behalten!
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag heute wurden bisher 0 Beiträge verfasst © x sparkkelsputz Besucher : 182421148 Heute : 187 Gestern : 5459 Online : 522 29.11.2024 1:26 3 Besucher in den letzten 60 Sekunden alle 20.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0607271194458
|