Datum: 09.04.2008 11:50
Hallo, ich habe im Forum und im Internet allgemein schon gesucht konnte aber nicht zu meinem Problem finden. Ich habe gestern versucht 2 ADC Kanäle an einem AT90CAN32 Controller in Betrieb zu nehmen. Das Wesentliche im Quellcode sieht folgendermaßen aus (bitte habt Verständnis das ich hier nicht den gesammten code poste):
#define ADC_VREF_TYPE 0x00 unsigned int read_adc(unsigned char adc_input) { unsigned int i; ADMUX=adc_input; //|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; //dummy readout // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0){;} ADCSRA|=0x10; result = ADCW; result = 0; for (i=0; i<4; i++) { ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0){;} result += ADCW; } result /= 4; return result; } void main(void) { // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; ADCSRB=0x00; // ADC initialization // ADC Clock frequency: 125,000 kHz // ADC Voltage Reference: AVCC pin // Digital input buffers on ADC0: On, ADC1: On, ADC2: Off, ADC3: Off // ADC4: Off, ADC5: Off, ADC6: Off, ADC7: Off DIDR0=0xFF; //war FC ADMUX=ADC_VREF_TYPE; ADCSRA=0x87; while (1) { if (bit_620ms != 0) { bit_620ms = 0; adc_0 = read_adc (0x00); adc_1 = read_adc (0x01); test_03 = adc_0/16; test_04 = adc_0%16; test_04 = (test_04<<4); can_data8[6] |= test_03; can_data8[7] |= test_04; test_01 = adc_1/16; test_02 = adc_1%16; test_02 = (test_02<<4); can_data8[4] |= test_01; can_data8[5] |= test_02; if (adc_0 == adc_1) { can_data8[1] |= 0xFF; } else { can_data8[1] |= 0x66; } CAN_SET_CHANNEL(CHANNEL_8); conf_tx = can_tx_MOb8.ctrl; pt_candata_tx = can_tx_MOb8.pt_donne; can_tx_id = can_tx_MOb8.id; SendCanMsg(); } } |
Das funktioniert auch direkt nach dem Einschalten der Betriebsspannung! Ich kann im Identiefier den ich alle 620ms sende sehen das mir die Sapnnung, die ich an die beiden ADC's angelegt habe, angezeigt wird - sehr genau, wie ich es mir vorstelle (siehe Bild canoe_adc_02.GIF im Anhang). Die 0x07F entsprechen rechnerisch 0,62V, die ich messtechnisch exat bestätigen kann. Wenn ich die Betriebsspannung abschalte und die zu messenden Spannungen am ADC Eingang ändere, dann wieder die Betriebsspannung einschalte bekomme ich die geänderten Spannungswerte ebenfalls richtig angezeigt. Nun mein Problem: Die Anzeige der richtigen Werte ist nur nach dem Einschalten ohne Änderung der zu messenden Spannung gewähleistet. Wenn ich die zu messende Spannung am ADC Eingang ändere, und zwar egal ob die Spannung größer oder kleiner wird, läuft einer der beiden Variablen z.B. gegen 0x3FF (oder auch 0x0FF) und dann passiert gar nichts mehr! Zum Verständnis versuche ich es nochmal zu formulieren. Auch wenn die zu messende Spannung kleiner wird, wird der Wert, welcher mir für diese Spannung angezeigt wird größer. Das geht solange bis an der Stelle 16^0 und 16^1 ein FF steht. Danach ändern sich die Werte gar nicht mehr. Kann mir jemand helfen? Ich bin für jeden Gedankenanstoß dankbar. Gruß, Karl
Datum: 09.04.2008 12:02
Hallo nochmal, gerade habe ich den Fehler selber gefunden! Tückischer Zuweisungsoperator |=. Danke
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel
