hallo ich habe eine routine für den avr 8515 geschrieben. die interuptroutine wird bei erreichen des timer1 overflow angesprungen. leider macht die routine nicht das was sie soll. in der routine wird ein register(count) hochgezählt welches bei erreichen gewisser werte den port b ein und ausschaltet. bei erreichen des maxwertes wird das register wieder auf 0 gesetzt und die schleife beginnt von vorne. dir routine funktioniert in einem testprogramm innerhalb einer endlosschleife wunderbar nur im interrupthandler nicht. kann mir jemand helfen? kann man interruptroutinen direkt debuggen? danke für eure hilfe crishy
Kann Dir sagen (schreiben), warum es "Grundsätzlich" nicht geht! Zum einen machst Du in der Timer-ISR ein "rcall löschebit" und bei "löschebit" machst Du statt einem "ret" ein "rjmp sb_z". Das schreit direkt nach Stapelüberlauf bzw. ungewollte Rekursion. Ersetze die 2 rcall in der Timer-ISR durch "RJMP", dann kommst Du Deinem Ziel ein bißchen näher.
Habe gerade noch mal drübergeschaut und da ist mir aufgefallen, das Du innerhalb der Timer-ISR mit "rjmp WEITER1" und "rjmp WEITER2" Rückschritte bzw. Schleifen innerhalb der Timer-ISR machst. Glaube nicht, dass das einwandfrei funxioniert. Innerhalb eines Frequenzschrittes des Timers sollte doch nur 1 mal die LED Ein- oder Ausgeschaltet werden und nicht X-mal, oder? Versuche das mal so umzuformen, das innerhalb eines Timer-Aufrufes nur eine Aktion ausgeführt wird, ansonsten hängt der AVR "ewig" in der Timer-ISR fest. MfG Andi
Schön, das es nun funtzt. Aber das mit dem "rjmp WEITER1" und "rjmp WEITER2, muß das sein? Kostet doch nur unnötig Zeit in der Timer-ISR, oder nicht? MfG Andi
Ja stimmt. In dieser Version wird die Variable impuls erst mit dem aufruf led_reset verändert. Vorher hatte ich das problem, dass sich die variable wärend des abzählens verändert und daduch plötzlich der zustand impuls=count nicht mehr eintraf. Um nicht einen Durchgang zu verpassen wollte ich auch die prüfung impuls>=impulsbreite durchführen. mfg crishy
So wie ich das verstanden habe, willst Du nur EINE LED verschieden hell leuchten lassen. Hier eine kleine Version die das selbe macht: TIM1_OVF: push TEMP ; Sichern von "TEMP" im Stack in TEMP,SREG ; Einlesen des SREG push TEMP ; Schreiben von SREG im Stack (KOPIE) ;Timer Startwert ldi temp,timerwertHIGH ;HIGH out tcnt1H,temp ldi temp,timerwertLOW ;LOW out tcnt1L,temp inc count ;PWM-Counter erhöhen cpi count,Pulsenbreite ;Ist PWM-Counter auf maximum? brne CountNoClr ;Dann von vorne clr count ;... CountNoClr: cp count,Impuls ;Ist der Counter >= Einschaltzeit? brsh LEDaus ;Dann LED aus cbi PortB,7 ;Ansonsten an rjmp Weiter LEDaus: sbi PortB,7 Weiter: pop TEMP ; LESEN von SREG vom STACK (KOPIE) out SREG,TEMP ; Wiederherstellen von SREG pop TEMP ; Wiederherstellen von "TEMP" reti Das eigentlich Ein- oder Ausschalten der LED dauert max. 10 Takte. MfG Andi
hallo andi deine routine funktioniert wunderbarbar, wärend ich meine vergessen kann... und ich komm nicht drauf wo der hund begraben liegt. danke nochmals. crishy
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.