Forum: Mikrocontroller und Digitale Elektronik Unterschiedliche Auslösequelle für ADC


von Hans-J. A. (modellbahner71)


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

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
Noch kein Account? Hier anmelden.