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
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.
vielen dank für die unterstützung zu nächst einmal werde ich die dokumentation lesen.
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 | }
|
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.
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.
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.
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 |
Nur mal so eine Frage am Rande. Machst Du eigentlich Deine Arbeit immer nicht selber?
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.
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.