Moin Elite,
ich habe eine char Variable und möchte jeweils prüfen, ob die einzelnen
Bits '1' oder '0' sind. Dabei soll für eine bestimmte Dauer ein Ausgang
auf High oder Low geschaltet werden. Das ganze läuft innerhalb der ISR
ab. Das Problem welches ich habe ist, dass der char irgendwie falsch
herum ausgelesen wird, obwohl das eigentlich nicht sein kann. Hier mal
mein Code.
1
2
staticunsignedcharTMR0_Overflow=0;// Zählt die Überlaufe von TMR0
3
staticunsignedcharindex=128;// Dient zur Ausgabe von Data
4
staticunsignedcharData=0xAA;// 10101010
5
staticunsignedcharT=100;// Mid-Bit Time T (Period Time = 2*T)
6
// Der Abschnitt aus der ISR
7
TMR0_Overflow++;
8
if(TMR0_Overflow==T){
9
if(Data&index){
10
LATC=0x01;
11
}else{
12
LATC=0x00;
13
}
14
15
index/=2;
16
TMR0_Overflow=0;
17
if(index==0){
18
index=128;
19
}
20
}
Alles was vor diesem Abschnitt ausgeführt werden soll passt soweit, blos
hier wird nicht wie erwartet die 10101010 sondern komischer weise
010101010 ausgegeben :(
Das habe ich mit einem Oszilloskop gemessen. Hat jemand nen Schimmer
warum das so ist?
Beste Grüße
Riebers
Vielleicht hat die Leitung einen Pull up aktiviert, und/oder Du
interpretierst den Anfang falsch? sende doch mal 01101111 und zum
Vergleich 10010000 - wie sieht es da aus?
@Riebers (Gast)
>ich habe eine char Variable und möchte jeweils prüfen, ob die einzelnen>Bits '1' oder '0' sind.
Siehe Bitmanipulation.
>static unsigned char index = 128; // Dient zur Ausgabe von Data
Bei sowas schreibt man das besser binär (wenn es der Compiler kann, denn
das ist kein Standard-C) oder in Hexadezimal. Das ist besser lesbar.
> index /=2;
Hier macht man besser eine Schiebeoperation, auch wenn die meisten
Compiler das automatisch machen.
>Alles was vor diesem Abschnitt ausgeführt werden soll passt soweit, blos>hier wird nicht wie erwartet die 10101010 sondern komischer weise>010101010 ausgegeben :(
Das ist doch das Gleiche, wenn es aneinandergereiht ist. Den Unterschied
sieht man nur, wenn es einmalig ausgegeben wird.
Riebers schrieb:> static unsigned char TMR0_Overflow = 0; // Zählt die Überlaufe von TMR0
Meckert der Compiler nicht, wenn du einen int einem char zuweisen
willst?
=> '0' usw.
@Falk Brunner
Ich habe auch Versucht das als Schieberegister zu machen, hat aber auch
nicht geklappt. Ich gebe vorher eine definierte Bitfolge aus. Das ganze
dient zum Daten versenden. Es beginnt mit einem Startbit, dann eine
Bitfolge für die Synchronisation des Empängers, dann eine kurze Pause
damit der Empänger sich Synchronisieren kann. Dann sollen Nutzdaten
geschickt werden. Jedoch, wie schon erwähnt, ist der ganze Byte um eins
nach rechts Verschoben. Habe es schon mit 11111111 versucht. Es kommt
aber nur 7 mal die '1' an. Dafür vor dem Byte noch eine '0'.
Ich Versuche nochmal das als Register zu programmieren TT .
Danke soweit
Riebers
Ich habe das mal für den Vergleich Bitweise geschoben. Ist aber immer
noch der gleiche Fehler. Oder liegt das an was anderem?! Hier mal der
Code falls jemanden was auffällt.
1
voidTMR0_ISR(void)
2
{
3
staticunsignedcharstep_counter=0;
4
staticunsignedintData=0xFF;// 10101010
5
staticunsignedcharT=100;// Mid-Bit Time T (Period Time = 2*T)
// Data Transmission----------------------------------------------------
47
case3:
48
TMR0_Overflow++;
49
if(TMR0_Overflow==T){
50
if(Data&index){
51
LATC=0x01;
52
}else{
53
LATC=0x00;
54
}
55
56
index>>=1;
57
TMR0_Overflow=0;
58
if(index==0){
59
index=0x80;
60
StartBit=4;
61
}
62
}
63
64
break;
65
// Guard Time (2*T) -- Data Transmission complete-----------------------
66
case4:
67
TMR0_Overflow++;
68
LATC=0x00;
69
if(TMR0_Overflow==2*T){
70
StartBit=0;
71
TMR0_Overflow=0;
72
}
73
break;
74
75
}
76
}
@Lutz nee, kommt das Gleiche raus, egal ob ich int oder char nehme...
Die Waittime und Guardtime passen. Habe ich schon überprüft. Irgendwas
passt bei der Datenübertragung nicht, ich komme aber nicht drauf.
Beste Grüße
Riebers schrieb:> case 0:> if(TMR0_Overflow==10) {> LATC^=0x01;> TMR0_Overflow=0;> StartBit=1;> }> case 1:> if(TMR0_Overflow==T) {> LATC^=0x01;> TMR0_Overflow=0;> step_counter+=1;> }
In den beiden Case Blöcken für die Werte 0 und 1 wird LATC auf 0
gesetzt, wenn TMR0_Overflow groß genug geworden ist... Ist das evtl. für
die führende "0" Verantwortlich?
Machs nicht zu kompliziert.
Riebers schrieb:> Ich habe auch Versucht das als Schieberegister zu machen, hat aber auch> nicht geklappt.
Sähe dann so aus:
1
staticunsignedcharTMR0_Overflow=0;// Zählt die Überlaufe von TMR0
2
staticunsignedcharData=0xAA;// 10101010
3
staticunsignedcharT=100;// Mid-Bit Time T (Period Time = 2*T)
4
5
// Der Abschnitt aus der ISR
6
TMR0_Overflow++;
7
if(TMR0_Overflow==T){
8
LATC=(Data&0x80)?0x01:0x00;
9
Data<<=1;
10
TMR0_Overflow=0;
11
}
Zu beachten ist halt, dass Data durch die Schiebeoperationen während der
Ausgabe verändert wird und hinterher 0x00 ist.
Ich schlage vor, dass Du, falls Du ein Zwei-Kanal-Oszilloskop hast,
während des ersten Bits der Daten eine 1 ausgibst. Dann siehst Du
eindeutig die Zuordnung.
Theor schrieb:
Sorry. Sollte besser heissen:
Ich schlage vor, dass Du, falls Du ein Zwei-Kanal-Oszilloskop hast,
während des ersten Bits der Daten auf einem zusätzlichen Portpin eine
1 ausgibst. Dann siehst Du eindeutig die zeitliche Zuordnung.
hallo,
das gelaber hier erscheint mir nutzlos, wenn der to es nicht schaft den
uc zu benennen und die port config transparent zu machen. weil, einige
uc kennen port invertierung oder toggle mode oder ...
mt
Falk B. schrieb:>>static unsigned char index = 128; // Dient zur Ausgabe von Data>> Bei sowas schreibt man das besser binär (wenn es der Compiler kann, denn> das ist kein Standard-C) oder in Hexadezimal. Das ist besser lesbar.
Noch besser finde ich:
1
staticunsignedcharindex=1<<7;
>> index /=2;>> Hier macht man besser eine Schiebeoperation, auch wenn die meisten> Compiler das automatisch machen.
Was er draus macht, sollte man dem Compiler überlassen. Wesentlich ist,
welche Aktion man beabsichtigt. Aus Gründen besserer Lesbarkeit sollte
man die dann auch hinschreiben. Also ist der Inhalt der Variablen eher
eine Zahl, die ich durch zwei dividieren will, oder eine Reihe von Bits,
die ich um ein Bit nach rechts schieben will? Hier ist es ganz
offensichtlich letzteres.