Hallo, ich bekomme einfach keine Ausgabe auf PORTB. Der PINC1 liegt an einem Poti dran und der wiederum an VCC von 5V. Der PORTB ist komplett an LED´s angeschlossen (Pro Ausgang eine LED). Wo könnte der Fehler in meinem Programm liegen? .include "m8def.inc" ldi r16, 0x00 out DDRC, r16 ; Datenrichtungsregister von C komplett auf Eingang setzen ldi r16, 0xFF out DDRB, r16 ; Datenrichtungsregister von B komplett auf Ausgang setzen ldi r16, 0xC1 out ADMUX, r16 ; Kanal Einstellung (Kanal 1 PIN PC1) und Referenzquelle ;(Interne Referenz 2,56V) ldi r16, 0xE7 out ADCSRA, r16 ; Funktion (Eigenständig und Eingeschaltet) und Vorteiler ;(128) loop: in r17, ADCL out PORTB, r17 ; Die höchsten 8 Bits am PortB ausgeben rjmp loop Vielen Dank.
Hi > ldi r16, 0xC1 Benutzt bitte die Bitnamen-> ldi r16,1<<REFS1|1<<REFS0|1<<MUX0 >in r17, ADCL > out PORTB, r17 ; Die höchsten 8 Bits am PortB ausgeben In ADCL befinden sich die niederwertigsten 8 Bit. Die höherwertigsten bekommst du bei gesetztem ADLAR in ADMUX. Und da ADLAR nicht gesetzt ist trifft folgendes zu (Datenblatt) When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH. MfG Spess
Hat funktioniert. Ich mußte nur das Ergebnisregister wechseln und bei ADLAR eine "1" für das linksbündige ausrichten des Ergebnisses. Es sollte jedoch auch funktionieren wenn ich in ADLAR eine "0" schreibe und ADCL ausgebe, doch das funktioniert nicht. Weiß jemand wieso?
1 | ldi r16, 0x00 |
2 | out DDRC, r16 ; Datenrichtungsregister von C komplett auf Eingang setzen |
3 | |
4 | ldi r16, 0xFF |
5 | out DDRB, r16 ; Datenrichtungsregister von B komplett auf Ausgang setzen |
6 | |
7 | ldi r16, (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (1<<MUX0) |
8 | out ADMUX, r16 ; Kanal Einstellung (Kanal 1 PIN PC1) und Referenzquelle (Interne Referenz 5V) |
9 | ldi r16, (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) |
10 | out ADCSRA, r16 ; Funktion (Eigenständig und Eingeschaltet) und Vorteiler |
11 | |
12 | loop: |
13 | in r17, ADCL |
14 | out PORTB, r17 ; Die 8 niederwertigsten Bits sollten an PortB ausgegeben |
15 | rjmp loop |
Jaro schrieb: > Hat funktioniert. > Ich mußte nur das Ergebnisregister wechseln und bei ADLAR eine "1" für > das linksbündige ausrichten des Ergebnisses. > > Es sollte jedoch auch funktionieren wenn ich in ADLAR eine "0" schreibe > und ADCL ausgebe, doch das funktioniert nicht. > Weiß jemand wieso? Wie spess schon schrieb: Du MUSST ADCH lesen(!). Wenn du nur ADCL liest, dann werden die beiden ADC Register gegen UPdates verriegelt. Erst ein lesen von ADCH löst diese Verriegelung wieder. D.h. ADCL kannst du beim auslesen auslassen. Aber ADCH MUSST du auf jeden Fall immer lesen.
Ach ich muss ADCH auch auslesen damit die Sperre aufgehoben werden kann und der ADC den nächsten Wert konvertieren und ins Ergebnisregister schreiben kann.
Jaro schrieb: > Es sollte jedoch auch funktionieren wenn ich in ADLAR eine "0" schreibe > und ADCL ausgebe, doch das funktioniert nicht. > Weiß jemand wieso? Spess hat doch die Passage des Datenblattes zitiert, die eindeutig erklärt, warum das nicht funktioniert.
Hi
>Weiß vielleicht noch jemand wie ich die Bereichsbreite verstellen kann?
Welche Bereichsbreite?
MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.