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); }
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).
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...
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;
ich habe mein fehler gefunden, und zwar mußte ich in der DAC den Interrupt abstellen, wie kann man es besser machen
@ 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
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
>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();
@ Andreas Voel (Firma private) (uranus303)
>Leider habe ich von der uC Programmierung keine Ahnung
Warum tust du es dann?
MfG
Falk
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.