www.mikrocontroller.net

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


Autor: Andreas Voel (Firma: private) (uranus303)
Datum:

Bewertung
0 lesenswert
nicht 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);
       }

Autor: Willi Wacker (williwacker)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Andreas Voel (Firma: private) (uranus303)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Andreas Voel (Firma: private) (uranus303)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Voel (Firma: private) (uranus303)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Andreas Voel (Firma private) (uranus303)

>Leider habe ich von der uC Programmierung keine Ahnung

Warum tust du es dann?

MfG
Falk

Autor: Andreas Voel (Firma: private) (uranus303)
Datum:

Bewertung
0 lesenswert
nicht 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

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.