Hallo Habe ein Problem mit dem Noise Canceler Mode des ATmega8. Wenn ich die Wandlung "von Hand" : ADCSRA |= (1<<ADSC); while(!(ADCSRA & (1<<ADIF))); anstarte fuzt alles. Wenn ich jedoch den Sleep Mode aktiviere und auf den Interrupt warte wacht er nicht mehr auf. Habe noch keine Beispiele über dieses Problem gefunden. Vielleicht hat schon jemand Erfahrungen gemacht. Gruß Lars
Interrupts werden eingeschaltet Einmal mit sei(); vor der Endlosschleife. Andere Interrupts werden ohne Sleep Mode auch ausgelöst. (Timer UART)
Hallo Lars, ohne den ganzen Code wird´s schwierig zu sagen. Vielleicht sehen wir dann ja auch das von Jörg angefragte und von Dir bemerkte sei(); vor der Endlosschleife... Wenn Deine Funktion adc_init so verwendet wird wie der Name es sagt (nämlich nur zum Initialisieren), dann "pennt" Dir der Chip ja schon bei der Initialisierung ein. Was sagt denn die Simulation (z.B. mit dem AVRStudio) zu Deinem Programm? Vielleicht kannst Du ja schon da sehen, wo´s hängt. Ganz nebenbei bemerkt bin ich am Anfang des Jahres auch mit dem Sleep-Mode und dem ADC gescheitert, allerdings mit einem Tiny26. Leider unterstützt das Studio bei der Simulation nicht das Wake-Up, so daß ich dann zähneknirschend ohne Sleep-Modes gearbeitet habe. Aber andere Fehler ließen sich schon finden ... Gruß Lutz
Nur um Mißverständnissen vorzubeugen, da blöd formuliert: <Wenn Deine Funktion adc_init so verwendet wird wie der Name es sagt <(nämlich nur zum Initialisieren), dann "pennt" Dir der Chip ja schon <bei der Initialisierung ein. Das gilt natürlich nur, wenn Dein sei(); dahinter kommt. Weiterhin kannst Du statt <adc_data = ADCL; <adc_data += (ADCH<<8); adc_data = ADC; schreiben (oder ADCW, steht in der zugehörigen Headerdatei ioxx.h)
Hallo Oh man es können ja Probleme mit dem Sleep Mode auftreten an die man noch nie gedacht hat. Danke Lutz und Jörg Der Chip ist schon beim Initialisieren eingepennt. Jetzt kann ich immerhin messen. Habe mal mein ganzes Projekt angehängt. Werde es wenn es fertig ist auch in der Codesammlung posten. Habe aber noch einige Probleme: 1. Ich verschicke meine Daten über Interruptgesteuerte UART an den PC. Aktiviere ich jedoch den Sleep Mode für den Noise canceler ist da Schluss mit senden. Der Buffer läuft sicherlich über und der uC hängt sich auf. Deshalb wollte ich den Buffer leeren bevor ich neue Messungen anstarte. (läuft noch nicht richitg) 2. Umwandlen der Messdaten in einen String ist noch fürchterlich. Das muss noch schöner gehen. Gruß Lars
Hallo @Lutz Müller adc_data = ADCL; adc_data += (ADCH<<8); durch adc_data = ADCW; zu ersetzen funzt leider nicht. Es lässt sich kompilieren liefert aber nicht das gleiche Ergebnis. ADCW ist in iom8.h als 16 Bit beschrieben. Ich denke bei mir fehlen 2 vom Ergebnis. Gruß Lars
Hallo Lars,
bei
>Ich denke bei mir fehlen 2 vom Ergebnis.
kann ich nicht so ganz deuten. Was meinst Du damit? Bei Dir ist
adc_data als unsigned int deklariert, also mit großer
Wahrscheinlichekeit 16 Bit. Wenn ich mich jetzt vertun sollte: Nimm
statt "unsigned int" "uint16_t" . Bitte beschreibe das Problem
genauer. In Deinem Ansatz liest Du erst das Lowbyte in adc_data, dann
schiebst Du das Highbyte um 8 Stellen (1 Byte) nach links. Das Gleiche
sollte der Compiler für Dich machen wenn Du adc_data = ADCW schreibst.
Kannst Dir ja mal das Assemblerlisting (.lss-Datei) des Compilers bei
beiden Varianten anschauen und vergleichen.
Gruß
Lutz
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.