Hallo Ich messe momentan eine Spannung auf einem STK 500 an PORT 0 und 1 An Port A Diese Messung wird auf einem LCD Display dargestellt. Dies Funkioniert auf dem STK 500 bestens. Nun habe ich mir eine eigene Platine gebaut, um auf der die Spannung zu messen. Das Problem, es funktioniert eigentlich alles außer die ACD Messsung? ICh habe PORT0 und PORT1 abgeklemmt Messe ich nun Zeigt mir mein Display immer 1024 und 1023 an? Obwohl keine Spannung anliegt. Lege ich PORT0 oder PORT1 auf Ground/5V ändert sich nichts an der Messung... Alles andere ,Ports ansteuerung usw geht! Hat jemand eine Idee? Gruß und besten Dank im Voraus Sebastian
ja AVcc liegen 4,92V an Ground ist auch vorhanden was mir aufgefallen ist? warum liegen am stk 500 an miso mosi und sck 5V an dauerthaft 5V an Gruß
Sebastian schrieb: > ja AVcc liegen 4,92V an Ground ist auch vorhanden Dann zeig deine Schaltung und dein Programm. Immer diese Ratespiele. Bei mir gehts nicht, kann wer raten was ich wieder falsch gemacht habe? Du gehst ja auch selber zum Arzt, damit er sich die Sache mal ansehen kann.
Hier mal nur die Grundform von von meinem Programm SV2 ist für das Display
1 | void ADC_Init(void) |
2 | { |
3 | uint16_t result; |
4 | ADMUX = (REFS0); // interne Referenzspannung nutzen */(1<<REFS1)(1<<REFS1)| |
5 | ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler |
6 | ADCSRA |= (1<<ADEN); // ADC aktivieren |
7 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung |
8 | while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten |
9 | result = ADCW; |
10 | } |
11 | |
12 | //Messung an Kanal 0 |
13 | uint16_t ADC_Read( uint8_t channel ) |
14 | { |
15 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); // Kanal waehlen, ohne andere Bits zu beeinflußen |
16 | ADCSRA |= (1<<ADSC); // ADSc wird mit 1 gestartet |
17 | while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten |
18 | return ADCW; // ADC auslesen und zurückgeben |
19 | } |
20 | |
21 | //Messung an Kanal 1 |
22 | uint16_t ADC_Read2( uint8_t channel ) |
23 | { |
24 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); // Kanal waehlen, ohne andere Bits zu beeinflußen |
25 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" |
26 | while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten |
27 | return ADCW; // ADC auslesen und zurückgeben |
28 | } |
29 | |
30 | |
31 | lcd_init(LCD_DISP_ON_CURSOR); // LCD Display intialisieren |
32 | ADC_Init(); // ADC intialisieren |
33 | |
34 | while(1) |
35 | { |
36 | //Messung an Kanal PA4 Senor Horizontal 1 |
37 | lcd_clrscr(); // LCD Display reseten |
38 | uint16_t adcval; |
39 | adcval = ADC_Read(0);// Analogwert auslesen //ADC_Read_AVG ist mit Mittelwertbildung (0,5) kanal 0 |
40 | char buffer3[8]; |
41 | itoa(adcval,buffer3,10); |
42 | lcd_gotoxy( 4, 0); |
43 | lcd_puts(buffer3); |
44 | |
45 | uint16_t adcval2; |
46 | adcval2 = ADC_Read(1); // Analogwert auslesen //ADC_Read_AVG ist mit Mittelwertbildung (0,5) kanal 0 |
47 | char buffer4[8]; |
48 | itoa(adcval2,buffer4,10); |
49 | lcd_gotoxy( 2, 1); |
50 | lcd_puts(buffer4); |
51 | |
52 | } |
> ADMUX = (REFS0);
ADMUX = (1 << REFS0);
(weiterschau. War nur das erste was mir aufgefallen ist)
Da ...
>
1 | > while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten |
2 | > return ADCW; |
3 | >
|
... fehlt ein ;
1 | ...
|
2 | while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten |
3 | ;
|
4 | |
5 | return ADCW; |
Warum änderst du die Funktionen aus dem Tutorial ab? Die funktionieren genau so, wie sie veröffentlicht wurden. Ok, die Referenzspannung musst du nach deinen Wünschen einstellen (und zwar korrekt), aber abgesehen davon gibt es keinen Grund am restlichen Code rumzupfuschen. Auch: WElchen Sinn hat es denn, wenn du die Funktion ADC_Read duplizierst? Die FUnktion ist so geschrieben, dass sie an Kanal 0 misst, wenn du sie mit adcval = ADC_Read( 0 ); aufrufst, und dass sie an Kanal 1 misst, wenn du sie mit adcval2 = ADC_Read( 1 ); aufrufst. Es gibt keinen Grund, die Funktion selber zu duplizieren! Du teilst mit dem Argument beim Aufruf der Funktion mit, welchen Kanal sie messen soll, und das macht die Funktion dann auch. Wer oder was braucht daher die Funktion ADC_Read2. Richtig. Die braucht keiner.
Immerhin hast du nicht den Fehler gemacht an ARef eine Verbindung zu Vcc zu machen. Das ist gut. Aber ein 100nF Kondensator nach Masse darf es an diesem Pin schon sein um mitzuhelfen die Referenzspannung zu stabilisieren.
ok ok .. warum meckert der compiler nicht? vermutlich hab ich das semikolon vergessen das ganz tut aber nichts zur sache und ich bekommt immer noch die 1024 auf dem lcd angezeigt und weis nicht warum ob5V oder Ground auf den PA0 und PA1
wieso referenzspannung`? Der Aref ist bei mir nicht angeschlossen die werden mir doch intern gebeben?
Sebastian schrieb: > ok ok .. warum meckert der compiler nicht? Weil es syntaktisch immer noch korrekt ist. "Die Birke streicht die Kreissparkasse über dem Sonnenaufgang." ist laut Duden auch völlig korrekt. Und trotzdem ein sinnloser Satz. Deinen Compiler interessiert nur, ob du die Sprachregeln eingehalten hast. Ob das was dann raus kommt einen Sinn ergibt oder nicht, das interessiert ihn nicht. Das ist dein Bier. > vermutlich hab ich das semikolon vergessen Nicht vermutlich. Ganz sicher. Oder wo in deiner Anweisung
1 | > while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten |
ist denn der Teil 'warten' zu finden?
> das ganz tut aber nichts zur sache
Na, wenn du meinst, dann eben nicht.
Sebastian schrieb: > wieso referenzspannung`? Der Aref ist bei mir nicht angeschlossen > die werden mir doch intern gebeben? Und was sagt das Datenblatt (sprich ATmel dazu)? Die sagen, dass du als Mindestvorkehrung zumindest einen 100nF Kondensator nach Masse anschliessen sollst.
naja diesen kondensator hab ich mal drangehängt... geht aber weiterhin naja mit deine warten anweisung.. versteht ich jezt gerade nicht so ganz auf dem stk 500 schwanken ja die werte je nach anliegender spannung und auf meinem board sinds nur 1024
Sebastian schrieb: > naja diesen kondensator hab ich mal drangehängt... geht aber weiterhin > > naja mit deine warten anweisung.. versteht ich jezt gerade nicht so ganz > du hast 2 Fehler Den hier > ADMUX = (REFS0); ADMUX = (1 << REFS0); und den hier > while (ADCSRA & (1<<ADSC) ) // auf Abschluss der > return ADCW; > while (ADCSRA & (1<<ADSC) ) // auf Abschluss der ; return ADCW; korrigiere BEIDE!
Karl Heinz Buchegger schrieb: > Sebastian schrieb: >> wieso referenzspannung`? Der Aref ist bei mir nicht angeschlossen >> die werden mir doch intern gebeben? > > Und was sagt das Datenblatt (sprich ATmel dazu)? > Die sagen, dass du als Mindestvorkehrung zumindest einen 100nF > Kondensator nach Masse anschliessen sollst. Lustig Datenblatt Seite 217 REFS0 alleine gesetzt bedeutet "AVCC with external capacitor at AREF pin". :-)
ok ist geändert hab die beiden pins jez mal in die luft gehängt,,, aber wieder diese scheis 1023...
ich korrigiere nun gehts war wohl dieser semikolon und deer Refs0 Danke einwandfrei
Laut Schaltplan nutzt du ADC2 und ADC3, nicht wie im Code ADC0 und ADC1. Evtl. lohnt es sich das zu überprüfen.
Ingo schrieb: > Mir ist etwas schleierhaft, wie ein 10Bit ADC, 1024(!) anzeigen kann... Der hat 10 + 1/1024 Bit.
hallo adcx wie meinst du das? die beiden PA 0 und P1 hab ich nur testweise jetzt angeschlossen..
Wenn du an ADC0 mißt mußt du auch an ADC0 etwas anschließen, zumindest im Schaltplan sind ADC0 und ADC1 unbeschaltet.
Sebastian schrieb: > hallo adcx > > > wie meinst du das? Genau so wie er es geschrieben hat. Da stehen wir nämlich drauf, wenn Schaltung und Programm nicht zusammenpassen, du mit Fehlern kämpfst und sich erst im Nachsatz rausstellt > die beiden PA 0 und P1 hab ich nur testweise jetzt > angeschlossen.. dass das Board welches vor dir liegt, ganz anders verschaltet ist :-)
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.