-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 27

Thema: ATxmega Einstieg will nicht so recht

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380

    ATxmega Einstieg will nicht so recht

    Anzeige

    ich hab hier nen STK600 mit nem ATxmega129a1 drinne

    ich hab mal folgendes programm geschrieben um die LEDS ans PORTA einfach mal so als lauflicht im 1sekunden takt laufen zu lassen

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    ISR(TCC0_OVF_vect)
    {
    	PORTA.OUT <<= 1;
    	if(PORTA.OUT == 0) PORTA.OUT = 1;
    }
    
    
    int main(void)
    {
    	CCP = CCP_IOREG_gc;
    	OSC.CTRL |= OSC_RC32MEN_bm;
    	while(!OSC.STATUS & OSC_RC32MRDY_bm);
    	CCP = CCP_IOREG_gc;
    	CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
    	sei();
    	PORTA.DIR = 0xff;
    	PORTA.OUT = 1;
    	TCC0.PER = 31250;
    	TCC0.CTRLA = (TCC0.CTRLA & ~TC0_CLKSEL_gm) | TC_CLKSEL_DIV1024_gc;
    	TCC0.CTRLB = (TCC0.CTRLB & ~TC0_WGMODE_gm) | TC_WGMODE_SS_gc;
    	TCC0.INTCTRLA = (TCC0.INTCTRLA & ~TC0_OVFINTLVL_gm) | TC_OVFINTLVL_LO_gc;
    	PMIC.CTRL |= PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm;
    	while(1);
     	return 0;
    }
    theoretisch müsste ich auf internen 32MHz takt gestellt haben, den timer prescaler auf 1024 gestellt, als single slope konfiguriert und somit auf 1 überlauf pro sekunde gebracht haben ... das ergebnis sieht aber anders aus ... es sind 16 sekunden pro überlauf, er steht also noch immer bei 2Mhz intern ... auch das umstellen auf externen takt ist fehlgeschlagen und fuses für den takt gibt es nicht!

    hat evtl. jemand schon erfahrung mit atxmega? ich find den zwerg ja mal endgeil ^^

    auch wenn er ungleich komplizierter geworden ist ... liegt aber mehr daran, dass die registerbezeichnungen so vielfältig aber sinnheitlich verarmt sind

    ich benutze mittlerweilen eclipse wegen der autovervollständigung um mich durch den registerjungel zu hangeln

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Hi Ceos,

    ich habe gestern auf der Arbeit auch angefangen, mich mit dem XMega zu beschäftigen. Ich habe praktischerweise die gleiche Hardware wie Du. Ich werde am Montag mal versuchen, ein wenig mit den Timern zu hantieren. Ich sag dann Bescheid, wie's gelaufen ist.

    Gruß,
    askazo

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    hey hey ^^ ich hab leider nur zwischendurch zeit dafür, das macht es umso schwerer sich einzuarbeiten ^^

    ich lege dir persönlich eclipse ans herz eclipse für c/c++ und dann nach dem AVR eclipse plugin googeln ...

    wie du den treiber erstellst kann ich dir später noch posten

    in eclipse kannst du dann mit code-vervollständigung arbeiten und mit dem AVR plugin haste auch gleich ne passende toolchain und ein modul für den avrdude zum automatischen hochladen ... die fuseeinstellung ist unter aller kanone, dafür würde ich doch eher auf das avrstudio zurückgreifen

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    okay habs hinbekommen .... obwohl schon merkwürdig ... ist garnicht so anders geworden

    Code:
    ISR(TCC0_OVF_vect)
    {
    	PORTA.OUT <<= 1;
    	if(PORTA.OUT == 0) PORTA.OUT = 1;
    }
    
    int main(void)
    {
    	sei();
    	PMIC.CTRL |= PMIC_HILVLEN_bm | PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm;
    	PORTA.DIR = 0xff;
    	OSC.CTRL |= OSC_RC32MEN_bm;
    	while(!(OSC.STATUS & OSC_RC32MRDY_bm));
    	CCP = CCP_IOREG_gc;
    	CLK.CTRL = (CLK.CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_RC32M_gc;
    	TCC0.CNT = 0;
    	TCC0.PER = 31250;
    	TCC0.CTRLA = (TCC0.CTRLA & ~(TC0_CLKSEL_gm)) | TC_CLKSEL_DIV1024_gc;
    	TCC0.CTRLB = (TCC0.CTRLB & ~(TC0_WGMODE_gm)) | TC_WGMODE_SS_gc;
    	TCC0.INTCTRLA = (TCC0.INTCTRLA & ~(TC0_OVFIF_bm)) | TC_OVFINTLVL_HI_gc;
    	while(1);
    	return 0;
    }
    ich hab eigentlich nur das CLK.CTRL vorher ausmaskiert oder hab ich tomaten auf den augen ?

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Nein, Du hast noch was ganz entscheidendes anders gemacht.
    Vorher:
    Code:
    while(!OSC.STATUS & OSC_RC32MRDY_bm);
    Nachher:
    Code:
    while(!(OSC.STATUS & OSC_RC32MRDY_bm));
    Ich versuche gerade, den Timer mit 32MHz laufen zu lassen. Irgendwo muss doch noch ein Register für den Common Prescaler der Timer sein...

    [edit]
    Quatsch, hab mich verrechnet - der Timer läuft schon mit 32MHz. Aber der Common Prescaler (siehe Seite 153 im Manual) muss doch trotzdem irgendwo einzustellen sein, oder?
    [/edit]

    Gruß,
    askazo

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    also im manual A (NICHT DATASHEET!) auf seite 80 steht, dass man erst die quelle einstellt, dann prescaler A, B und C setzt

    A: 1,2,4,8,16,32,64,128,256, 512 (5bit, offset 2, CLK.PSCTRL register)
    B: 1,2,4
    C: 1,2

    B & C (2bit, offset 0 CLK.PSCTRL register)

    theoretisch kann man auch den hochpräzisen timerquarz als source nehmen und über den PLL laufen lassen um die freuenz zu multiplizieren

    EDIT:

    quark ... hab nochmal nachgelesen, mit PS A kann man den takt teilen und mit PS B und C kann man zum abstimmen des taktverhältnis von CPU zu peripherie einzustellen ... geile idee, peripherie 4mal schneller als CPU ... das spart bestimmt ordentlich zeit beim benutzen der UART und man kann das zeitverhalten der CPU linearer berechnen ....

    aber ich hab zu wenig weitblick als dass sich mir der sinn dieser funktion vollkommen erschliessen würde ^^

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Hmm, so langsam blicke ich ein wenig durch.
    Standartmässig sind die Teiler A,B und C auf 1, d.h.
    clkper = clkper2 = clkper4 = clksys.
    Mit den Teilern kann ich jetzt das ganze z.B. so einstellen, dass die "normale" Peripherie (also alles, was auf clkper läuft) und die CPU (clkcpu ist immer gleich clkper) auf 8MHz läuft, clkper2 auf 16MHz und clkper4 auf 32MHz (=clksys). Nur der Sinn des ganzen erschließt sich mir nicht ganz. Höchstens Stromersparniss...

    Gruß,
    askazo

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    wie gesagt taktvorteile der hardware der CPU gegenüber seh ich da mehr im vorteil

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    25.11.2009
    Beiträge
    9
    leute ich verzweifele ich hab auch nen STK600 mit nem ATxmega128a1 drinne und jtag mk2.

    Folgendes Problem: Wenn ich in Debugmodus gehe und im Quellcode nichts oder entweder was steht(PORTA und LEDPORT sind miteinander verbunden), fangen die LED0 und LED1 zu leuchten und die STATUSLED blinkt rot. Wenn man PORTB mit LEDPORT verbindet, fangen LED7 und LED4 zu blinken und LED5 und LED6 zu leuchten an und die STATUSLED blinkt weiterhin rot??


    Woran kann es liegen!!???


    Vielen Dank im Vorraus

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Hi maloj,

    willkommen im Club
    PORTB funktioniert nicht, da auf PB4-PB7 das JTAG-Interface liegt.
    Warum allerdings PORTA nicht geht, ist mir auch ein Rätsel. Aber zur Beruhigung - bei mir passiert das selbe.
    PA0 und PA1 sind seltsamerweise nach dem Reset bei leerem Controller - im Gegensatz zu anderen Port-Pins - auf High. Da scheint also irgendeine Special Function drauf zu liegen, die standardmässig aktiviert ist. Allerdings liegt laut Datenblatt auf den beiden nur der ADC bzw. der analoge Komparator. Auf PA0 zusätzlich noch AREF, aber das erklärt das Phänomen auch nicht. Da bin ich ratlos...

    Aber Du hast ja noch genug andere Ports, die Du auf die LEDs legen kannst

    Gruß,
    askazo

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •