Gast
#319671
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?
|
Anzeige
|
analog digital wandler
Gast
#319671
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?
Gast
#319672
rtfm
Gast
#319673
hm komm mit der manual nich weiter..... schau mal im gcc artikel nach dem admux register
Gast
#319675
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
Gast
#319676
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
Gast
#319677
Die ADC-Eingänge liegen an Port A.
Gast
#319678
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.
Gast
#319679
War auf dem myAVR-Board nicht ein Mega8 drauf? Dann sind die ADC-Eingänge auf Port C!
Gast
#319680
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...
Gast
#319681
ok danke,
Gast
#319682
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 ;----------------------------------------------------------------------- -
Gast
#319683
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
Gast
#319684
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...
Gast
#319685
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 ;----------------------------------------------------------------------- -
Gast
#319686
...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
Gast
#2110863
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
Gast
#2110904
-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... Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|