Forum: Mikrocontroller und Digitale Elektronik timer mega128 probleme mit der isr


von Andreas V. (Firma: private) (uranus303)


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);
       }

von Willi W. (williwacker)


Lesenswert?

ist dac() reentrant ?

#asm("cli" ist übrigend überflüssig und cli in der Schleife aufzurufen 
macht keinen Sinn, aber auch keinen Schaden (einmal muss aber sein).

von Johannes M. (johnny-m)


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...

von Andreas V. (Firma: private) (uranus303)


Lesenswert?

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;

von Andreas V. (Firma: private) (uranus303)


Lesenswert?

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

von Falk B. (falk)


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

von Andreas V. (Firma: private) (uranus303)


Lesenswert?

stimmt, aber wenn er in der DAC Funktion ist, und bei der 
Verarbeitung(in der DAC) ein Interrupt ausgelöst wird, bleibt er nach 
einer bestimmten Zeit hängen.
Leider habe ich von der uC Programmierung keine Ahnung

von holger (Gast)


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();

von Falk B. (falk)


Lesenswert?

@ Andreas Voel (Firma private) (uranus303)

>Leider habe ich von der uC Programmierung keine Ahnung

Warum tust du es dann?

MfG
Falk

von Andreas V. (Firma: private) (uranus303)


Lesenswert?

@  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

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.