PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atxmega PortIn wird nicht ausgewertet, nur im Einzelschritt



Basti1204
27.10.2016, 20:52
Hallo zusammen,

ich brauche euere Hilfe, bin total verzweifelt.
Es geht um eine Auswertung auf einem Atxmega


void datenAbrufen(){
while ((PORTC_IN & (1<<PIN_DATA)) > 0) { //warten bis DATA low
}
_delay_us(30);
int i = 0;
long ergebnis1 = 0;
PORTC_DIRSET |= (1<<PIN_SCK); //Wenn Daten vorhanden SCK auf Ausgang schalten
for(i=0; i<26; i++){ //MSB abrufen
PORTC_OUTSET |= (1<<PIN_SCK); //Clock setzen <--- wenn Breakpoint ab hier gesetzt und Einzelschritt werden die Ports richtig ausgewertet
_delay_us(10);
if (PORTC.IN & 0x04){
ergebnis1 |= 1;
}else{
ergebnis1 |= 0;
}
ergebnis1 = (ergebnis1 << 1);
_delay_us(1);
PORTC_OUTCLR &= (1<<PIN_SCK); //Clock rücksetzen
}

PORTC_OUTSET |= (1<<PIN_SCK); //Clock setzen
PORTC_OUTCLR &= (1<<PIN_SCK); //Clock rücksetzen
PORTC_DIRCLR &= (1<<PIN_SCK); //SCK

GewLOW = ergebnis1 & 0xFF;
GewMIB = (ergebnis1 & 0xFF00) >> 8;
GewMSB = (ergebnis1 & 0xFF0000) >> 16;
}

mein Problem:
läuft der Code ohne Breakpoint durch bleibt ergebniss1 also der Portin immer 0,
wenn ich aber einen Breakpoint setze und im Einzelschritt durchlaufe funktioniert alle und ich sehe auch dass in den Registern 1 steht...
Hatt jemand eine Idee an was sowas liegen kann?

Schon mal danke im voraus!

radbruch
27.10.2016, 23:07
Hallo

PORTC_OUTCLR &= (1<<PIN_SCK); //Clock rücksetzen

Im Gegensatz zum ATMega wird beim XMega ein Ausgangsbit zurückgesetzt indem man das entsprechende Bit im Outclear-Register setzt:

PORTC_OUTCLR = (1<<PIN_SCK); //Clock rücksetzen

Beim normalen Mega geht das so:

PORTC &= ~(1<<PIN_SCK); //Clock rücksetzen

Vorteil: Der Port muss nicht erst gelesen werden um das entsprechende Bit dann ausblenden und rücksetzen zu können.

Gruß

mic

http://leoninstruments.blogspot.de/2014/05/xmega-tutorial-ports-04.html
https://www.mikrocontroller.net/topic/289229

P.S.: Das gilt natürlich für alle Set/Clear-Funktionen der Ports. Es ist schon spät...

Ceos
28.10.2016, 06:23
wie radbruch schon schrieb, die set und clr register werden nur mit den bits angestuert die du schalten möchtest, die Zeilen

PORTC_OUTSET |= (1<<PIN_SCK);
und
PORTC_DIRSET |= (1<<PIN_SCK)

sind ebenfalls falsch, sollte aber nicht das Problem erklären, man sollte es nur nicht zur Gewohnheit machen mit |= bei den Registern zu arbeiten :)

ich vermute mal dass dein SCK Pin nur einmal high geht und nie weider low, daher wertest du imer nur das erste bit aus

PPS: wenn dir das mit den set und clr registern zu ungeheuer ist kannst du auch die normalen OUT register wie früher benutzen, kostet halt nur ein paar takte mehr zeit

Basti1204
28.10.2016, 16:55
Danke für die Tipps. Werde ich heute Abend gleich mal testen. :)