noch mal ein kleines Problem und zwar habe ich mir das beispiel im GCC Tutorial mal angsehehn. was hat es mit folgenden Zeilen auf sich ? ADMUX = CHANNELOFFSET+channel; // Kanal waehlen ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen die erste Zeile kommt mir etwas komisch vor was bedeutet CHANNELOFFSET+channel sind das vorher definierte variablen ode was ist das ? danke für eure Hilfe
ich habe noch ein anderes Problem hier noch mal mein Code: #include <avr/io.h> #include <stdbool.h> int main(void) { unsigned char x; bool conversion; ADCSRA = 0b10100110; //ADCSRA initialisieren conversion =1; if(conversion==1) { ADCSRA = 0b11100110; // Konvertierung starten if(bit_is_set(ADCSRA,6)) { x = ADCL; // ADCL auslesen x += (ADCH<<8);// ADCH auslesen } else { sbi(ADCSRA,6); } } /* Endlosschleife */ for (;;); return 0; } und zwar möchte ich auf irgend eine Art und weise erfahren was nun in variable x drin steht habt ihr ne Idee wie man das machen könnte ?
Du könntest den Wert der Variablen mit "PORTB = x" auf einen Port legen, an den LEDs angeschlossen sind. Diese zeigen dann den Wert im Binärcode an.
okay hab ich gemacht funktioniert auch nun habe ich aber noch eine Bedingung eingaut, die überprüft ob die wandlung abgeschlossen wurde indem prüfe ob das ADIF bit in ADCSRA gesetzt worden ist. und das ADIF bit wird nicht gesetzt, was kann das daran liegen das ich in ADMUX nix gesetzt habe, also damit kein Multplixer Kanal gesetzt ist ? hier der aktuelle code: #include <avr/io.h> #include <stdbool.h> int main(void) { DDRC =0xff; unsigned char x; bool conversion; ADCSRA = 0b10100110; //ADCSRA initialisieren conversion =1; if(conversion==1) { ADCSRA =0b11100110; //Konvertierung starten if(bit_is_set(ADCSRA,6)) { if(bit_is_set(ADCSRA,ADIF)) { x = ADCL; x += (ADCH<<8); PORTC=0x00; // PORTC=x; } else { sbi(PORTC,7); ADCSRA = 0b111001110; } } else { ADCSRA =0b11100110; } } /* Endlosschleife */ for (;;); return 0; }
Hallo Gizmo, nach 10 Sekunden Überflug als C-Anfänger ist mir folgendes aufgefallen: - Datentyp bool erst ab C99; muß im MFile als Option berücksichtigt werden. Auch die stdbool.h kenne ich nicht, war aber auch im Urlaub, vielleicht ist die ja neu - Das mit unsigned char x (8 bit) und dem anschließenden 16 Bit-geschiebe hast Du bestimmt nicht so gemeint ...Außerdem benutze doch einfach unsigned int x = ADCW (je nach includiertem io-header/uC auch nur ADC)und der Compiler behandelt für Dich die zwei 8bit-Zugriffe. - Nicht sbi benutzen, da deprecated. Ganz allgemein ist die Mischung zwischen (nicht-C-) binärer Bitdarstellung und den Bitnamen sehr unübersichtlich. Auch ist es besser, ein Register mit |= zu ändern und nicht wieder die komplette Bitmaske anzugeben. Zumindest bei größeren Programmen wird man dadurch sehr unflexibel und hat evtl. zur Laufzeit ein Registerbit geändert, welches jetzt durch die statische Bitmaske beim Funktionsaufruf wieder überschrieben wird. Gruß Lutz
Nun ja, das mit bool hat sich wohl schon geklärt, wie ich gerade gelesen habe. http://www.mikrocontroller.net/forum/read-2-190909.html#new
Naja, er hat bool natürlich trotzdem eher unsinnig benutzt. Wenn schon bool, dann sind die einzigen beiden Werte, die er annehmen soll, true und false. Für den Rest gebe ich dir aber auch Recht. Bezüglich deiner Anmerkung mit dem Setzen eines einzelnen Bits in einem IO-Register wie ADCSRA kommt noch dazu, dass ADCSRA in dem Registerbereich liegt, in dem der Compiler ein |= zu einem SBI optimieren kann. Für IO-Register, die außerhalb desse liegen, kann es u. U. günstiger sein, tatsächlich jedesmal alle Bits neu darüber zu schreiben, aber dann natürlich trotzdem noch symbolisch bleiben für die Bitnamen und nicht numerisch.
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.