Forum: Mikrocontroller und Digitale Elektronik Mega8 gegen Mega 168 ausgetauscht --> LCD Probleme


von Achim (Gast)


Lesenswert?

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 !

von vorbeigeschlendert (Gast)


Lesenswert?

ohne jetzt darüber nachzudenken: die headerfiles entsprechend dem 
'neuen' Controller ausgewählt und neu übersetzt?

von Niels H. (monarch35)


Lesenswert?

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?

von Lothar (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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!

von Achim (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

[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...)

von Achim (Gast)


Lesenswert?

Auf jeden Fall frägt der Multiplexer ordnungsgemäß ADC0, ADC1 und ADC2 
ab.
Interne Pullup-Widertände sind nicht aktiviert.

von Johannes M. (johnny-m)


Lesenswert?

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!

von Achim (Gast)


Lesenswert?

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 !!

von Johannes M. (johnny-m)


Lesenswert?

Das ist nicht das vollständige Programm! Da fehlt zumindest die 
Port-Initialisierung. Außerdem kann man Code auch vernünftig 
formatieren...

von Achim (Gast)


Lesenswert?

#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;

   }
}

von Michael Wilhelm (Gast)


Lesenswert?

Hinter einem #define darf kein Semikolon stehen!

MW

von Johannes M. (johnny-m)


Lesenswert?

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?

von Achim (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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
Noch kein Account? Hier anmelden.