Hallo... Ich habe folgendes Problem ich möchte 8 Sensoren auswerten und habe das Problem das mein PINA6 immer 5 V raushaut am Atmega 32... doch leider kann ich nicht sagen warum... habe den Fehler nun schon Soweit eingegrenzt das dieser Irgendwo im Programm oder auf dem Pollin Evaluationbord liegen muss denn habe ich meine Schaltung von diesem getrennt ist es immer noch der Fall das 5V ausgegeben werden und alles anderen ADC´s haben low potential.. Muss ich nach dem ich die ADC`s intitialisiert habe in einer Interrupt-Routine im Main die Eingänge zusätzlich mit: DDRA = 0x00; deklarieren oder ist dies nicht unbedingt notwendig. Wo könnte der Fehler liegen?
#include <avr/io.h> #include "lcd-routines.h" #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> extern uint16_t readAD0(uint8_t channel); // Aufruf AD-WANDLUNGSFUNKTION extern uint16_t readAD1(uint8_t channel); // Aufruf AD-WANDLUNGSFUNKTION extern uint16_t readAD2(uint8_t channel); // Aufruf AD-WANDLUNGSFUNKTION extern uint16_t readAD3(uint8_t channel); // Aufruf AD-WANDLUNGSFUNKTION extern uint16_t readAD4(uint8_t channel); // Aufruf AD-WANDLUNGSFUNKTION extern uint16_t readAD5(uint8_t channel); // Aufruf AD-WANDLUNGSFUNKTION extern uint16_t readAD6(uint8_t channel); // Aufruf AD-WANDLUNGSFUNKTION extern uint16_t readAD7(uint8_t channel); // Aufruf AD-WANDLUNGSFUNKTION int main(void) { // Variablendeklaration float wert_wandler0 ,wert_wandler1 ,wert_wandler2, wert_wandler3,wert_wandler4 ,wert_wandler5 ,wert_wandler6, wert_wandler7; uint8_t data = 0; // Arrays für LCD-Azeigewerte char Anzeige1[22]; char Anzeige2[22]; char Anzeige3[22]; char Anzeige4[22]; // LCD-initialisieren lcd_init(); //Eingänge definieren DDRA = 0x00; DDRB = 0xFF; DDRC = 0x03; DDRD = 0xFF; // Taktgeber inititialiseren TCCR2 = (1 << WGM20) | (1<< COM21) | (1<< CS20) | (0<<CS21) | (1<<CS22); // f = 16MHz/ 1024 *256 OCR2 = 127; while(1) { // Werte von AD-Wandler lesen und umrechnen wert_wandler0 = readAD0(0); wert_wandler0 = wert_wandler0*5/1024; wert_wandler1 = readAD1(0); wert_wandler1 = wert_wandler1*5/1024; wert_wandler2 = readAD2(0); wert_wandler2 = wert_wandler2*5/1024; wert_wandler3 = readAD3(0); wert_wandler3 = wert_wandler3*5/1024; wert_wandler4 = readAD4(0); wert_wandler4 = wert_wandler4*5/1024; wert_wandler5 = readAD5(0); wert_wandler5 = wert_wandler5*5/1024; wert_wandler6 = readAD6(0); wert_wandler6 = wert_wandler6*5/1024; wert_wandler7 = readAD7(0); wert_wandler7 = wert_wandler7*5/1024; } /* * AD_WANDLUNG * * Created: 25.02.2013 10:20:16 * */ #include <avr/io.h> #include <util/delay.h> #include<avr/interrupt.h> uint16_t readAD0 (uint8_t channel) { uint8_t i; uint16_t result0 = 0; // den ADC aktivieren und Teilungsfaktor auf 8 stellen ADCSRA = (1<<ADEN)| 0x03; // Kanal des Multiplexers wählen Kanal1 // interne Referenz: ACC ADMUX = (0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0)|(1<<REFS0); // den ADC initialisieren und ein sog. Dummyreadout machen ADCSRA |= (1<<ADSC); while(ADCSRA & ( 1<<ADSC)); //Jetzt die analoge Spannung an Kanal auslesen for (i=0;i<5;i++) { //eine Wandlung ADCSRA |= (1<<ADSC); // Ergebnis holen while(ADCSRA & (1<<ADSC)); result0 += ADCW; } // ADC deaktivieren ADCSRA &=(1<<ADEN); result0=result0 /5; return result0; }
DA_RULA schrieb: > ADMUX = (0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0)|(1<<REFS0); Und was hat das jetzt mit PinA6 zu tun? Lustig
1 | extern uint16_t readAD0(uint8_t channel); // Aufruf |
2 | AD-WANDLUNGSFUNKTION |
3 | extern uint16_t readAD1(uint8_t channel); // Aufruf |
4 | AD-WANDLUNGSFUNKTION |
5 | extern uint16_t readAD2(uint8_t channel); // Aufruf |
6 | AD-WANDLUNGSFUNKTION |
7 | extern uint16_t readAD3(uint8_t channel); // Aufruf |
8 | AD-WANDLUNGSFUNKTION |
9 | extern uint16_t readAD4(uint8_t channel); // Aufruf |
10 | AD-WANDLUNGSFUNKTION |
11 | extern uint16_t readAD5(uint8_t channel); // Aufruf |
12 | AD-WANDLUNGSFUNKTION |
13 | extern uint16_t readAD6(uint8_t channel); // Aufruf |
14 | AD-WANDLUNGSFUNKTION |
15 | extern uint16_t readAD7(uint8_t channel); // Aufruf |
16 | AD-WANDLUNGSFUNKTION |
8 Wnadlungsfunktionen, für jeden Kanal eine, die dann auch noch die Nummer des zu sampelnden Kanals mitkriegen. Warum reicht denn eine einzige nicht? Wäre das zu einfach gewesen? Was heißt 'raushaut'? Hast du die Spannung am Pin gemessen, oder meinst du damit den Zahlenwert, der vom ADC kommt?
Wie müsste es denn aussehen das ich nicht jedesmal alle durch wandeln muss sondern nur den Kanal den ich gerade benötige? Über das ADMUX-Register wird doch der Kanal des ADC eingestellt und die Referenzspannung oder sehe ich das etwa falsch?
Also mit raushauen ist gemeint das ich die Spannung am Pin gemessen habe sprich über die 40Polige Steckleiste vom Pollin Board
DA_RULA schrieb: > Über das ADMUX-Register wird doch der Kanal des ADC eingestellt und die > Referenzspannung oder sehe ich das etwa falsch? Schon. Aber in deiner Anfrage schreibst du vom PINA6. Der Code den du zeigst, die FUnktion, benutzt aber gar nicht den PINA6. Da wird mit den MUX Bits ein Zugriff auf PINA5 eingestellt. Ergo - die Funktion ist dafür überhaupt nicht zuständig. > Wie müsste es denn aussehen das ich nicht jedesmal alle durch > wandeln muss sondern nur den Kanal den ich gerade benötige? AVR-GCC-Tutorial Da gibt es einen Abschnitt über den ADC (mag sein, dass er mitlerweile eine eigene Subseite bekommen hat. Nach ADC im verlinkten Artikel suchen und dann weiter klicken)
DA_RULA schrieb: > Also mit raushauen ist gemeint das ich die Spannung am Pin gemessen habe > sprich über die 40Polige Steckleiste vom Pollin Board ok. Dann musst du rausfinden, warum das so ist. Ein einfacher Test ist ja, den Pin auf Ausgang programmieren und 0 bzw. 1 ausgeben und nachsehen, was die Spannung macht. Dann die Umkehrung: Pin auf Eingang und das gelesene vom Pin mal wo ausgeben (zb auf einer LED). Dann den Pin (über einen Widerstand) mal auf + und dann auf - verbinden. Die Anzeige (die LED) muss entsprechend reagieren. Und Achtung: Ein offener Eingangspin, also einer an dem nichts hängt, ist nicht zwangsläufig auf 0!
aaaaaaaaaaaaah.... sorry meinte natürlich den PINA5 der logischer weise durch die das Nullte Bit(Pin) bei der leiste auf 6 liegt sonst stimmt das schon... über diesen Artikel bin ich auch schon zu diesen einstellungen gekommen, aber leider werde ich daraus nicht so richtig schlau warum ich 5V an dem Pin messe... bzw. wie ich die sache mit den "tausend" wandlungsaufrufen kürzer gestallten kann als interrupt habe ich es ja nun schon geschrieben... aber ich will ja auch nicht immer alle werte gleichzeitig haben sondern zu bestimmten zeitpunkten möchte ich bestimmte werte vergleichen um nachfolgend deverse teile anzusteuern
Ich habe noch mal gemessen sobald ich den gefragten pin als Input deklariere kommen diese 5 V wenn ich diesen aber als Output und null setze dann habe ich auch 0...
Mein Signal was ich Wandeln wollen würde hat auch z.b eine Wertigkeit von 3V und wenn ich das zusammen stecke habe ich an gleicher stelle die 5V gemessen und somit imer Maximal wert.
Im Schaltplan sehe ich, dass von PINA5 eine Leitung zu einem Jumperfeld geht, konkret JP12 (wenn ich mich beim Linienverfolgen nicht verhaut habe) und von dort weiter zu einem Pullup-Widerstand und IC5. Ist der Jumper bei dir gesteckt?
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.