Hallo Männer,
wir stehen vor einem Problem bei unserer Studienarbeit und kommen
absolut nicht weiter. Hauptaufgabe sind messwerte, die ein AD Wandler
erfässt und über eine Schnittstelle weiter geben soll. Doch jedesmal,
wenn wir AD und UART in kombination nutzen wird die Schnittstelle total
langsam. Nach langem testen haben wir herausgefunden das alles wunderbar
funktioniert wenn die Zeile
ADMUX |= (1<<REFS1) | (1<<REFS0);
auskommentiert ist. Wir brauchen jedoch die Interne Referenzspannung von
2.56V.
Wer kann uns hier mal weiterhelfen ???
Ausführbarer Code für Atmega16:
Wobei sich natürlich die Frage erhebt, welchen Sinn
es macht, den ADC für jede Messung neu zu initialisieren.
Die erste Messung nach einer Initialisierung dauert laut
Atmel immer etwas länger. Ich könnte mir durchaus vorstellen,
dass das damit zu tun hat, dass Atmel der Referenzspannung Zeit
geben will sich zu stabilisieren.
Hallo,
Danke für die schnelle Antwort! Hast recht, im normalen Programm gibts
auch ne init und ne lese:
funktioniert aber trozdem nicht. Kanns an der Hardware liegen, oder was
ist falsch ????
void AD_Init(unsigned char Kanal)
{
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
// setzen auf 8 (1) und ADC aktivieren (1)
ADMUX = ADMUX | Kanal; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
while ( ADCSRA & (1<<ADSC) )
{
};
}
Wieso willst du zum Abschluss der Initialisierung auf
das Ende einer Wandlung warten, wenn noch gar keine
gestartet wurde?
@ studiarbeit
>Danke für die schnelle Antwort! Hast recht, im normalen Programm gibts>auch ne init und ne lese:>funktioniert aber trozdem nicht. Kanns an der Hardware liegen, oder was>ist falsch ????
Dann poste den ORIGINALEN Quelltext und nicht irgendwelche
zusammenkopierten Fragmente.
MfG
Falk
also nochmal zurück zum Thema,
Der polling betrieb ist schon so in ordung ich möchte einfach kein
Inerrupt. Vieleicht später wenn erst mal alles am laufen ist. Mir kommt
es jetzt auch überhaupt nicht auf eine Performace steigerung oder
Optimierung an. Deswegen die vereinfachung im code.
Ich glaube auch langsam nicht mehr an ein Programmierfeheler sondern
eher was an der Hardware. Ich wäre überglücklich wenns doch bitte jemand
mal testen könnte.
Beim Auskommentieren der Marke (A) funktioniert der UART und beim
einkomme ntieren funktionierts eben nicht mehr. --> Vermutung UART
greift auf AD Wandelrgister zu oder umgekehrt. Was aber nicht im
Handbuch steht. Wäre über ein bischen hilfe total dankbar ....
// nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
13
// also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen"
14
15
/*Also startest Du hier eine Wandlung, wartest auf "fertig" und liest einen Messwert aus. Wo ist denn jetzt der "dummy-Readout"???*/
16
17
/*Nehmen wir an, das es sich hier um den Dummyreadout handelt, dann musst Du die Wandlung nochmal anschubsen, um dein korrektes Messergebnis als Return zur Verfügung zu stellen.*/
18
19
//1. Dummyreadout
20
ADCSRA|=(1<<ADSC);// eine ADC-Wandlung
21
22
while(ADCSRA&(1<<ADSC))
23
{
24
// auf Abschluss der Konvertierung warten
25
};
26
27
dummy=ADCW;// ADCW muss einmal gelesen werden,
28
// sonst wird Ergebnis der nächsten Wandlung
29
// nicht übernommen.
30
31
//2. "echte" Wandlung
32
ADCSRA|=(1<<ADSC);// eine ADC-Wandlung
33
34
while(ADCSRA&(1<<ADSC))
35
{
36
// auf Abschluss der Konvertierung warten
37
};
38
39
result=ADCW;// ADC wird erneut gelesen und das Ergebnis
40
// übernommen
41
42
returnresult;
43
}
ADC Takt ist so ok? Welche Taktfrequenz hat der Controller?
Kannst Du BITTE DEN KOMPLETTEN CODE posten?
Bzw. welches ist denn nun dein kompletter Code? (kurzer Link drauf
genügt)
Was ist/soll "c++" in der UART-Transmitt Ruotine?
sollte eigentlich mit den gegebenen Hinweisen funktionieren, denke ich
mal.
Gruß
AxelR.
Ich habe die Hinweise als Kommentar in die Quelle geschrieben. sieht man
kaum...