timer mega128 probleme mit der isr

OP (Firma: private) #753974
Lesenswert?
• ▲
▼
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);
       }
#754005
Lesenswert?
• ▲
▼
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...
#754031
Lesenswert?
• ▲
▼
@ 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 #754104
Lesenswert?
• ▲
▼
>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();

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren