Forum: Compiler & IDEs atmega 16 to atxmega16A4


von ziro w. (braym)


Angehängte Dateien:

Lesenswert?

hallo zusammen
ich habe ein Programm für ATmega 16, welche ich durch ATxmega 16A4 
ersetzen mochte
was soll ich an dem Programm ändern damit es richtig läuft.
Vielen Dank im Voraus

von Gerhard G. (g_g)


Lesenswert?

Hallo,

alles was "C" ist bleibt gleich, Hardware wie SPI, EEPROM, UART, muss 
angepasst werden. SPI und Uart sind bis auf die Registernamen fast 
kompatible. Bei EEPROM wird es etwas schwieriger. Da sind spezielle 
Treiber dafür vorgesehen. In Prinzip gibt es aber  für jeden 
Peripherie-Baustein einen Treiber. Doku und Übungen findest du im 
Internet unter AVR
http://www.atmel.com/devices/atxmega16a4u.aspx?tab=documents.
und http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial

G.G.

von ziro w. (braym)


Lesenswert?

vielen dank für die unterstützung

zu nächst einmal werde ich die dokumentation lesen.

von ziro w. (braym)


Angehängte Dateien:

Lesenswert?

hallo
kann mir jemand sagen ob diese programme teil richtig ist

vielen dank

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn dir's nur ums Lesen geht, ist das einfacher.  Irgendwo in die
Initialisierung des Controllers schreibst du
1
NVM.CTRLB |= NVM_EEMAPEN_bm;

mit rein.  Danach kannst du memory-mapped auf den EEPROM zugreifen:
1
unsigned char EEPROM_read(unsigned int address)
2
{
3
  return *(unsigned char *)(MAPPED_EEPROM_START + address);
4
}

von Timmo H. (masterfx)


Lesenswert?

Die EEPROM Unterstützung ist in avr-gcc schon drin (avr/eeprom.h). Es 
lässt sich genauso "bedienen" wie bei den anderen Megas/Tinys

Anstatt deinen ganzen "asm("sei");" und "asm("cli");" kannst du übrigens 
auch direkt "sei()" bzw. "cli()" machen. Das geht übrigens nicht erst 
seit den xmegas sondern auch schon vorher.

von ziro w. (braym)


Lesenswert?

ich wollte es eigentlich wie in folgende text beschrieben machen.

3.1.1 Reading EEPROM

The steps to read an EEPROM location are as follows:
1. Wait for any previous NVM operations to finish.
2. Load the NVM Address registers (ADDRn) with the desired EEPROM byte
address.
3. Issue the EEPROM Read command (byte value 0x06) to the NVM 
controller.
4. The CPU will be halted two clock cycles and then data is available in 
NVM Data
Register 0 (DATA0). There is no need to wait for the NVM Busy bit to 
clear.
This operation is not supported if memory-mapped EEPROM access is 
enabled.

von Timmo H. (masterfx)


Lesenswert?

boyh akku schrieb:
> ich wollte es eigentlich wie in folgende text beschrieben machen.
>

Warum denn wenn es in der lib mit drin ist? Dann bist du schon wieder 
von einem speziellem µC abhängig. Da wo es geht sollte man schon die 
dafür gemachten Funktionen nehmen. Hättest du das vorher schon gemacht, 
hättest du es jetzt nicht umbauen müssen.

von ziro w. (braym)


Lesenswert?

ist das richtig wenn ich statt  diese Teil programme für Atmega
1
const unsigned char scale1=(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00); // no prescaling
2
const unsigned char scale2=222;//(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS01); // 1/8 prescaling
3
const unsigned char scale3=333;//(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS01)|(1<<CS00); // 1/64 prescaling
diese fürs ATXMEGA schreib
1
const unsigned char scale1=(1<<TCC0.CTRLA)|(5<<TCC0.CTRLB);// no prescaling
2
const unsigned char scale2=(4<<TCC0.CTRLA)|(5<<TCC0.CTRLB);//1/8 prescaling
3
const unsigned char scale3=(5<<TCC0.CTRLA)|(5<<TCC0.CTRLB);//1/64 prescaling

von Herbert (Gast)


Lesenswert?

Nur mal so eine Frage am Rande. Machst Du eigentlich Deine Arbeit immer 
nicht selber?

von ziro w. (braym)


Lesenswert?

an hebert
ich bin keine profi wie du vielleicht?
ich will eifach sicher sein dass alles stimmt was ich mach
vielen dank für diene komplement.

von clement (Gast)


Lesenswert?

was du gechrieben hast ist rechtig

von Karl H. (kbuchegg)


Lesenswert?

ziro wallo schrieb:
> an hebert
> ich bin keine profi wie du vielleicht?
> ich will eifach sicher sein dass alles stimmt was ich mach
> vielen dank für diene komplement.

Auch Profis hatten mal eine Zeit, in der sie keine Profis waren.
Dadurch, dass man seine Arbeit selbst macht, lernt sich selbst zu 
kontrollieren, alles mit dem Datenblatt ein paar mal abgleicht und dann 
extensiv testet und im Fehlerfall dann auch seinen eigenen Fehlern auf 
die Spur kommt, wird man zum Profi.

Jag den Code durch den Compiler, brenn es auf den µC und miss nach, ob 
der Timer wie vorgesehen auf einen Wechsel des Prescalers reagiert. Wenn 
er auf unterschiedliche Prescaler reagiert, ist das schon mal ein gutes 
Zeichen. Wenn du dir dann noch überlegst, wie du die dadurch erreichte 
Frequenz messen bzw. kontrollieren kannst und das dann auch noch stimmt, 
stehen die Aktien schon ganz gut.

Auch das gehört zum Prozess des Profi-Werdens dazu: Sich zu überlegen, 
wie man mittels Tests etwas nachweisen kann.

Und das Beste am Ganzen: Dadurch, dass man bei einfachen Dingen dies 
Techniken lernt, gewinnt man an Sicherheit. So das man dann bei wirklich 
komplizierten Sachen nicht auf verlorenem Posten steht, sondern weiß und 
die Techniken kennt, wie man die Dinge in den Griff kriegen kann. Übung 
macht den Profi.


(Tipp: mittels Software-Counter in einer Timer-ISR entsprechend 
runterteilen und eine LED blinken lassen, die man dann mit einer Uhr und 
abzählen der Blinker pro Zeiteinheit kontrolliert ist meistens eine 
einfache und ausreichend genau Kontrollmköglichkeit für alle diejenigen, 
die keinen geeigneten Messpark zur Verfügung haben).

von Timmo H. (masterfx)


Lesenswert?

ziro wallo schrieb:
> ist das richtig wenn ich statt  diese Teil programme für Atmega
>
1
> const unsigned char scale1=(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
2
> // no prescaling
3
> const unsigned char
4
> scale2=222;//(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS01); // 1/8
5
> prescaling
6
> const unsigned char
7
> scale3=333;//(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS01)|(1<<CS00); //
8
> 1/64 prescaling
9
>
> diese fürs ATXMEGA schreib
>
1
> const unsigned char scale1=(1<<TCC0.CTRLA)|(5<<TCC0.CTRLB);// no
2
> prescaling
3
> const unsigned char scale2=(4<<TCC0.CTRLA)|(5<<TCC0.CTRLB);//1/8
4
> prescaling
5
> const unsigned char scale3=(5<<TCC0.CTRLA)|(5<<TCC0.CTRLB);//1/64
6
> prescaling
7
>
So geht das natürlich nicht. Während WGM00/01, COM00/01, CS00/01 beim 
Atmega16 noch in einem Register waren (TCCR0) ist es beim Atxmega in 
zwei Registern, nämlich CTRLA und CTRLB. Also musst du nun zwei Register 
beschreiben. Und zwar am besten mit den Makros die AVR-GCC dir liefert:
Dem alten Scale1 würde so oder so ähnlich aussehen:
1
TCC0.CTRLA = TC_CLKSEL_DIV1_gc; //Div = 1
2
TCC0.CTRLB = (1<<TC0_CCAEN_bp) | (TC_WGMODE_SS_gc); //Compare Enable, Single Slope PWM
3
TCC0.PER = 0xFF; //Timer auf 8 Bit => TOP = PER
ggf. dann noch das PORTC.PIN0CTRL = (1<<PORT_INVEN_bp); um den OC0A zu 
invertieren
Wie gesagt einfach mal genau das Datenblatt ansehen.

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.