Ok, ihr habt mich ertappt.
Hab beim abtippen bzw. reinkopieren etwas geschlampt.
Hier also der Source.
Ich wollte eigentlich den UART in eine eigen Klasse ausgliedern.
Da es eben mit der ISR nich klappte, habe ich es zum Testen in mein
main- file geschrieben.
Das ändert allerdings nichts daran, dass es immer noch C++ -Code ist.
Ausserdem ist mir schon klar, dass man den UART zuvor initialisieren
muss.
Ich wollte nur der Übersichtlichkeit wegen den Code auf die ISR
beschränken.
Wie bereits erwähnt, liegt mein Problem beim Makefile.
Wenn ich nur ein C++- file, nämlich das main-file anlege, funktioniert
das MFILE-Tool von WinAVR einwandfrei.
Will ich allerdings ander Klassen hinzufügen, sprich mehrere C++-Files,
funktioniert das leider nicht.
Und eben mit meinem selbst geschrieben MakeFile funktioniert die ISR
nicht.
Weis jemand von euch, ob man bzgl. Interrupts noch ein spezielles
Compilerflag setzen muss?
Ich häng sicherheitshalber noch mal mein selbst geschriebenes Makefile
mit an.
LG
#include <avr/io.h>
#include <avr/interrupt.h>
#define BAUD_RATE 51
//----------------------------------------------------------------------
void initializeInterface()
{
//baudrate
UBRRH = (unsigned char)(BAUD_RATE >> 8);
UBRRL = (unsigned char)BAUD_RATE;
//enable receiver and transmitter
UCSRB = (1 << RXEN) | (1 << TXEN);
//frame format: 8data, 2stop bit
UCSRC = (1 << URSEL) | (1 << USBS) | (3 << UCSZ0);
}
//----------------------------------------------------------------------
void transmitByte(unsigned char data)
{
// Wait for empty transmit buffer
while ( !( UCSRA & (1<<UDRE)) )
;
// Put data into buffer, sends the data
UDR = data;
}
//----------------------------------------------------------------------
unsigned char receiveByte()
{
// Wait for data to be received
while ( !(UCSRA & (1<<RXC)) )
;
// Get and return received data from buffer
return UDR;
}
//----------------------------------------------------------------------
//interrupt routine if a character was received
ISR(USART_RXC_vect)
{
unsigned char tmp_status = SREG;
unsigned char tmp= receiveByte();
for (unsigned int i = 0; i<1600;i++)
{
transmitByte('k');
}
SREG = tmp_status;
}
//----------------------------------------------------------------------
//main
int main()
{
initializeInterface();
sei();
UCSRB |= (1 << RXCIE);
//start message
char msg[] = {'S','T','A','R','T',' ','\0'};
unsigned int index = 0;
while(msg[index] != '\0')
{
transmitByte(msg[index++]);
}
while(true)
{
}
return 0;
}