Hallo, hat vielleicht jemand Erfahrung mit dem ATMega 168 ? Ich betreibe eine Schaltung mit LCD Display, welches über den Mega u8 angesteuert wird. Dazu verwende ich die Peter Fleury Library. Da ich nun Debuggen wollte, habe ich den Mega 8 durch den pinkompatiblen Mega 168 ausgetauscht. Jetzt kann ich jedoch das LCD nicht mehr ansteuern. Bin über Hilfe dankbar !
ohne jetzt darüber nachzudenken: die headerfiles entsprechend dem 'neuen' Controller ausgewählt und neu übersetzt?
Achim wrote: > hat vielleicht jemand Erfahrung mit dem ATMega 168 ? Nein, aber meine Ideen dazu: - Taktgeschwindigkeit gleichgeblieben? - Code für den den Controller neu generiert? - ggfs. JTAG-Interface aus?
Hallo, vergleich die Datenblätter, Atmel verwendet nicht immer die gleichen Registerbezeichnungen für Timer, IO, ADC ... Sollte Dir aber der Compiler sagen. Noch bescheidener ist, wenn die Register im höheren Adressbereich liegen. Bestimmte Befehle (ASM) sind auf 0..31 oder 0..63 begrenzt. Grüße Lothar
Niels Hüsken wrote:
> - ggfs. JTAG-Interface aus?
Hat der Mega168 nicht. Ansonsten volle Zustimmung: Code muss auf jeden
Fall neu compiliert werden (allein schon aufgrund der Tatsache, dass der
Mega168 jenseits der "magischen Grenze" von 8 KiB Flash liegt) und die
Fuses dürfen natürlich auch nicht vergessen werden... Pinkompatibel ist
nicht gleichbedeutend mit funktionskompatibel!
Ich hatte tatsächlich auf falsche Register zugegriffen. Außerdem War über Fusebits ein fester 1/8 Prescaler eingestellt. Ein neues Problem hat sich allerdings aufgetan: Ich nutze 3 AD Wandler. ADC0 und ADC1 funktionieren. Bei ADC2 wird allerdings immer ein Wert von 1012 eingelesen, egal ob 5V oder 0V anliegen. Hat vielleicht jemand irgendwelch Ideen ? Hardwarefehler kann ich ausschließen.
[Klugscheiß] Du kannst keine 3 AD-Wandler benutzen. Der Mega168 hat nur einen einzigen... [/Klugscheiß] Und ohne Dein Programm zu kennen, kann man da gar nix zu sagen (außer Vermutungen, z.B. Pull-Up aktiviert...)
Auf jeden Fall frägt der Multiplexer ordnungsgemäß ADC0, ADC1 und ADC2 ab. Interne Pullup-Widertände sind nicht aktiviert.
Johannes M. wrote: > Und ohne Dein Programm zu kennen, kann man da gar nix zu sagen (außer > Vermutungen, z.B. Pull-Up aktiviert...) Dieser Satz sollte ein DEZENTER HINWEIS darauf sein, dass man Dir *nur dann* wirklich sinnvoll helfen kann, wenn Du gewisse Informationen (z.B. Deinen Code) mal rüberwachsen lässt!
Also wie gesagt: ADC0 und ADC2 funktionieren. Bei ADC2 wird immer 1012 eingelesen, egal welche Spannung angliegt. #define adc0 ADMUX=11000000; // ADC 0 initialisieren #define adc1 ADMUX=11000001; // ADC 1 initialisieren #define adc2 ADMUX=11000010; // ADC 2 initialisieren ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //ADCs initialisieren while(1) { adc0; //ADC0 auslesen ADCSRA |= (1<<ADSC); while ( ADCSRA & (1<<ADSC) ) {} temp0=ADC; dc1; //ADC1 auslesen ADCSRA |= (1<<ADSC); while ( ADCSRA & (1<<ADSC) ) {} temp1=ADC; adc2; //ADC2 auslesen ADCSRA |= (1<<ADSC); while ( ADCSRA & (1<<ADSC) ) {} temp2=ADC; } Schon mal Danke für die Hilfe !!
Das ist nicht das vollständige Programm! Da fehlt zumindest die Port-Initialisierung. Außerdem kann man Code auch vernünftig formatieren...
#define adc0 ADMUX=11000000; // ADC 0 initialisieren #define adc1 ADMUX=11000001; // ADC 1 initialisieren #define adc2 ADMUX=11000010; // ADC 2 initialisieren volatile uint16_t temp0=0; volatile uint16_t temp1=0; volatile uint16_t temp2=0; DDRC &= ~(1<<PC0); DDRC &= ~(1<<PC1); DDRC &= ~(1<<PC2); ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //ADCs initialisieren int main(void) { while(1) { adc0; //ADC0 auslesen ADCSRA |= (1<<ADSC); while ( ADCSRA & (1<<ADSC) ) {} temp0=ADC; adc1; //ADC1 auslesen ADCSRA |= (1<<ADSC); while ( ADCSRA & (1<<ADSC) ) {} temp1=ADC; adc2; //ADC2 auslesen ADCSRA |= (1<<ADSC); while ( ADCSRA & (1<<ADSC) ) {} temp2=ADC; } }
Hinter einem #define darf kein Semikolon stehen! MW
C-Grundlagen, Lektion 1: Priogrammcode (z.B. Zuweisungen) kann in C nur innerhalb von Funktionen stehen. Deine DDRC-Zuweisungen stehen außerhalb jeglicher Funktion und dürften dementsprechend zu Fehlermeldungen führen. Zweite Lektion ist das, was Michael schon angedeutet hat... Und jetzt bitte den compilierbaren Code, den Du auch auf dem µC laufen hast und mit dem das beschriebene Problem auftritt, und nicht irgendwelchen zusammengemurksten Mist. BTW: Arbeitest Du mit einem JTAG-Adapter, oder woher weißt Du, dass der Wert der dritten Wandlung nicht stimmt?
Das ist der ganze Code und 2 ADCs funktionieren. Ich sehe das über DebugWire. @Johannes M. Umgangston , Lektion 1: Wenn du nicht weist, was der Fehler ist, dann sag es ruhig und mach nicht so auf wichtig.
Achim wrote: > Das ist der ganze Code und 2 ADCs funktionieren. Ich sehe das über > DebugWire. Du kannst hier niemandem erzählen, dass dieser Code bei Dir ohne tonnenweise Fehlermeldungen compiliert, weil er mehrere Syntax-Fehler enthält! > @Johannes M. Umgangston , Lektion 1: > > Wenn du nicht weist, was der Fehler ist, dann sag es ruhig und mach > nicht so auf wichtig. Ach, ich dachte, Du willst Hilfe, und nicht ich... Aber wenn Du meinst, auf meine Versuche, den Fehler zu finden, gar nicht eingehen zu müssen, dann sieh zu, wie Du es selber hinbekommst! Adios...
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.