Unterschiedliche Auslösequelle für ADC

#5813263
Lesenswert?

Hallo zusammen, in meinen späteren Programm sollen beide Arten (siehe 
weiter unten) von Messungen abwechselnd durch geführt werden. Meine 
bitte wäre, lassen sich Fehler / Blödsinn oder eine falsche Reihenfolge 
in diesen Programm-Zeilen ausmachen. PS: (0<<CS12) dient mir der 
Übersichtlichkeit!

Atmega644 / 16 MHz => Der Timer1 hat die Hauptaufgabe im „Modus 14“ (und 
Prescaler = 1) zähle von 0 – ICRn und wieder auf 0. Bei Zähler = 0 
OCR1A-Ausgang und OCR1B-Ausgang auf LOW ! Und bei Gleichheit den 
jeweiligen Ausgang auf HIGH ! für zwei Motoren mit PWM. Die I/O's sind 
bereits entsprechend gesetzt und der ADC hat schon die Erstmessung 
durchgeführt.

ldi Ar1, 0x01
sts ICR1H, Ar1
ldi Ar1, 0x80
sts ICR1L, Ar1  ; den Wert 0x0180 ins ICR1
ldi Ar1, 0x00
sts OCR1AH, Ar1
ldi Ar1, 0xA4
sts OCR1AL, Ar1  ; den Wert 0x00A4 ins OCR1A
ldi Ar1, 0x00
sts OCR1BH, Ar1
ldi Ar1, 0x47
sts OCR1BL, Ar1  ; den Wert 0x0047 ins OCR1B
ldi Ar1, 
(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(0<<WGM10)
sts TCCR1A, Ar1  ; beider Ausgänge bei Gleichheit auf HIGH setzen
ldi Ar1, (1<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10)
sts TCCR1B, Ar1

1. Fall:
ADC-Messauslösung: durch Timer1-Überlauf (hier für OCR1A)

ldi Ar1, 
(0<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(0<<WGM10)
sts TCCR1A, Ar1  ; PWM für Motor1 AUS (COM1A-Ausgang nicht mehr ändern)
sbis MoX_P+PORT, Mo1_PWM ; PWM-Motor1-Ausgang vorsorglich auf HIGH !

(absichtliche Pause / Störungen abklingen lassen)

ldi Ar1, 0x01
sts OCR1AH, Ar1
ldi Ar1, 0x10
sts OCR1AL, Ar1  ; den Wert 0x0110 ins OCR1A
ldi Ar1, (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX0)
sts ADMUX, Ar1  ; AREF-Pin  Links-Resultat  hier Kanal 0
ldi Ar1, (1<<ACME)|(1<<ADTS2)|(1<<ADTS1)|(0<<ADTS0)
sts ADCSRB, Ar1  ; Multiplexer-An / Timer1-Überlauf
ldi Ar1, (1<<ADEN)|(0<< 
ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
sts ADCSRA, Ar1  ; ADC-AN  Auto-Trigger  Prescaler = 128

(beim nächsten Timer1-Überlauf die ADC-Messung beginnen)

(beim nächsten Timer1-OCR1A-Flag)
ldi Ar1, 0xXX
sts OCR1AH, Ar1
ldi Ar1, 0xXX
sts OCR1AL, Ar1  ; den neuen Wert für PWM ins OCR1A
ldi Ar1, 
(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(0<<WGM10)
sts TCCR1A, Ar1 ; PWM für Motor1 wieder Herstellen

(beim nächsten ADC-Messung-Fertig-Flag)
lds Ar1, ADCL
lds Ar1, ADCH

2. Fall:
ADC-Messauslösung: durch Analog Comparator (hier für Kanal 2)

ldi Ar1, (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(1<<MUX1)
sts ADMUX, Ar1 ; AREF-Pin  Links-Resultat  hier Kanal 2
ldi Ar1, (0<<ACD)|(1<<ACBG)|(1<<ACIS1)|(1<<ACIS0)
sts ACSR, Ar1  ; Analog Comparator AN  interne Spannung  steigende 
Flanke
ldi Ar1, (1<<ACME)|(0<<ADTS2)|(1<<ADTS1)|(0<<ADTS0)
sts ADCSRB, Ar1  ; Multiplexer-An / Analog Comparator
ldi Ar1, (1<<ADEN)|(0<< 
ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
sts ADCSRA, Ar1  ; ADC-AN  Auto-Trigger  Prescaler = 128

(beim nächsten ADC-Messung-Fertig-Flag)
ldi Ar1, (1<<ACD)|(1<<ACBG)|(1<<ACIS1)|(1<<ACIS0)
sts ACSR, Ar1 ; Analog Comparator AUS  interne Spannung  steigende 
Flanke
lds Ar1, ADCL
lds Ar1, ADCH

Mfg

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren