Hallo, ich hab schon im Forum gesucht aber keinen passenden Eintrag gefunden. Ich hab einen NXP LPC 2294. Desweiteren habe ich einen Magnetsensor der seine Signal auf TTL-Basis zum Mikrocontoller schickt. In der Beschreibung steht, dass ich eine UART-Schnittstelle als TTL konfigurieren kann, aber irgendwie werde ich aus dem user Manuel von Phillips nicht schlau wie dieses gehen soll. Vielleicht weiß ja jemand von Euch wie es gehen soll. Als Programmierumgebung verwende ich uVersion 3 von Keil Software. MFG Hotte
Du verbindest den Sensor mit dem RxD-Eingang des Controllers. Eine Pegelwandlung ist dann erforderlich, wenn der Sensor 5V-TTL-Signale ausgibt, der Controller aber keine 5V-toleranten Eingänge hat. Zumindest andere Vertreter der LPC2xxx-Reihe haben die.
Danke für die schnelle Antwort. Aber dennoch habe ich es nicht ganz verstanden da mein Sensor ja eine Pinbelegung von: PIN 1 A PIN 2 \A PIN 3 B PIN 4 \B PIN 5 I PIN 6 \I PIN 7 +VDC PIN 8 0Vdc GND hat und ich irgendwie diese Signal von Mikrocontroller am RS232 auslesen muss. Soll ich nun Kanal A und B an Rxd-Eingang anschließe oder irgendwie anders? Mein Controller kann 5V vertragen.
Wenn das die Anschlussbelegung des Sensors ist, dann hat er nichts mit einer seriellen Schnittstelle zu tun. Was ist das für ein Sensor? Was genau steht in dessen Beschreibung?
Es handelt sich um einen Magnetsensor mit integrierter Auswertung. Inkremtenteller Magnetsensor mit zwei Rechteckimpulsen, Kanal A, Kanal B und ein Nullsignal. Die Ausgangssignale entsprechen dem Standart SSI (synchron serielles Interface)
> Die Ausgangssignale entsprechen dem Standart SSI > (synchron serielles Interface) Damit kann eine UART nichts anfangen.
Weiß den jemand, wie ich diese Signal bei einem LPc2294 auswerten kann?
@Hotte Meyer (marvinthevirus) >Es handelt sich um einen Magnetsensor mit integrierter Auswertung. >Inkremtenteller Magnetsensor mit zwei Rechteckimpulsen, Kanal A, Kanal B >und ein Nullsignal. Eben, ein Drehgeber. > Die Ausgangssignale entsprechen dem Standart SSI >(synchron serielles Interface) Glaub ih kaum. Dann müsste es noch weitere Signale geben. A, B und I sind nicht SSI! Poste mal die GENAUE Typenbezeichung und einen Link auf das Datenblatt. MFG Falk
Es handelt sich um einem Magnetsensor der Firma lika-electronic http://www.lika.it/deu/prodotti2.php?idprod=131&ID=4 auf dieser Seite befindet sich auch das Datenblatt.
Das ist ein normaler Drehimpulsgeber, den musst Du so auswerten, wie andere Drehimpulsgeber auch. Du musst die Signale A und B an jeweils einen Portpin führen und am besten in einem Timerinterrupt zyklisch abfragen. Durch die Änderung der Pegel kannst Du das Drehen und auch dessen Richtung erkennen. Mit welcher Drehzahl soll hier gearbeitet werden?
@Rufus t. Firefly (rufus) (Moderator)
>Das ist ein normaler Drehimpulsgeber,
Nicht ganz, es ist ein Linearsensor. Aber er arbeitet nach dem gleichen
Prinzi mit Quadraturausgang.
MFG
Falk
Besten Dank für Eure Antworten. Bis jetzt habt Ihr mir sehr geholfen. Der Sensor soll als Wegmesssensor eingesetz werden, um mir eine genaue Position meins Verfahrschlitten zu geben. Also habe ich das richtig verstanden: Kanal A, B und Nullkanal an irgendwelche freie I/O Pins legen und dann via Timerinterrupt einlesen. Da ich mich noch nicht so gut auskenne, wie mache ich das genau mit dem Timer. Hat jemand da ein kleines Beispiel öder ähnliches?
@Hotte Meyer (marvinthevirus) >Also habe ich das richtig verstanden: Kanal A, B und Nullkanal an >irgendwelche freie I/O Pins legen und dann via Timerinterrupt einlesen. >Da ich mich noch nicht so gut auskenne, wie mache ich das genau mit dem >Timer. Hat jemand da ein kleines Beispiel öder ähnliches? Wäre es im Rahmen des Möglichen, den Link auf den Artikel Drehgeber anzuclicken? MFG Falk
Hallo nochmal. Ich möchte nun meinen "Drehgeber" über external Eingänge auf meinen LPC schalten. Ich habe folgenden Code erstmal nur für einen Eingang geschrieben, doch ich kann ihn nicht compelieren und weiß auch nicht so recht woran es liegt! Code: #define VPBDIV_VAL = 0x02 /*Setze Hardwaretimer[Pclk] auf 30 Mhz */ __irq void eint0 (void) { ++zaehler; VICVectAddr = 2; // Acknowledge Interrupt } int main (void) { #define Eint0 = ( 1 << 1) /*VPBDIV muss(!!) man auf 0 gesetz werden bevor man ein(!) Register beschreiben kann*/ VPBDIV=0; // Hardwaretimer auf Null setzen EXTMODE = (1<<3); //Register kontrolliert falls VPBDIV=VPBDIV_VAL; // Hardwaretimer wird auf 30 Mhz gesetzt VPBDIV=0; // Hardwaretimer auf Null setzen // Register kontrolliert welcher Pin eine Flanke auslöst EXTPOLAR = (1<<3); //steigende Flanke VPBDIV=VPBDIV_VAL;// Hardwaretimer wird auf 30 Mhz gesetzt //Bestimmt welcher der Interrupt als fast interupt(FIQ) = 1 // oder niederwertige Interrupt (IRQ) =0 VICIntSelect &= ~( 1 << Eint0 ); VICIntEnable = ( 1 << Eint0 );//Aktiviert Interrupt Eingänge VICVectCntl2 = (0x20 | 0x4000) ;// ein Register per Interrupt VICVectAddr2 = (unsigned)eint0; //Vector wird Slot 2 zugewiesen } Error habe ich bei den Zeilen mit VPBDIV_VAL [error:#29:expected an expression] und die gleiche Fehlermeldung in Zeile VICIntEnable. Gebe ich in der Zeile das ganze in hex an 0x4000 ist alles in Ordnung, aber es müsste doch auch mit den schiffen gehen. Wenn jemand im Code weitere Fehler findet wäre es nett es zu erwähnen. Dankeschön soh mal im voraus!
> #define VPBDIV_VAL = 0x02 Das ist das Problem. Was hat da das Gleichheitszeichen verloren? > #define Eint0 = ( 1 << 1) Das ist aus demselben Grund Quark. Bist Du Dir sicher, daß Du Eint0 so definieren willst? Sieh Dir mal Deinen Code an, der das nutzt. Soll das so sein? Im übrigen ist es schlechter Programmierstil, #defines innerhalb einer Funktion zu definieren. Dein hier geposteter Code wird lesbarer, wenn Du ihn in [ c ] / [ / c ] einschließt (ohne Leerzeichen). Und wenn man ihn noch anständig formatiert, dann kommt sowas dabei raus:
1 | #define VPBDIV_VAL = 0x02 /*Setze Hardwaretimer[Pclk] auf 30 Mhz */ |
2 | #define Eint0 = ( 1 << 1)
|
3 | |
4 | __irq void eint0 (void) |
5 | {
|
6 | ++zaehler; |
7 | VICVectAddr = 2; // Acknowledge Interrupt |
8 | }
|
9 | |
10 | int main (void) |
11 | {
|
12 | /*VPBDIV muss(!!) man auf 0 gesetz werden bevor man ein(!) Register
|
13 | beschreiben kann*/
|
14 | |
15 | VPBDIV = 0; // Hardwaretimer auf Null setzen |
16 | EXTMODE = (1<<3); //Register kontrolliert falls |
17 | VPBDIV = VPBDIV_VAL; // Hardwaretimer wird auf 30 Mhz gesetzt |
18 | VPBDIV = 0; // Hardwaretimer auf Null setzen |
19 | |
20 | // Register kontrolliert welcher Pin eine Flanke auslöst
|
21 | EXTPOLAR = (1<<3); //steigende Flanke |
22 | VPBDIV = VPBDIV_VAL; // Hardwaretimer wird auf 30 Mhz gesetzt |
23 | |
24 | //Bestimmt welcher der Interrupt als fast interupt(FIQ) = 1
|
25 | // oder niederwertige Interrupt (IRQ) =0
|
26 | VICIntSelect &= ~(1 << Eint0); |
27 | |
28 | VICIntEnable = (1 << Eint0); //Aktiviert Interrupt Eingänge |
29 | VICVectCntl2 = (0x20 | 0x4000); // ein Register per Interrupt |
30 | VICVectAddr2 = (unsigned)eint0; //Vector wird Slot 2 zugewiesen |
31 | }
|
Ich steh im Moment auf dem Schlauch, ich hoffe es kann mir jemand helfen. Ich möchte am EINT0 an Port 16 beim LPC durch anlegen einer Spannung, also eine positive Flanke, erzeugen. Dieses soll fünf mal nacheinander geschehen und die LED Port 8 soll angehen. Aber irgendwie läuft nichts. Kann mir jemand sagen wo mein Gedankenfehler liegt? Hier noch mal mein geänderter Code: @ Rufus t. Firefly Diesmal auch richtig gepostet;-)
1 | int zaehler = 0; |
2 | #define VPBDIV_VAL 0x02
|
3 | |
4 | __irq void eint0 (void) { |
5 | ++zaehler; |
6 | T0IR = 1; |
7 | VICVectAddr = 2; |
8 | }
|
9 | void init_extern(void) |
10 | {
|
11 | /*VPBDIV muss(!!) man auf 0 gesetz werden bevor man ein(!) Register
|
12 | beschreiben kann*/
|
13 | // Hardwaretimer auf Null setzen
|
14 | VPBDIV=0; |
15 | //Register kontrolliert falls
|
16 | EXTMODE = (1<<3); |
17 | // Hardwaretimer wird auf 30 Mhz gesetzt
|
18 | VPBDIV=VPBDIV_VAL; |
19 | // Hardwaretimer auf Null setzen
|
20 | VPBDIV=0; |
21 | // Register kontrolliert welcher Pin eine Flanke auslöst
|
22 | EXTPOLAR = (1<<3); //steigende Flanke |
23 | // Hardwaretimer wird auf 30 Mhz gesetzt
|
24 | VPBDIV=VPBDIV_VAL; |
25 | //Bestimmt welcher der Interrupt als fast interupt(FIQ) = 1
|
26 | // oder niederwertige Interrupt (IRQ) =0
|
27 | VICIntSelect = ( 0x4000 ); |
28 | //Aktiviert Interrupt Eingänge
|
29 | VICIntEnable = ( 0x4000 ); |
30 | // ein Register per Interrupt
|
31 | VICVectCntl2 = (0x20 | 0x4000) ; |
32 | //Vector wird Slot 2 zugewiesen
|
33 | VICVectAddr2 = (unsigned)eint0; |
34 | }
|
35 | /******** Hauptprogramm **********/
|
36 | int main (void) |
37 | {
|
38 | PINSEL1 = (PINSEL1 & ~(3 << 0)) | (1 << 1); //Ausgang 16 auf EINTO setzen |
39 | IODIR0 = 0x00000100; |
40 | init_extern(); |
41 | /*Programm in einer Endlosschleife*/
|
42 | while (1) |
43 | {
|
44 | if (zaehler >= 5) |
45 | {
|
46 | IOCLR0 = 0x00000100; |
47 | }
|
48 | else
|
49 | IOSET0 = 0x00000100; |
50 | }
|
51 | }
|
@Hotte, hast DU sichergestellt, dass der Port vorher auf low war, z.B. durch einen 10k Pull Down? Sonst gibts keine Flanke, wenn der floated dann weiss man nicht so recht wohin. Robert
So habe den Eingang jetzt mit einem Pulldown Widerstand verdrahtet. Du meinst doch so eine Verdrahtung, oder? Drehgeber | | pos. Flanke | | --------------Eingang MC | | R1 10k[Pulldown] | GND Aber es funktioniert immer noch nicht!!!! Ist denn ansonsten mein Code richtig, oder ist dort auch noch ein Fehler drin. Bin mir nicht ganz sicher!
Habe gerade festgestellt, das im startup_code dieses hier steht:
1 | UND_Stack_Size EQU 0x00000000 |
2 | SVC_Stack_Size EQU 0x00000020 |
3 | ABT_Stack_Size EQU 0x00000000 |
4 | FIQ_Stack_Size EQU 0x00000000 |
5 | IRQ_Stack_Size EQU 0x00000080 |
6 | USR_Stack_Size EQU 0x00000400 |
Auf welche vernunftige Werte soll ich denn FIQ_Stack einstellen damit mein Programm läuft. Davon habe ich nämlich keine Ahnung!
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.