timer mega128 probleme mit der isr

OP (Firma: private) #753974
moin moin, ich habe folgendes Problem.
Nach einer Weile bleibt der mega 128 in der ISR des Timers hängen, aber 
ich sehe meinen Fehler nicht, bitte um hilfe
Aufgabe: Es soll eine LED über einen DAC mit kurzen Impulsen angesteuert 
werden.
code isr:

              interrupt [TIM1_COMPA] void timer1_compa_isr(void)
               {

                 #asm("cli"
                  dac(t_wert); //LED mit maximal Wert ansteuern
                  TCNT1H=0x00; //Timerzähler wieder auf 0 setzen
                  TCNT1L=0x00;
                 delay_ms(2);
                 }

TimerReg:
                     TCCR1A=0x00;
                     TCCR1B=0x03;
                     TCNT1H=0x00;
                     TCNT1L=0x00;
                     ICR1H=0x00;
                     ICR1L=0x00;
                     OCR1AH=0x1d;
                     OCR1AL=0x4c;
                     OCR1BH=0x00;
                     OCR1BL=0x00;
                     OCR1CH=0x00;
                     OCR1CL=0x00;

MAIN:
                    while (1)
      {
        #asm("sei")

         dac(750);
       }
1. Fehler:
Du zeigst nicht den ganzen Code. Es fehlt z.B. die Funktion dac(). 
Außerdem kann man den Code auch so formatieren, dass er besser lesbar 
ist...

2. Fehler:
Warteschleifen in Interrupt-Handlern sind Schrott. Wenn Du im Interrupt 
Handler warten musst, dann machst Du irgendwas grundlegend falsch.

3. Fehler:
Du setzt im Interrupt Handler das TCNT1 auf Null. Was soll das? Dafür 
gibts den CTC-Modus. Außerdem können in C 16-Bit-Register als Ganzes 
angesprochen werden. Dann braucht der Programmierer sich keine Gedanken 
über die Zugriffsreihenfolge zu machen (die hier allerdings [vielleicht 
zufällig] stimmt...)

4. Fehler:
Du verwendest offensichtlich den Code Generation Wizard von CodeVision 
o.ä. Dadurch sind Deine Register-Initialisierungen ohne Datenblatt nicht 
nachvollziehbar. Tu Dir selbst und anderen den Gefallen und 
initialisiere die Register lesbar mit Bitnamen.

...tbc...
OP (Firma: private)
reentrant->ich glaube mal nicht

code:
void dac(long int wert)
{
unsigned char high=0, low=0;
high = wert>>8;
low  = wert&0x00FF;
PORTB.0=0;
spi(high&0x0F);
spi(low);
PORTB.0=1;
}

Timer1 ist nun im CTC-Mode, aber an der Funktion bzw Fehler ändert sich 
nichts;
@ Andreas Voel (Firma private) (uranus303)

>ich habe mein fehler gefunden, und zwar mußte ich in der DAC den
>Interrupt abstellen, wie kann man es besser machen

????
Wenn dein dac() im interrupt aufgerufen wird, SIND die Interrupts schon 
abgestellt.

MfG
Falk
Gast
>Wenn dein dac() im interrupt aufgerufen wird, SIND die Interrupts schon
>abgestellt.

Das Problem ist das dac() in der ISR und in main()
aufgerufen wird. Sowas sollte man generell nicht machen. Also
entweder in der ISR oder in main();
OP (Firma: private)
@  Falk Brunner (falk)
ich muss :( ; dies soll ein testgerät werden,
ich habe mal eine ausbildung am 8085 in assembler gemacht und ein 
bißchen am msp430 in c ; und die letzen jahre nur c# ; c++ ; java , und 
da bleibt einiges wissen auf der strecke

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.