www.mikrocontroller.net

Forum: Compiler & IDEs ATMEGA32 - C++ Interrupts, ISR wird nicht ausgeführt


Autor: tombalabomba (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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);

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht das das nicht gehen würde (4 Anweisungen in for)... aber es geht 
anders.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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. ;-)

Autor: tombalabomba (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.