Forum: Compiler & IDEs Probleme mit sei()


von Daniel H. (Gast)


Lesenswert?

Hi

hab mir jetzt mal das neue winavr drauf gemacht und jetzt hab ich ein
ganz komisches Prob. . Immer wenn der Controller an den Punkt sei();
kommt hängt er sich da auf. Das war aber noch nicht mit der älteren
Version so denke ich. Gibts da jetzt was zu beachten? Solltet ihr den
Prog. code  brauchen sagt bescheid (ist auf einem anderen PC). Je
später ich sei(); im Prog setzt desto weiter komm ich im code.

MFG
Daniel

von Thomas K. (thkais)


Lesenswert?

Dir ist schon bewusst, was sei() macht?

Dann müsste Dir auch in den Sinn gekommen sein, dass der Fehler nicht
am sei()-Befehl liegt, sondern in einem anderen Programmbereich.

Nur mal so als Tipp: Checke Deine Interrupt-Routinen durch.

Gruß
Thomas

von Daniel H. (Gast)


Lesenswert?

Also wenn ich das Richtig verstanden habe macht sei(); nichts anderes
als den globalen Interrupt zu aktivieren. Ich poste mal mein kleinen
Text vielleicht fällt da ja jemanden was auf.

#include <stdlib.h>
#include <lcd.h>
#include <lcd.c>
#include <avr/interrupt.h>

int stat = 0;
unsigned long int temp = 50;
unsigned long int time = 10; //
char buffer[20]; //buffer

ISR(TIMER1_CAPT_vect)
{
  temp = 100;
  temp = ICR1;
}

void lcd(void)
{

  itoa( time , buffer, 10); //wandle integer in string
  lcd_gotoxy(0,1); // gehe zu LCD Position X Y
  lcd_puts(buffer); //schreibe auf den LCD den Inhalt von Var buffer
}

int main(void)
{
  TIMSK |= (1<<TICIE1) | (1<<TOIE1); // Input Capture Interrupt
aktiviert; Timer 1 Overflow Interrupt aktiviert
  TCCR1B |= (1<<CS10) | (0<<CS11) | (0<<CS12); // Timer CPU-Takt /

  sei();

  lcd_init(LCD_DISP_ON);
  lcd_clrscr();
  lcd_init(LCD_DISP_ON);

  lcd_puts("Impulsdauer:\n");

  for(;;)
  {
  time = temp;
  lcd();
  }

}

Soll das jetzt heißen der hängt in der input capture interrupt fest?
Aber der wird doch nicht dauern ausgelöst hab das teil ja schonmal an
Masse angeschlossen damit da ja kein Signal anliegt.

Vielleicht sieht ja jemand was was ich falsch mache sitze schon wieder
so lange dadran das es wieder so einfach ist das ich es nicht sehe.

MFG
Daniel

von André K. (freakazoid)


Lesenswert?

> TIMSK |= (1<<TICIE1) | (1<<TOIE1); // Input Capture Interrupt
> aktiviert; Timer 1 Overflow Interrupt aktiviert
Wo ist ISR(TIMER1_OVF_vect)?

Grüße, Freakazoid

von johnny.m (Gast)


Lesenswert?

> ...den globalen Interrupt zu aktivieren...
Wer ist denn "der globale Interrupt"? Eher wird das globale
Interrupt-Enable-Bit gesetzt, wodurch Interrupt-Bearbeitung global
freigegeben wird.

Ansonsten hat André völlig recht. Ein Interrupt ohne Handler führt
i.d.R. zu einem Reset, wenn er auftritt.

von Daniel H. (Gast)


Lesenswert?

@andré

hmm ja was soll ich sagen hab es immer und immer wieder überlesen.
Danke für die Hilfe bin echt ein schussel. Prog funzt aber ich glaub
den Fehler mach ich so schnell nicht wieder. Hab lange dran
rumgedockter

@johnny

Danke für die korrektur hast natürlich recht. Werde es mir merken.

Also Problem behoben!!!!!.

von Dirk (Gast)


Lesenswert?

Hi,

>TCCR1B |= (1<<CS10) | (0<<CS11) | (0<<CS12); // Timer CPU-Takt /

Das (0<<CS11) und (0<<CS12) klappt, aber so nicht moechtest du Bits
loeschen TCCR1B &= ~(1<<CS11) & ~(1<<CS12). In deinem Fall ist es aber
voellig egal.

Gruß,
Dirk

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
Noch kein Account? Hier anmelden.