PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATxmega32a4 ISR Problem



Sual
14.02.2013, 15:24
Hallo,
ich habe ein Problem mit dem Interrupt des ATXmega32A4.
Ich versuche über eine App einen String zu übermitteln.
Allerdings Springt der MC einfach nicht in die ISR(meine vermutung)
Ich habe jetzt ein kleines Programm geschrieben bei dem ich einfach nur das was ich per App schicke
auf Knopfdruck wieder zurückbekommen sollte aber ich erhalte immer nur einen Lehren String.
(es soll hier einfach nur 1 Buchstabe zu testzwecken übermittelt werden.)

Das senden der App funktionier es wurde mit hyperterminal getestet.
Das senden des MC auf die App wurde auch getestet und funktioniert.
Nur das Empfangen des MC funktioniert nicht.
Ich hoffe ihr könnt mir helfen.

Das Senden und empfangen funktioniert über Bluetooth
Der C Code ist im Anhang
MFG

robin
14.02.2013, 17:18
int init_usart(){
// UART Init, see Datasheet
PORTE.DIRSET = PIN3_bm;
PORTE.OUTSET = PIN3_bm;
PORTE.DIRCLR = PIN2_bm;

USARTE0.BAUDCTRLB = 0x00;
USARTE0.BAUDCTRLA = 0x67; // Gewünschte Bautrate 19200(Takt / (2^0 * 16*Baudrate)) – 1 = Wert für das Baudratenregister
// Errechnete Bautratenwert 103---> 0x67


USARTE0.CTRLB = USART_TXEN_bm | USART_RXEN_bm; //Empfangen und Senden des USARTs aktivieren
USARTE0.CTRLA = USART_RXCINTLVL_HI_gc; //Rx-Interrupt die höchste Priorität
//USARTE0.CTRLA |= USART_RXCINTLVL_MED_gc;
USARTE0.CTRLC = USART_CHSIZE_8BIT_gc; // Zeichen grösse auf 8 Bit festlegen
PORTE.DIR = 0x8;

könnte an der letzten zeile liegen, Du überschreibst deine Einstellungen von oben.

Sual
15.02.2013, 12:05
Danke für den Tipp hat aber leider nichts geändert.
Ich erhalte immer noch nur einen leeren String.

Sual
15.02.2013, 18:02
Inzwischen habe ich es geschafft das er in den ISR springt jetzt ist aber trotzdem noch das Problem das ich immer einen leeren String zurück bekomme.

Es lang an diesem Teil der Initialisierung das der Interrupt nicht funktioniert hat:
TCC0.CTRLA = TC_CLKSEL_DIV1024_gc;
TCC0.CTRLB = 0x00;
TCC0.INTCTRLA = 0x03;
TCC0.PER= 0x85ED;
hab das jetzt erst mal raus gelöscht da ich es hier nicht brauche.
Kann mir bitte jemand sagen wie ich das das Auslesen das USARTE0.Data Registers richtig mache ?

porter91
16.02.2013, 12:32
Wenn ich das richtig sehe muss du ein Array anlegen für die empfangegen daten da du ja sonst immer die Variable überschreibst und der Letzte wert im String ist halt eine Null:
Also ich würde es so machen:

#define BUFSIZE 20
uint8_t ring[BUFSIZE];
volatile uint8_t buf_in = 0;
uint8_t buf_out = 0;

ISR(USARTE0_RXC_vect)
{

ring[buf_in++] = USARTE0.DATA; // Usart einlesen und in data_Empfangen schreiben
buf_in %= BUFSIZE;
}


in der Main dann

if (buf_in != buf_out)
{
Send_UART(ring[buf_out++]);
buf_out %= BUFSIZE;
}

Jetzt musst du nur noch Sicher stellen das dein String kleiner ist als BUFSIZE

LG