habe ein myavr board mit analog digital wandler jedoch weis ich nicht wie ich die input ports für den a/d wandler festlege, oder wandelt der alle anliegenden ports um?
Hallo Im Manual steht wirklich ALLES zum Thema drin. Weiß natürlich nicht, WARUM Du mit dem Manual nicht weiterkommst. Ein gaaanz kleiner Tip: Dem Register ADMUX ein wenig Aufmerksamkeit schenken. Und: die benötigten Analog-Eingänge als Eingänge ohne Pull-Ups (tri-stated) programmieren. Gruß Johnny
ich nehme mal an du meinst das hier: Bit´s 3-0 - MUX3:0: Konverter-Kanal Wahl Der Wert dieser Bits bestimmt welcher Eingang mit dem ADC verbunden ist. MUX 3 - 0 Eingabe 0000 ADC - Kanal 0 0001 ADC - Kanal 1 0010 ADC - Kanal 2 0011 ADC - Kanal 3 0100 ADC - Kanal 4 0101 ADC - Kanal 5 0111 ADC - Kanal 6 1000 ADC - Kanal 7 1001 1010 1011 1100 1101 1110 1111 1.23V (VBG) 0 V (GND) was ich daran nicht verstehe ist was die kanäle sind, und wie ich die z.b. mit PortB Pin 1 verbinde, das der wert eines sensor z.b. von portb pin 1 von analog in digital umgewandelt wird
Schau mal ganz am Anfang des Datenblatts, da wird die Pinbelegung gezeigt. Ein Port ist durchnummeriert von ADC0 - ADCn (je nachdem wie viele ADC-Kanäle dein Controller hat. Beim AtMega48 ist es z.b. der Port C. Das sind die einzigen Pins mit denen man analoge Spannungen messen kann. Die Zuordnungen sollten selbsterklärend sein.
War auf dem myAVR-Board nicht ein Mega8 drauf? Dann sind die ADC-Eingänge auf Port C!
Ach ja, wenn Du mit dem Manual nicht klarkommst: Auf dieser Seite gibts ein Tutorial, in dem soweit ich mich erinnere auch über den ADC auch was drinsteht. Vielleicht solltest Du Dir das mal durchlesen, bevor Du hier fragst...
so habe nun ein programm geschrieben mit dem ich einen ntc auslesen kann, mit dem analog digital wandler jedoch stimmt irgendwas mit den messwerten nicht, was mache ich falsch? .include "AVR.H" rjmp main ;Start, Power ON, Reset main: ldi r16,hi8(RAMEND) out SPH,r16 ldi r16,lo8(RAMEND) ;Stack Initialisierung out SPL,r16 sbi DDRB,0 sbi UCSRB,3 ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren ldi r16,3686400/(9600*16)-1 ;Baudrate 9600 einstellen out UBRRL,r16 ;ADMUX Einstellungen sbi ADMUX,0b00000000 ;wähle PORTC Pin 0 als ADC Input sbi ADMUX,0b00000000 sbi ADMUX,0b00000000 sbi ADMUX,0b00000000 sbi ADMUX,0b00000101 ;setze ADLAR sbi ADMUX,0b00000001 ;setze REFSO sbi ADMUX,0b00000001 ;setze REFS1 ;----------------------------------- sei ;------------------------------------ mainloop: wdr sbi ADCSRA,0b00000111 ;Bit 7 - ADEN: ADC Ein sbi ADCSRA,0b00000110 ;Bit 6 - ADSC: ADC starte Konvertierung rcall adcready ldi r16,'A' rcall putChar ldi r16,'V' rcall putChar ldi r16,'R' rcall putChar ldi r16,':' rcall putChar ldi r16,ADCL rcall putChar ldi r16,ADCH rcall putChar cbi ADCSRA,0b00000110 ;ADSC: ADC Beende Konvertierung cbi ADCSRA,0b00000111 ;Bit 7 - ADEN: ADC Aus rjmp mainloop adcready: sbis ADCSRA,0b00000100 ;wenn ADC Konvertierung fertig >> LED an und weitermachen rjmp adcready ldi r16,0b11111111 ;PORTB Alle Pins auf Ausgang out DDRB,r16 sbi PORTB,1 ;PORTB Pin 1 ON (LED) ret ;----------------------------------------------------------------------- - ; UP: putChar, Zeichen per UART senden ; PE: r16, Zeichen putChar: sbis UCSRA,5 ;USR Bit5 = UDRC rjmp putChar ;warten, bis UDR bereit out UDR,r16 ret ;zurück zum Hauptprogramm ;----------------------------------------------------------------------- -
Es muss heißen in r16, ADCL ... in r16, ADCH ldi heißt load immediate. Der Assembler behandelt ADCx als Konstante, was darin resultieren dürfte, dass jedes mal die Adresse der beiden Register ausgegeben wird. Gruß Johnny
Ach übrigens: Warum schreibst Du die Bitnummern beim cbi- und beim sbis-Befehl in Binärschreibweise? Macht eigentlich nur dann Sinn, wenn Du ein Roboter bist, der nur 'Binär' spricht:-) Spaß beiseite: Der AVRStudio-Assembler versteht auch 'Dezimal'. Also der Übersichtlichkeit halber besser '7' anstatt '0b00000111' schreiben. Beim sbi unten hast Du es doch so gemacht. Außerdem: Warum löschst Du das ADSC-Bit? Das geschieht automatisch, wenn die Wandlung abgeschlossen ist. Fällt mir auch gerade auf: Wenn Du Bit 0 in ADMUX setzt, dann ist PortC.1 der ausgewählte Kanal!!! Bitte lies Dir die Befehlsdefinitionen genauer durch! Mit 'sbi ADMUX, 0b00000000' wird das Bit Nr. 0 in ADMUX gesetzt! Außerdem reicht es, wenn Du eine Instruktion einmal machst. Der µC ist sicher nicht so schwer von Begriff, dass Du ihm gleich viermal sagen musst, dass er ein bestimmtes Bit setzen soll...
ok danke für die hilfe, hier der verbesserte quellcode: .include "AVR.H" rjmp main ;Start, Power ON, Reset main: ldi r16,hi8(RAMEND) out SPH,r16 ldi r16,lo8(RAMEND) ;Stack Initialisierung out SPL,r16 sbi DDRB,0 sbi UCSRB,3 ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren ldi r16,3686400/(9600*16)-1 ;Baudrate 9600 einstellen out UBRRL,r16 ;ADMUX Einstellungen sbi ADMUX,0b00000000 ;wähle PORTC Pin 1 als ADC Input sbi ADMUX,0b00000101 ;setze ADLAR sbi ADMUX,0b00000110 ;setze REFSO sbi ADMUX,0b00000111 ;setze REFS1 ;----------------------------------- sei ;------------------------------------ mainloop: wdr sbi ADCSRA,0b00000111 ;Bit 7 - ADEN: ADC Ein sbi ADCSRA,0b00000110 ;Bit 6 - ADSC: ADC starte Konvertierung rcall adcready ldi r16,'A' rcall putChar ldi r16,'V' rcall putChar ldi r16,'R' rcall putChar ldi r16,':' rcall putChar in r16,ADCL rcall putChar in r16,ADCH rcall putChar rjmp mainloop adcready: sbis ADCSRA,0b00000100 ;wenn ADC Konvertierung fertig >> LED an und weitermachen rjmp adcready ldi r16,0b11111111 ;PORTB Alle Pins auf Ausgang out DDRB,r16 sbi PORTB,1 ;PORTB Pin 1 ON (LED) ret ;----------------------------------------------------------------------- - ; UP: putChar, Zeichen per UART senden ; PE: r16, Zeichen putChar: sbis UCSRA,5 ;USR Bit5 = UDRC rjmp putChar ;warten, bis UDR bereit out UDR,r16 ret ;zurück zum Hauptprogramm ;----------------------------------------------------------------------- -
...Und? Funktionierts jetzt? Hast aber immer noch die üblen Binärausdrücke bei sbi drin (außer ganz unten). Biste etwa doch ein Roboter:-? Wenn Du das direkt in Dezimal schreibst, brauchste das nicht im Kommentar zu machen... Gruß Johnny
> sbi ADMUX,0b00000101 ;setze ADLAR Besser sbi ADMUX, ( 1 << ADLAR ) Dann wird der Code selbsterklaerend und Du kannst Dir den Kommentar sparen. > in r16,ADCL > rcall putChar > in r16,ADCH > rcall putChar So wird das nichts. Du musst die Zahl die sich aus ADCL + ADCH ergibt in eine textuelle Form bringen. Danach wird dieser Text Zeichen fuer Zeichen uebertragen.
> Du musst die Zahl die sich aus ADCL + ADCH > ergibt in eine textuelle Form bringen Studier mal: http://www.mikrocontroller.net/forum/read-1-326598.html#326631
Hallo,entschuldigt bitte dass ich den alten Thread wieder ausgrabe, aber ich bin mit der googel-suchs auf das gestossen. Mein Problem ist,ich will beim Attiny13 im ADMUX-Register,z.B. den bit für ADLAR,also Bit 5 Setzen. Wie ich weiter oben im Thread am Quellcode sehe,wird dieser direkt im ADMUX-Register gesetzt, also ohne den Umweg,z.B. ein anderes Register mit 5 zu Laden und über den out-Befehl dann ins ADMUX. Komischerweise kann ich im AVR-Studio4 sogar gleich Schreiben: sbi ADMUX,ADLAR und es klappt. Und noch komischer ist,dass das mit einem Umweg über ein vorheriges Register und mit out,ADMUX nicht klappt. Ich bin am Verzweifeln und versteh die Welt langsam nicht mehr. Kann mir jemand sagen warum das in diesen Fall so einfach geht und warum das so ist? Bin noch einigermassen Neuling und würde mich echt über eine Hilfestellung Freuen,ich komm einfach im Moment nicht weiter. grüsse andi
-entschuldigung vielmals,nochmal ein kleiner Nachtrag um das Problem zu Verdeutlichen: Um den Pinchange-Interrupt-enable bit im Gimsk zu Aktivieren kann man z.B.: ldi r16,0b00100000 (32) out GIMSK,r16 schreiben,also Bit 5 wird durch die Wertigkeit 32 über r16 Gesetzt. Das klappt aber beim ADLAR nicht,obwohl es auch das Bit 5 ist.(wie PCIE) Man kann das z.B. direkt oder mit sbi ADMUX,0b00000101 ,also 5 setzen. ? hier setzt meine Logik aus...
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.