Forum: Mikrocontroller und Digitale Elektronik ATMEGA: verwendeter Controllertyp bestimmen


von R. F. (inet_surfer88)


Lesenswert?

Hallo,

ich habe mir ein eigenes Programm für die I2C-Ansteuerung geschrieben, 
welches ich in verschiedenen Schaltungen einsetzt. Bisher verwende ich 
den MEGA16 und MEGA644P. Funktioniert alles ohne Probleme.

Jetzt möchte ich zusätzlich den MEGA48 einsetzen. Laut Datenblatt wird 
hier die I2C-Geschwindigkeit mit einer etwas abgeänderten Formel 
berechnet, wodurch eine andere Registereinstellung notwendig ist.

Ich Programmiere mit dem Studio6.1. Gibt es hier eine Möglichkeit, im 
Programmcode den verwendeten Controller zu bestimmen. Der Controllertyp 
wird im Studio ja eingestellt und die Info liegt ja somit vor.

Ich stelle mir das in etwa so vor:
1
if ("MEGA48")
2
   {"REGISTEREINSTELLUNG_1";}
3
else
4
   {"REGISTEREINSTELLUNG_2";}

Wie könnte man so etwas am besten realisieren?

Danke und Gruß
Rüdiger

von Karl M. (Gast)


Lesenswert?


von Georg G. (df2au)


Lesenswert?

Die Fleury Lib für die serielle Schnittstelle ist auch ein gutes 
Beispiel, wie man das lösen kann.

Auszug:
#if defined(_AVR_AT90S2313_) \
 || defined(_AVR_AT90S4414_) || defined(_AVR_AT90S4434_) \
 || defined(_AVR_AT90S8515_) || defined(_AVR_AT90S8535_) \
 || defined(_AVR_ATmega103_)
 /* old AVR classic or ATmega103 with one UART */
 #define AT90_UART
 #define UART0_RECEIVE_INTERRUPT   UART_RX_vect
 #define UART0_TRANSMIT_INTERRUPT  UART_UDRE_vect
 #define UART0_STATUS   USR
 #define UART0_CONTROL  UCR
 #define UART0_DATA     UDR
 #define UART0_UDRIE    UDRIE
#elif defined(_AVR_AT90S2333_) || defined(_AVR_AT90S4433_)
 /* old AVR classic with one UART */
 #define AT90_UART
 #define UART0_RECEIVE_INTERRUPT   UART_RX_vect

usw...

von R. F. (inet_surfer88)


Lesenswert?

Hallo,

Danke für die schnelle Antwort.
Dann sollte es also so funktionieren:
1
if defined (__AVR_ATmega16__)
2
  {"REGISTEREINSTELLUNG_1";}
3
.....

Ich muss jetzt gleich weg, werde das heute mittag ausprobieren.


Gruß Rüdiger

von Draco (Gast)


Lesenswert?

Such mal nach compiler direcetive: 
https://de.wikipedia.org/wiki/Compiler-Anweisung


Quasi: #define #ifdef #if #endif....

Da wird dann auch nur der Code compiliert für das was aktiviert ist.


Quasi:

[c]


// Setze hier denen Controllertyp:
// z.b. UseMega48, oder UseMega16 - kannst du dir selbst aussuchen

#define UseMega48

#ifdef UseMega48

  string Register = "Registereinstellung1";

#elif UseMega16

  string Register = "Registereinstellung2";

#else

  string Register = "StandartEinstellung";

#endif

// Und so weiter und so fort...

[c]

von spess53 (Gast)


Lesenswert?

Hi

>Laut Datenblatt wird
>hier die I2C-Geschwindigkeit mit einer etwas abgeänderten Formel
>berechnet, wodurch eine andere Registereinstellung notwendig ist.

Da hast du etwas falsch verstanden. Die Registereinstellungen sind 
identisch.

MfG Spess

von R. F. (inet_surfer88)


Lesenswert?

spess53 schrieb:

> Da hast du etwas falsch verstanden. Die Registereinstellungen sind
> identisch.


Laut Datenblatt MEGA16 und MEGA644:
SCL fr = CPU Clock / 16+2(TWBR)*4^TWPS

Laut Datenblatt MEGA48:
SCL fr = CPU Clock / 16+2(TWBR)*TWPS

Die eine Variante wird direkt mit TWPS multipliziert, die andere mit 4 
hoch TWPS. Oder stehe ich hier gerade auf dem Schlauch???


Gruß Rüdiger

von spess53 (Gast)


Lesenswert?

Hi

>Oder stehe ich hier gerade auf dem Schlauch???

Ja. das eine sind die TWPS-Bits (0..3) und das andere die TWPS-Werte (1, 
4, 16 und 64). Wenn man  4^TWPS-Bit rechnet kommt man auch auf 1, 4, 16 
und 64.

MfG Spess

von R. F. (inet_surfer88)


Lesenswert?

Hallo Spess,

danke für deine Erläuterungen. Ich hab mir das Datenblatt nochmals 
angeschaut, man sollte halt lesen, und nicht "überfliegen".
Beim 48er heisst es Prescaler Value, beim 16er Value of the Prescaler 
Bits.

Dann ist das natürlich die gleiche Formel. Ich bin fälschlicherweise 
davon ausgegangen, das bei beiden Formeln der Prescaler Value gemeint 
ist.

Damit hat sich dann die gesamte Fragestellung erledigt, da ich eine 
Einstellung für alle von mir verwendeten Controllern nehmen kann. Aber 
man weiß ja nie, für was man die Info in Zukunft gebrauchen kann.


Gruß Rüdiger

von spess53 (Gast)


Lesenswert?

Hi

>Aber man weiß ja nie, für was man die Info in Zukunft gebrauchen kann.

Eigentlich bin ich immer mit TWPS1:TWPS0=00 ausgekommen.

MfG Spess

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.