Gast
#109925
Ich hatte keinen ADC da um Werte mit dem PC zu messen, daher habe ich ein kleines Programm für den AT90S8535 geschrieben, um die Spannungen an den 8 Eingängen zu messen. Durch Befehle kann man die einzelnen Kanäle abfragen, oder zwischen 10 oder 8bit Wählen (Bit ADC10 in Register Bits gesetzt oder nicht). Ebenso wird entweder einmal oder kontinuierlich umgewandelt und übertragen (Bit FreeRun in Register Bits, ich verwende dabei nicht den FreeRun Modus des ADC sondern den Singe Modus !). Wenn ich nur einmal umwandle (FreeRun gelöscht), dann funktioniert alles. Ist aber das Bit FreeRun gesetzt, wird am Ende der ADC Interrupt Routine nach der Übertragung wieder eine neue Umwandlung gestartet und somit ununterbrochen Werte übertragen. Aber das funktioniert nicht. Ich bekomme falsche Werte und Framing Fehler. Hier der Code der ADC Interrupt Routine: ADC_COMPLETE_INT: ;ADC Interrupt sbis USR,UDRE ; wait for TX to be ready rjmp ADC_COMPLETE_INT; no, wait some more sbrc Bits, ADC10 rjmp ADC10bitSend in r18, ADCL in r0, ADCH ror r0 ror r18 ;10bit -> 8bit ror r0 ror r18 out UDR, r18 sbrc Bits, FreeRun sbi ADCSR, ADSC reti ADC10bitSend: sbrc Bits, FreeRun cbr Bits, 1 in r18, ADCL out UDR, r18 HBWait: sbis USR,UDRE ; wait for TX to be ready rjmp HBWait ; no, wait some more in r18, ADCH out UDR, r18 sbrc Bits, FreeRun sbi ADCSR, ADSC reti