PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC Probleme evtl. defekt?!



sector
22.09.2006, 11:20
Hallo, ich lese zwar schon länger interessiert mit, aber jetzt wurde es mal Zeit das ich mich anmelde. :-)

Ich bin gerade dabei meine ersten Schritte mit dem PIC zu machen, leider bin ich nicht weit gekommen :-(

Ich benutze einen PIC16F870, als Entwicklungsumgebung MPLAB IDE v7.40 und zum Brennen des Hex-Files PBrenner37U.

So quasi als "Hello World" wollte ich einfach mal ein paar Portpins auf 1 setzen.




#include<pic.h>
#include <pic1687x.h>

void main(void)
{
int i=1;
TRISC=0x00;
TRISB=0x00;
TRISA=0x00;



while(i>0)
{
PORTC=0x01;
PORTB=0x02;
PORTA=0x04;
}
}


So weit scheint auch alles gut. Ich brenns rein, keine Fehler. Aber wenn ich den PIC in Betrieb nehme, ist nur der RB7 "1", alle anderen Ausgänge sind "0". Ich weiß echt nicht mehr weiter, kann es sein das der PIC kaputt ist? Ich habe ausversehen den PIC einmal mit RC als Taktgeber in der config gebrannt, aber ich verwende einen Quartz. Irgendwo habe ich gelesen, daß die das nicht so mögen :-(

Hilfe...

kalledom
22.09.2006, 13:12
Hast Du PullUp-Widerstände an den Ausgangs-Pins ?
Die PIC-Ausgänge schalten (im Gegensatz zum AVR) an den Ausgangs-Pins nur den GND raus. Für High-Pegel mußt Du selber sorgen oder für Port B die internen PullUps enablen: bcf OPTION_REG,7

Mobius
22.09.2006, 16:39
Ähm, nö, das dürfte nicht das Problem. ^^
Einzig der RA4 (oder ein anderes Pin von PortA) besitzt einen Open Collector Ausgang (also, dass er nicht nach VCC ziehen kann), alle anderen Pins sind mit TTL-Pegeln und können sowohl nach 5V, wie auch nach GND ziehen. Was du meinst ist, wenn die Pins als Eingang definiert sind, nur dann sind die internen Pulluos aktiv.

Hum, was mir auf die Schnelle einfallen würde, ist, dass du vllt. den A/D-Wandler von den I/O-Pins nehmen solltest (RA0-RA5). Dazu schreibst du einfach 0x07 in den ADCON1. Ansonsten fällt mir eigentlich nichts auf dem Programm auf, das Probleme bereiten sollte.
Versuch mal die anderen Ports ebenfalls zu setzten und durchzutesten (vielleicht auf eine Frequenz auf der einen ausgeben, wenn du ein Osci hast). Leider bin ich in C, zumindest was ein PIC angeht nicht wirklich versiert, ich bevorzuge lieber Assembler :).

In C schaut das ca. so aus (XOR auf einen Pin, lässt diesen toggeln):

while(1)
{
PORTB^=0x01;
}

MfG
Mobius

€dit: Weißt du eigentlich mit sicherheit, ob der Quarz schwingt? WElche Frequenz hast du und wie viel pF? Oder hast du einen Oscillator dranhängen?

kalledom
22.09.2006, 20:25
Hallo Mobius,
Du hast Recht, ich habe da was durcheinander geschmissen; der High-Pegel für Ausgänge ist Vcc minus 0,7V. Auf meinen Platinen sind die PullUp-Widerstände aus einem anderen wichtigen Grund drauf: nach dem Einschalten bis zur Initialisierung und während Reset sind die I/O-Pins Eingänge mit ungewissem 'Ausgangs-Pegel'. Damit meine Ausgangs-Treiber keine 'Sauereien' machen können, bekommen sie so lange über die PullUps High-Pegel.

sector
23.09.2006, 10:55
Also, die Platine die ich verwende ist ein Projekt von unserer FH. Leider mit mehr als beschissener Dokumentation. Mein Projekt ist jetzt eine dafür zu erstellen ](*,) Da ist alles schon fertig drauf, ich muss mich jetzt ein bißchen durchwurschteln. Also der Takt wird über einen Ozillator generiert mit 20MHz.

Aber das wichtigste: Ich habs hinbekommen :-) Meine Vermutung ist, daß der Reset nicht richtig ausgeführt wird. Ist quasi Zufall, obs geht oder nicht....

Ich werds jetzt mal mit dem Brownout Reset probieren, vielleicht schafft das Abhilfe