Hallo! Ich möchte einen mega32 mit C++ beschreiben. Da mir allerdings das MFILE- Tool bei WinAVR kein kompilierendes Makefile erzeugt, musste ich mir selbst eines schreiben. Das funktioniert an und für sich ganz gut, allerdings möchte ich den UART mittels Interrupt auslesen. Jetzt habe ich das Problem, dass die ISR nicht ausgeführt wird. Syntaktisch müsste in meinen Source eigentlich alles passen. Ich habe ein äquivalentes C-Programm erstellt, wobei ich das Makefile jedoch mit dem MFILE- Tool erstellt habe. Vielleicht hat ja von euch jemand schon ein ähnliches Problem gehabt. Ich wär für Lösungsvorschläge auf jeden Fall dankbar. //---------------------------------------------------------------------- //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<16000;i++) { transmitByte('k'); } SREG = tmp_status; } //---------------------------------------------------------------------- int main() { initializeInterface(); sei(); //global enable of interrupts UCSRB |= (1 << RXCIE);
1. du benutzt da C, nicht C++ - gewaltiger Unterschied 2. du musst den UART erstmal anschalten, sonst wird dat nix. Ohne deine Init-Routine kann dir vermutlich niemand helfen.
> for (unsigned int i = 0;; i<16000;i++)
Ein "for" mit 3 Semikolons in der Klammer?
Offensichtlich mal wieder ein Fall von viel zu wenig Code, und dann auch
noch eingetippt und nicht kopiert.
Nicht das das nicht gehen würde (4 Anweisungen in for)... aber es geht anders.
> Nicht das das nicht gehen würde (4 Anweisungen in for)... aber es geht > anders. Ist mir auch gleich aufgefallen, dass das nicht sehr präzise war, deshalb habe ich noch schnell editiert. Aber offensichtlich nicht schnell genug. ;-)
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; }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.