PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pic18f8722... warum blinkt die led nicht?



mamba
04.07.2007, 19:05
hallo leute,
ich bin der absolute pic noob und versuche gerade den einstieg.

weiss jemand warum der ausgang bzw die led nicht blinkt?




#include <p18f8722.h>
#include "delays.h"

#pragma config WDT = OFF // ON|OFF watchdog timer
#pragma config LVP = OFF // ON|OFF low voltage programming
#pragma config MCLRE = OFF // ON|OFF external reset
#pragma config OSC = INTIO67 // LP|XT|HS|RC|EC|ECIO6|HSPLL|RCIO6|INTIO67|INTIO7


void ConfigOSC(void)
{
OSCCON &= !0x70;
//set bits
OSCCON |= 0x70; // internal oscillator freq 8MHz
//OSCCON |= 0x60; // internal oscillator freq 4MHz
//OSCCON |= 0x50; // internal oscillator freq 2MHz
//OSCCON |= 0x40; // internal oscillator freq 1MHz (default after reset)
//OSCCON |= 0x30; // internal oscillator freq 500kHz
//OSCCON |= 0x20; // internal oscillator freq 250kHz
//OSCCON |= 0x10; // internal oscillator freq 125kHz
//OSCCON |= 0x00; // internal oscillator freq 31kHz
// Set PLL
OSCTUNE |= 0b01000000; // set PLLEN bit (FREQ * 4) (only for 8MHz or 4MHz)
}



void main(void)
{
ConfigOSC;

LATB = 0x00;
TRISB = 0xFE;

while(1)
{
LATB = 1;
Delay10KTCYx(250);
LATB = 0;
Delay10KTCYx(250);
}
}




gruss, marc

frank85
07.07.2007, 20:04
Hallo. Ich bin selber noch Anfänger und versuch mich damit herum zu schlagen. Programmier aber erst Assembler und kann deshalb nicht richtig denn code lesen denn du da geschrieben hast. Ich glaube es liegt aber an dem LATB. Soweit ich weis ist das ein Register in dem man den Zustand der PORTs auslesen kann. Deshalb bringt dir dieser Befehl in deinem Code nichts. Du musst den Befehl PORTB benutzen. Wenn es nichts bringt dann ist vielleicht etwas an deinem Code falsch. Du kannst aber jede menge im Datenblatt deines PICs herausfinden: http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en010327

Hoffe habe dir geholfen.

Gruß frank

theborg
07.07.2007, 22:53
hm selber programier ich auch nur in ASM aber ich glaube es mus LATB,x = y heissen

PICture
07.07.2007, 23:30
Hallo mamba!

Ich kenne C auch nicht, aber es müsste anstatt LATB, PortB sein. Laut TRISB die LED ist an B0 angeschlossen.

MfG

PICture
07.07.2007, 23:31
Hallo mamba!

Ich kenne C auch nicht, aber es müsste anstatt LATB, PORTB sein. Laut TRISB die LED ist an B0 angeschlossen.

MfG

theodrin
09.07.2007, 19:17
Hallo Marc!

Also damit hab ich mich auch mal rumgeschlagen. Aber ich versuchs mal ziemlich einfach zu machen.

Das
#pragma config OSC = INTIO67 // LP|XT|HS|RC|EC|ECIO6|HSPLL|RCIO6|INTIO67|INTIO7
kenn ich nicht. ich würd ganz einfach schreiben, wenn du den internen Oszillator verwenden willst:
#pragma config FOSC = INTOSC_XT

Dann kannst du das ganze mit den ConfigOSC rausgeben.
Also weg mit ConfigOSC im ProgrammCode.

Dann musst du noch vor void main(void) #pragma code einfügen. Damit beginnt dann der Code.
Und das LATB=0x00 passt schon, damit setzt du nur den Ausgang mal auf 0, find ich zwar komisch weil du erst später den Ausgang deklarierst aber das macht nix. Du kannst auch schreiben LATB=0; Und das TRISB ist dazu da, dass du den PortB als Ausgang setzt. Aber da kannst du ganz einfach schreiben TRISB=0; bei =1 hättest du das ganze Register zu nem Eingang gemacht. So das sollte mal reichen. Damit sollte deine LED blinken.

würd mich über ne freudige Meldung freuen! :-)

lg,
Norbert

michas_rob
09.07.2007, 19:30
Hallo mamba,

ich hab mir deinen Code mal angeschaut, ich programmier zwar nur Pic 16Fx, aber über das Register LATB kannst du nur den Zustand abfragen, aber nicht den Zustand ändern. Den Zustand kannst du nur über das Portx Register. Also zum Beispiel:
PORTB = 0x03; --> der Ausgang 2 am PortB gibt ein High Signal aus
RB2 = 1; --> hat die selbe Bedeutung

Jedoch ist es wichtig, was du eh richtig gemacht hast, dass du den gewünschten Ausgang als Input oder Output definierst.

Viel Erfolg..

lg michael

theodrin
09.07.2007, 19:35
Also Michael!

Ich weiß nicht genau, aber ich denke es ist genau umgekehrt. Über PORTB fragst du ab, und über LATB schreibst du was raus.

lg
Norbert

michas_rob
09.07.2007, 20:30
Hallo Norbert,

Jetzt bin ich erstaunt, kann man mit beiden Registern den Ausgangswert ändern???

Ich hab bis jetzt immer mittels PORTx Register den Ausgangswert geändert und mittels LATx den Zustand abgefragt.

Ich hab gerade einen relativ neuen PIC, den 16F884 und der besitzt gar kein LATx Register mehr, jedoch mein alten jedoch schon...

Gibt es dieses Register nicht mehr???

@mamba:
Was natürlich auch noch sein kann ist, dass es zu schnell blinkt, hast du schon mit einem Oszi nach gemessen.
Denn meine ersten Probleme waren immer die Zeitschleifen und ihre Verzögerungen....

lg michael

Felixx87
09.07.2007, 21:14
Hi

ich weiß net aber müsste hier net noch ne leere klammer rein?

void main(void)
{
ConfigOSC; <<---- ConfigOSC(); (??)