Hallo Leute ich bin am Verzweifeln vielleicht könnt Ihr mir weiterhelfen? Ich habe eine einfache Schaltung aufgebaut und steuere über RS232-Befehle die Ausgänge eines PICs, an denen über einen Transistor ein Relai angesteuert wird. Das PIC-Programm (Welches in mikroC für PIC geschrieben wurde) habe ich auf einem EasyPic3 Evaluation Board getestet. Auf dem Board hat alles einwandfrei funktioniert und die LEDs (RA0,RA1,RA2), die mir einen HIGH-Pegel am Ausgang zeigen leuchteten wie sie sollten. Sobald ich aber den PIC aus dem Demobard nehme und in meine Schaltung einsetzte, funktionieren nur noch die Ports RA0 und RA3, RA1 reagiert überhaupt nicht. Eine Messung an diesem Ausgang ergab, dass keine 5V am Ausgang anliegen. Also lötete ich meine Schaltung um und benutzte anstelle von RA1 RA3 auch hier erhielt ich keine Reaktion auf meiner Schaltung! (Auf dem Demoboard lief wieder alles) Ich lötete die Schaltung nochmals um und benutzte RB3 und alles funktionierte einwandfrei so wie es sollte. Leider habe ich es bis heute nicht hinbekommen RA1 oder RA3 zum laufen zu bekommen. Ich schaute auch ins Datenblatt, ob ein Pull-Up Widerstand benötigt wird oder sonst was am RA1 besonderst ist. RA1 ist aber identisch zu RA0 und der funktioniert ja einwandfrei. Hat einer von Euch eine Erklärung für dieses Problem? Wenn ja lasst es mich wissen, ich bin jedenfalls am Verzweifeln. Vielen Dank für Eure Hilfe!
Kannst Du ein Schema Deiner Schaltung, den Sourcecode sowie ein Schema des EasyPic3 (oder ein Link dazu) posten? Vielleicht hilft das beim Suchen nach der Ursache. Severino
Kein Problem: Infos zum Board gibt es hier: http://www.mikroe.com/en/tools/easypic3/ Meinen Schaltplan habe ich schnell mal in Eagle gezeichnet. Siehe Anhang! Sorry ist nicht 100%ig gut geworden könnte man besser zeichnen! Aber man erkennt die komplette Schaltung! Noch die Programmier-Optionen zur Info: INTOSC RA6 as I/O WDT: Disabled PowerUpTimer: Disabled MC: Disabled - RA5 as I/O BOD: Disabled LVP: Disabled DEEPrtect: Disabled Hier das Programm (gekürzte Fassung):
1 | //Define:
|
2 | #define A1 PORTA.F0
|
3 | #define A2 PORTA.F1
|
4 | #define A3 PORTA.F2
|
5 | |
6 | //Funktionsprototypen
|
7 | void Startup(void); |
8 | |
9 | //Globale Variablen
|
10 | int Receive = 0; |
11 | |
12 | //Init-Routine:
|
13 | void Startup(void) |
14 | {
|
15 | PortA = 0; |
16 | CMCON = 0x07; |
17 | TRISA.F2 = 0; |
18 | TRISA.F1 = 0; |
19 | TRISA.F0 = 0; |
20 | |
21 | PortB = 0; |
22 | TRISB.F0 = 1; |
23 | TRISB.F1 = 1; |
24 | TRISB.F2 = 1; |
25 | TRISB.F3 = 1; |
26 | TRISB.F4 = 1; |
27 | TRISB.F5 = 1; |
28 | TRISB.F6 = 1; |
29 | TRISB.F7 = 1; |
30 | |
31 | Usart_Init(9600); |
32 | |
33 | A1 = 0; |
34 | A2 = 0; |
35 | A3 = 0; |
36 | }
|
37 | |
38 | //Main:
|
39 | |
40 | void main(void) |
41 | {
|
42 | Startup(); |
43 | |
44 | for(;;) |
45 | {
|
46 | Receive = Usart_Read(); |
47 | if (Receive > 0x00) |
48 | {
|
49 | if (Receive == 0x01) |
50 | {A1 = 1; A2 = 0; A3 = 0;} |
51 | else if (Receive == 0x02) |
52 | { A1 = 0; A2 = 1; A3 = 0;} |
53 | else if (Receive == 0x03) |
54 | {A1 = 0; A2 = 0; A3 = 1;} |
55 | else if (Receive == 0x04) |
56 | {A1 = 1; A2 = 1; A3 = 0;} |
57 | else if (Receive == 0x05) |
58 | {A1 = 0; A2 = 1; A3 = 1;} |
59 | else if (Receive > 0x05) |
60 | {A1 = 0; A2 = 0; A3 = 0;} |
61 | }
|
62 | }
|
63 | }
|
Leider macht MikroElektronika das Schema des EasyPic3 nicht im Web verfügbar, nur auf der CD. Aber im Manual ist auf Seite 13 ein Auszug aus dem Schema mit der Beschaltung der LEDs an PORTA. Auf den ersten Blick erstaunen mich die C11..13 in Deiner Schaltung. Hast Du mal versucht, darauf zu verzichten? Lass doch mal die externe Beschaltung von PORTA weg und miss mit einem Voltmeter oder Oszi oder Logic Probe. Und vielleicht mal einen Wert direkt in PORTA schreiben, statt bitweise: PortA = 0x02 oder so? Ist es richtig, PortA zu schreiben, aber PORTA.F0 (Grossbuchstaben)? Severino
Also die Cs habe ich auch schon weggelassen, an denen liegt es nicht. (Sonst würde es ja auch nie funktionieren! Bei mir klappte es ja wenn ich RB3 verwende!) Ich habe auch schon gemessen, wenn keine Ausenbeschaltung angeschlossen war. Auch hier messe ich keine 5V. Das mit den Groß und Kleinbuchstaben dürfte ok sein! Sonst würde ja der Compiler motzen. Außerdem wird hier nur kurz der Port gelöscht bevor er initialisiert wird. Dies dürfte ja nix ausmachen! Auch das Bit-Weise schreiben brachte keine Verbesserung!
Ich glaube, ich verzweifle mit Dir... ;-) Hast Du noch einen anderen PIC des gleichen Typs? Oder benutze halt RB3 Hast Du sicher keinen Kurzschluss mit anderen Pins? Wenn Du keine 5V misst, was misst Du dann? Sind es saubere 0V, also ein logisch 0, oder irgendetwas dazwischen, oder ein offener Anschluss? Severino
Hans wrote:
> Hier das Programm (gekürzte Fassung):
Das ist schön.
Aber hast Du diese gekürzte Fassung auch ausprobiert ?
Ansonsten ist es müßig, darüber zu diskutieren.
Die Kondis an den Portpins laß alle weg, hohe kapazitive Lasten mögen
MCs absolut garnicht.
Das sie dann spinnen, ist normal. Nen Ausgang zu killen ist damit auch
möglich.
Da fehlt ja auch der Quarz in der Schaltung. Ohne Quarz kann die UART ja
garnicht funktionieren.
Peter
Die C11 bis C13 sind tötlich ! Sie stellen eine Last für den Port da und führen zu dem falschen Schalten der Port-Pins. Siehe mal bei www.sprut.de nach den Fallen des PICs ! Ansonsten - hübsch aufwendig ! Die Eingänge an dem PortB sind Tasten ? Da gibt es integrierte Pull-Ups, damit man externe (hier Pull-downs) sparen kann. Und dann prüfe mal GANZ GENAU das Programm, ob die Definition von A1, A2 und A3 mit der Hardware zusammenpaßt.
Die gekürzte Fassung des Programms läuft! Ich habe alles andere rausgeschmissen um die Fehlerwahrscheinlichkeit einzuschränken. Das kein Quarz angeschlossen ist richtig, da ich den internen Oszilator vom PIC nehme (siehe Programmiereinstellungen: INTOSC RA6 as I/O) Die Eingänge überprüfen eine externe Schaltung die mir +12V liefert, daher der SPG-Teiler, an den Eingängen! Die Definitonen von A1, A2 und A3 stimmen. Was mich wahnsinnig macht, ist warum es auf dem Board funktioniert. Selbst wenn ich die komplette Außenbeschaltung weglasse, bekomme ich auf A1 oder auf A3 einfach keine 1 hin. Ich habe immer saubere 0V anliegen. Ich habe auch schon unterschiedliche PICs genommen bei allen hatte ich das gleiche Problem! Kann ein Bug im Compiler das Problem sein? Aber warum geht es dann auf dem Board? Ich stehe echt vor einem Rätsel!
Hans wrote: > Das kein Quarz angeschlossen ist richtig, da ich den internen Oszilator > vom PIC nehme (siehe Programmiereinstellungen: INTOSC RA6 as I/O) LOL > Was mich wahnsinnig macht, ist warum es auf dem Board funktioniert. Weil da vielleicht ein Quarz genommen wird ? Woher weiß überhaupt Deine UART, welche Taktfrequenz Du nimmst ? Peter
A1=RA0 A2=RA1 A3=RA2 Prüfe daraufhin mal Deine bisherigen Aussagen, Zeichnungen, Programme etc.
Versuche doch einfach mal so etwas (nicht getestet):
1 | void main(void) |
2 | {
|
3 | PORTA = 0; |
4 | CMCON = 0x07; |
5 | TRISA.F2 = 0; |
6 | TRISA.F1 = 0; |
7 | TRISA.F0 = 0; |
8 | |
9 | while(1) |
10 | {
|
11 | PORTA.F0 = 1; |
12 | PORTA.F1 = 1; |
13 | PORTA.F2 = 1; |
14 | PORTA.F0 = 0; |
15 | PORTA.F1 = 0; |
16 | PORTA.F2 = 0; |
17 | }
|
18 | }
|
Und dann schliesse nur VCC und GND am PIC an, fliegend oder über einen Sockel. So bleibt ja wirklich nichts mehr übrig, was stören könnte. Severino
@Peter: Der Taktet auf 4MHZ und auf dem Board wird ebenfalls kein Quarz verwendet! Man muss nicht bei jedem PIC einen Quarz verwender der PIC16F628 ist ein solcher der über einen internen OSZ verfügt! @Bernd: War ein Fehler von mir ich meinte nich A1 und A3 sondern RA1 und RA3 @Severino: Habe ich gemacht, ich habe ein einfaches Programm geschrieben mit dem ich die Ausgänge nur 1 Sek hin und her schalte. Dies funktioniert ohne Probleme. Das Problem liegt an der UART-Schnittstelle! Sobald ich diese Funktion mit aufnehme funktioniert die beiden Ports nicht mehr! Aber warum weis ich echt nicht, auf dem Demo-Board funktioniert es doch auch und wie diese beiden Ports mit der RS232-Schnittstelle zusammenhängen verstehe ich einfach nicht!
Haben die auf dem Board die beiden Komparatoren evtl. als Inverter für RS232 benutzt ? So könnte man sich den MAX232 sparen. Ist auf dem Board einer drauf ?
Hast Du den Source-Code zur USART-Library? Wenn ja, könntest Du den untersuchen, ob da irgend etwas mit dem PORTA geschieht. Oder den generierten Assemblercode studieren. Vielleicht hast Du einen ICD, dann könntest Du das Programm single-steppen. Vielleicht Deine Pins setzen, überprüfen, ob 5V dran sind. Dann den USART initialisieren, Pins wieder prüfen. Dann Usart_Read(), Pins wieder prüfen. Ohne ICD kannst Du ja jeweils eine Endlosschleife einfügen, um den Pegel zu messen, anschliessend die Schleife eine Anweisung später einfügen, compilieren etc. und wieder prüfen. Ziel ist es zu sehen, welche der beiden verwendeten USART Funktionen die Pins verändert. Severino
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.