Forum: Mikrocontroller und Digitale Elektronik PIC16F628A RA2 Probleme!


von Hans (Gast)


Lesenswert?

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!

von Severino R. (severino)


Lesenswert?

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

von Hans (Gast)


Angehängte Dateien:

Lesenswert?

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
}

  

von Severino R. (severino)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

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!


von Severino R. (severino)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

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.

von Hans (Gast)


Lesenswert?

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!






von Peter D. (peda)


Lesenswert?

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

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

A1=RA0
A2=RA1
A3=RA2

Prüfe daraufhin mal Deine bisherigen Aussagen, Zeichnungen, Programme 
etc.

von Severino R. (severino)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

@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!

von holger (Gast)


Lesenswert?

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 ?

von Severino R. (severino)


Lesenswert?

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