mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Unerklärlicher Interrupt im Programm


Autor: Benny B. (pen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
Ich arbeite gerade an einem größeren Projekt mit einem ATMEGA8515, 
programmiere in C und benutze das AVR Studio 4. Im Moment versuche ich 
über SPI einen DA-Wandler anzusteuern, doch dabei tauchte ein Problem 
auf.
Und zwar bleibt mein Programm immer an der gleichen Stelle "hängen", 
selbst wenn ich es simuliere(aber ohne JTAG). Lasse ich die Optimierung 
weg, klappts einwandfrei, ich frage mich nur, wo das Problem liegen 
soll. Erst einmal ein Ausschnitt:


void spi_init(void)
{
  DDR_SPI = OUTPUT;
  DDR_SPI &= ~(1<<DD_MISO);
  SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);
  SS_OFF;
  sei();
}


ISR(SIG_SPI)
{

}

uint16_t value(float da)
{
  uint16_t result = 0;
  da /= 0.002441;
  result = (uint16_t)da;
  return result;
}

void spi_send_2byte(uint16_t send)
{
  uint8_t sen = 0;
  sen = send >> 8;
  send &= 0xFF;
  SPDR = sen;
  while(!(SPSR & (1<<SPIF)));
  SPDR = send;
  while(!(SPSR & (1<<SPIF)));
}

void spi_send_dac(uint8_t cmd, float temp)
{
  uint16_t data = 0;
  data = value(temp);
  uint16_t send_dac = 0;
  cmd &= 0x0F;
  send_dac = cmd << 12;
  data &= 0x3FF;
  data <<= 2;
  send_dac += data;
  send_dac &= 0xFFFC;
  spi_send_2byte(send_dac);
}

Aus meinem Hauptprogramm rufe ich die Funktion spi_send_dac wie folgt 
auf:
spi_send_dac(0b0001, 0.02);
Die anderen beiden Funktionen werden dann ja innerhalb der Funktion 
spi_send_dac aufgerufen (eigentlich)...
Denn nach der Zeile
send_dac += data;
springt das Programm in die ISR, was ich mir nicht erklären kann, und 
die darauffolgende Zeile wird dann nicht mehr ausgeführt, bzw. bleibt 
das Programm dann in dieser Zeile stehen, was ich mir nicht erklären 
kann.
Ich hoffe, dass irgendwer eine Idee dazu hat!

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>SPCR = (1<<SPIE)|

Wenn du in der ISR sowieso nichts machst, dann solltest du das (1<<SPIE) 
weglassen.

Autor: Benny B. (pen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist halt dann, dass ich ja beim Senden den Vergleich
    while(!(SPSR & (1<<SPIF)));
mache. Dazu brauche ich aber doch den SPIE, oder nicht?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benny B. schrieb:
> Das Problem ist halt dann, dass ich ja beim Senden den Vergleich
>     while(!(SPSR & (1<<SPIF)));
> mache. Dazu brauche ich aber doch den SPIE, oder nicht?

Du solltest dir angewöhnen, das Datenblatt deins Prozessors beim 
Programmieren irgendwo am Bildschirm zu haben und bei jedem Bit, das du 
setzt, die Beschreibung zu lesen

[quote]
• Bit 7 – SPIE: SPI Interrupt Enable
This bit causes the SPI interrupt to be executed if SPIF bit in the SPSR 
Register is set and the if
the global interrupt enable bit in SREG is set.
[/quote]

SPIE brauchst du nur dann, wenn du, ausgehend vom SPIF Bit, eine ISR 
ausführen lassen möchtest. SPIF ist also Voraussetzung dafür, dass SPIE 
irgendetwas bewirken kann. Aber ein nicht gesetztes SPIE Bit hat keinen 
Einfluss auf die Funktion von SPIF

Autor: Benny B. (pen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na das hört sich sehr gut an!
Habe den SPIE nun weg gelassen und das Programm läuft einwandfrei 
soweit!
Vielen Dank für die schnelle und präzise Hilfe!

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.