;**************************************** ;* * ;* BARGRAPH mit 8Bit * ;* * ;* * ;* by Steven Wagner * ;**************************************** ;Info: ;Bei einem Wert von 1 wird die 1. LED ;und bei 252 die 8. LED angesteuert ;Natürlich ist es auch möglich das Programm in eine ;Subroutine umzufunktionieren. ; .include "m16def.inc" .def temp1 = R16 .def Wert = R17 .def Stelle = R18 .def LED = R19 .equ LPORT = PORTD .equ LDDR = DDRD .equ AD_PIN = (3 + 0b01100000) ; Pin + Einstellung main: ldi temp1, AD_Pin ; hier wird die Referenzspannung, Rechts- oder out ADMUX, temp1 ; Linksbündigkeit und der Pin angegeben ldi temp1, 0b10000111 ; Der ADC wird Eingeschaltet und der out ADCSRA, temp1 ; Prescaler eingestellt ser temp1 ; I/O-Register initialisieren out LDDR, temp1 sample_adc: sbi ADCSRA, ADSC ; den ADC starten. In ADSC ist das Bit 6 hinterlegt wait_adc: sbic ADCSRA, ADSC ; wenn der ADC fertig ist, wird dieses Bit ADSC gelöscht rjmp wait_adc ; falls nicht wird weiter geprüft in Wert, ADCH ; Obere 8Bit des ADC einlesen bargraph: clr Stelle ;Variablen vorbereiten ldi LED, 0x01 bar_check: ldi temp1, 36 ; Faktor laden cpi Stelle, 8 ; Wenn die Stellenanzahl erreicht ist brsh bar_end ; zu bar_end springen mul temp1, Stelle ; Stelle mit Faktor multiplizieren mov temp1, r0 ; und in temp1 speichern cp temp1, Wert ; Vergleich brsh bar_zero ; wenn Wert größer als temp1, zu zero springen subi temp1, -1 ; Hysterese von 1 cp temp1, Wert ; Vergleich brlo bar_one ; wenn Wert kleiner als temp1, zu one springen rjmp bar_end ; wenn innerhalb der Hysterese, abbrechen bar_zero: in temp1, LPORT ; LED-Port einlesen com LED ; Bit Löschen and temp1, LED com LED out LPORT, temp1 ; und Ausgeben rjmp bar_end ; Ende bar_one:in temp1, LPORT ; LED-Port einlesen or temp1, LED ; Bit Setzen out LPORT, temp1 ; und Ausgeben inc Stelle ; Stelle erhöhen lsl LED ; Bit verschieben rjmp bar_Check ; weitere Stellen prüfen bar_end:rjmp sample_adc ; Zurück