Hallo,
Ich bin am verzweifeln!
Ich will dass mein ATmega8535 signale per USART empfängt.
Der USART ist ja im prinzip so easy, aber trotzdem bekomm ich es nicht hin, die Signale zu empfangen, ich verstehs nicht warum!
Zunächst mal zum programm.
Ich benutze externe c-files um bestimmt Funktionen einfacher in Projekten einzubinden.
Daher sind auch die USART-Funktionen in der usart.c:
Code:
/******************************************************************************/
/******************************* Kaiser Franz *********************************/
/******************************************************************************/
#include "usart.h"
#define F_CPU 7372800
#define USART_BAUD_RATE 115200
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)
// USART - FUNKTIONEN
//===============================================
void USART_init(void){
UBRRL |= (uint8_t) USART_BAUD_SELECT;
/* Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts */
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
/* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
void USART_transmit(uint8_t c){
while(!(UCSRA & (1<<UDRE)));
UDR = c;
}
void USART_transmit_string(uint8_t *string){
while(!(UCSRA & (1<<UDRE)));
while( *string){ USART_transmit (*string++); }
}
void USART_transmit_bin(uint8_t c){
if( c & (1<<7) ){ USART_transmit(0x31); } else { USART_transmit(0x30); }
if( c & (1<<6) ){ USART_transmit(0x31); } else { USART_transmit(0x30); }
if( c & (1<<5) ){ USART_transmit(0x31); } else { USART_transmit(0x30); }
if( c & (1<<4) ){ USART_transmit(0x31); } else { USART_transmit(0x30); }
if( c & (1<<3) ){ USART_transmit(0x31); } else { USART_transmit(0x30); }
if( c & (1<<2) ){ USART_transmit(0x31); } else { USART_transmit(0x30); }
if( c & (1<<1) ){ USART_transmit(0x31); } else { USART_transmit(0x30); }
if( c & (1<<0) ){ USART_transmit(0x31); } else { USART_transmit(0x30); }
}
Wichtig hier ist ja eigentlich nur das USART_init():
Code:
void USART_init(void){
UBRRL |= (uint8_t) USART_BAUD_SELECT;
/* Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts */
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
/* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
Hier noch die main.c:
Code:
/****************************************************************************/
//
// Programmname : USART
//
// Chip type : ATmega8535
// Clock frequency : 7,3728 MHz
//
//****************************************************************************/
// INCLUDE & DEFINE
//=============================================================================
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <usart.h>
// HAUPTFUNKTION
//=============================================================================
int main (void)
{
// D A T E N R I C H T U N G :
//===============================================
// PORTA Pin: 76543210 ( 0 = Eingang/Pullup aus, 1= Ausgang/Pullup ein )
DDRA = 0b11111111; //
PORTA = 0b00000000; //
// PORTB Pin: 76543210 ( 0 = Eingang/Pullup aus, 1= Ausgang/Pullup ein )
DDRB = 0b00000000; //
PORTB = 0b00000000; //
// PORTC Pin: 76543210 ( 0 = Eingang/Pullup aus, 1= Ausgang/Pullup ein )
DDRC = 0b00000000; //
PORTC = 0b11111111; //
// PORTD Pin: 76543210 ( 0 = Eingang/Pullup aus, 1= Ausgang/Pullup ein )
DDRD = 0b00000000; //
PORTD = 0b00000000; //
// Interrupts freigeben:
//===============================================
sei();
// Funktionen:
//===============================================
SIGNAL( SIG_USART_RECV )
{
uint8_t data;
data = UDR;
/* echo */
USART_transmit(data);
}
// Initialisieren:
//===============================================
USART_init();
USART_transmit_string("USART Init \r");
uint8_t x;
// Hauptschleife
//=============================================================================
while (1) {
if (bit_is_clear (PINC, PINC0) & (x == 0)) {
USART_transmit_string("PIND 0 getippt ");
x=1;
}
if (bit_is_clear (PINC, PINC7)){ x=0; }
PORTA = UCSRA;
}
}
mit USART_transmit_string(" BLABLA "); sende ich... da gab es nochnie Probleme damit....
aber nun will ich Empfangen und habe einfach mal das hier geschrieben:
Code:
// Interrupts freigeben:
//===============================================
sei();
// Funktionen:
//===============================================
SIGNAL( SIG_USART_RECV )
{
uint8_t data;
data = UDR;
/* echo */
USART_transmit(data);
}
Damit sollte er die Daten Empfangen und gleich wieder weitersenden.
SO, nun zu dem was passiert, (bzw. nicht passiert):
Ich schalte ein:
es wird vom MCU gesendet: USART Init.
UCSRA wird ja an PortA ausgegeben,
nun Leuchtat da :
TXC = USART Transmit Complete
UDRE = USART Data Register Empty
Jetzt sende ich an den MCU, irgend EIN zeichen:
an UCSRA sind alle Bits LOW,
Der MCU reagiert nicht mehr, auch nicht auf meine Tastenbefehle auf PORTC...
An was kann das liegen? bitte helft mir.
Ich habe 3 Testboards, an allen ist das Selbe. Leitungsfehler kann man ausschließen....
Lesezeichen