Forum: Mikrocontroller und Digitale Elektronik PSoC - QuadDec auf LCD


von Mark W. (kram) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

von Mark B. (markbrandis)


Lesenswert?

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. ;-)

von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Lesenswert?

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
      }

von Reiner W. (reiner_w)


Lesenswert?

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

von Mark W. (kram) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.