Gast
#128161
Hallo Zusammen, ich sitze zur zeit an einem kleinen projekt, bei dem ich optisch ein entladungsleuchtmittel in der helligkeit überwachen möchte. um hier sauber messen zu können und ggf. passend skalieren zu können, muss ich meine AD wandlung des helligkeitssensors immer an einem definiertem punkt durchführen. hierzu könnte man nun einfach nen timerwert vorgeben, an dem ich den ADC starte. Ich möchte jetzt aber nach möglichkeit am helligkeitsmaximum abtasten, da hier der sinus der wechselspannung die geringsten anstiege besitzt und eventuelle geringe zeitliche versätze sich hier nicht so stark auswirken (durch Codeabarbeitung und Int-routineen einsprung). da das entladungsleuchtmittel eine spule vorgeschaltet hat, wird sich hier sicher die phase in den unterschiedlichen arbeitspunkten ändern. Spannung am leuchtmittel kurz nach zündung annähernd netzspannung und bei erreichen des AP nur noch 90V - strom umgekehrt proportional --> daher vermutung der phasendrehung in der spule ich habe um nun die phase bestimmen zu können folgenden code in asembler geschrieben, bei dem ich durch nen zero cross sensor meinen timer starte und sofort im free runnig mode meine AD wanlung permanent durchführen lassen möchte. ist der neue wert kleiner als der vorgängerwert (fallende flanke der helligkeitskurve) möchte ich den timer stoppen und diesen wert nun als referenz verwenden. von eventuellen korrekturen durch laufzeit mal abgesehen. leider bleibt mein programm in der "Test_ADC_ready" schleife stecken. in avr studios simulator funktioniert alles, aber im chip (MEGA128)...??? keine ahnung mehr --> hat jemand nen tipp oder ne idee wo der fehler liegt oder vielleicht -> wie es besser geht? bastle seit tagen daran herum aber mein mega128 möchte dies nicht so tun wie es gern hätte. arbeite hier bewusst noch nicht mit interrupts, diese brauche ich später für andere routinen. ach so, die ADC und Timer initialisierungen hab ich hier mal weg gelassen, die passen . . . ; Zero Cross detection Not_Zero: in temp0, PIND ; check auf 1 sbrs temp0, 0 rjmp NOT_Zero Zero: in temp0, PIND ; check auf 0 (falling edge) sbrc temp0, 0 rjmp Zero ; Timerstart ldi temp0, (1<<CS02)|(1<<CS01)|(1<<CS00) out TCCR0, temp0 clr ZL clr ZH Start_ADC: ldi temp0, (1<<ADSC)|(1<<ADEN)|(1<<ADFR) out ADCSR, temp0 Test_ADC_ready: in temp0, ADCSR sbrc temp0, ADSC rjmp Test_ADC_ready in temp1, TCNT0 in ZL, ADCH ; load new ADC value cp ZL, ZH mov ZH, ZL ; copy new ADC value to ZH brge Start_ADC clr temp0 out ADCSR, temp0 mov Timer1, temp1 . . . schon mal im voraus vielen dank an die, die sich meines problems annehmen.