Hallo,
Ich habe so meine Schwierigkeiten, mein erstes PSoC Programm zum Laufen
zu bringen. Anbei ist die Uebersicht und main.c.
Auf dem Display wird nur "CountNumber 0000" angezeigt, es tut sich aber
nichts.
Ausserdem:
void main(){} funktioniert nicht. Fehlermeldung: "return type of 'main'
is not 'int'
int main(){return 0;} dagegen schon.
Mein Ziel ist es, Daten von einem Encoder auf dem LCD display sichtbar
zu machen. Zuerst wollte ich anfangen nur Pulse bis 500 zu zaehlen,
spaeter wollte ich es mit Index erweitern, dann Rechts- Linkslauf
anzeigen und so weiter.
Als Startpunkt hatte ich mir das QuadDec Beispiel genommen, welches aber
aelter ist und bei mir nicht direct funktionierte.
Encoder ist eine ABI mit 500 pro Umdregung.
Hardware ist das VY8CKIT-050 mit eienem PSoC 5LP, was auch ein 2x16 Char
LCD dabei hat.
Ich hoffe, dass Ihr mir auf die Spruenge helfen koennt.
Mark
Mark W. schrieb: > Ich habe so meine Schwierigkeiten, mein erstes PSoC Programm zum Laufen > zu bringen. Anbei ist die Uebersicht und main.c. > Auf dem Display wird nur "CountNumber 0000" angezeigt, es tut sich aber > nichts. Eine mögliche Ursache dafür ist, dass diese Bedingung:
1 | if( ((qdCount % 500u) == 0u) && (qdCount > 0u) ) |
nie erfüllt wird. Das wäre zum Beispiel der Fall, wenn der Aufruf von QD_GetCounter() permanent eine Null zurückliefert. Dahinter könnte eine technische Ursache stecken. Sowas wie Encoder nicht richtig angeschlossen, Spannungsversorgung fehlt, Hardware defekt, etc. Bau mal zu dem vorhandenen if einen else-Pfad in Deinem Programm ein. In dem kannst Du zum Beispiel einfach "else" auf dem LCD ausgeben lassen. Wenn Du die Else dann siehst, grüß sie von mir und frag sie wo der Fehler liegt. Es hält Dich natürlich auch niemand davon ab, zum Debugging einfach den aktuellen Rückgabewert von QD_GetCounter() auf dem LCD auszugeben, unabhängig von irgendwelchen Bedingungen. Zum Beispiel indem Du das if auskommentierst. > Ausserdem: > void main(){} funktioniert nicht. Fehlermeldung: "return type of 'main' > is not 'int' > int main(){return 0;} dagegen schon. Das ist in C so. Die main() Funktion hat nun mal einen Rückgabewert, auch bei Embedded Software. Selbst wenn es nicht logisch erscheint, da main() wegen der Endlosschleife nie verlassen wird. Nicht wundern, nur staunen. ;-)
Hallo Mark, vielleicht hilft Dir ein Ausschnitt aus meinem Programm. Mein Encoder ist mit 8 Bit vereinbart, aber ohne Indexpin.
1 | //Variablen:
|
2 | int16 encoder=0; |
3 | int16 encoderOld=0; |
4 | int16 diff=0; |
5 | double step;//Frequenzschrittweite |
6 | char8 resultStr[18]; |
7 | |
8 | //Initialisierung:
|
9 | |
10 | QuadDec_1_Start() ; |
11 | QuadDec_1_SetCounter(0); |
12 | encoderOld=0; |
13 | |
14 | |
15 | //In der Hauptschleife des Programms:
|
16 | |
17 | |
18 | encoder=(int16)QuadDec_1_GetCounter(); |
19 | if(encoder!=encoderOld){ //Abfrage Dreh- Encoder |
20 | diff=encoder-encoderOld; |
21 | if(diff>100)diff=1; |
22 | if(diff<-100)diff=-1; |
23 | encoderOld=encoder; |
24 | if(diff != 0){ |
25 | if (Menu==1){ |
26 | if(diff==1) |
27 | step=10.0 * step; |
28 | else step=0.1 * step; |
29 | if(step>10.0) step=10.0; |
30 | if(step < 0.001) step=0.001; |
31 | LCD_Position(2,0); |
32 | sprintf(resultStr, "Step: %6.3f", step); |
33 | LCD_PrintString((char*)resultStr); |
34 | }
|
35 | }
|
Hallo Mark, Mark W. schrieb: > Als Startpunkt hatte ich mir das QuadDec Beispiel genommen, welches aber > aelter ist und bei mir nicht direct funktionierte. das Beispiel ist denkbar ungeeignet, weil es darin nicht um Anschluss eines Encoders geht;-) Da nimmst du besser den Beispielcode von Wolfgang. Mark W. schrieb: > Zuerst wollte ich anfangen nur Pulse bis 500 zu zaehlen mit
1 | if( ((qdCount % 500u) == 0u) && (qdCount > 0u) ) |
zählst du aber jeden 500sten Impuls und nicht 0..500. Mit:
1 | qdCount = QD_GetCounter() % 500 ; |
würdest du in Intervallen von 0..500 zählen. Allerdings ist dann dein Startwert nicht unbedingt bei 0 sondern ebenfalls bei
1 | Startwert % 500 |
Das kannst du natürlich berücksichtigen, indem du den Startwert setzt. Du setzt ihn im Moment auf 5. Falls du aber mit Grenzen min/max arbeiten willst, nimm besser die Variante von Wolfgang. Diese Konvertierung aus dem Beispiel brauchst du eigentlich gar nicht. Taste dich ran:
1 | ...
|
2 | for(;;) |
3 | {
|
4 | /* qdCount in Intervallen von 0...500
|
5 | */
|
6 | qdCount = QD_GetCounter() % 500; |
7 | |
8 | LCD_Position(0u, 12u); |
9 | LCD_PrintNumber(qdCount); |
10 | }
|
Nächsten Schritte könnten sein: - Speichern des letzten qdCount Wertes und Ausgabe nur bei Änderung - Direction aus aktuellem und letztem Wert Reiner
Hallo, vielen Dank fuer die Hinweise. Ich taste mich langsam ran. Ich hatte das Kit erst letzte Woche bekommen, und kannte den PSoC bisher garnicht. Werde dieses WE noch etwas weitermachen. Es koennte tatsaechlich etwas mit dem angeschlossenem Encoder zu tun haben, da ich ihn zwar mit 5V versorgt hatte, aber vergessen auf 5V umzuschalten. Ausserdem hatte ich die Drahtenden nur so in die Kontakte reingewuergt. Mark
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.
