Iedere PIC heeft een interne oscillator, waarop je een kristal, resonator, of r/c combinatie op kunt aansluiten...
Dat het kristal te langzaam kan zijn voor sommige applicaties, is wat anders als 'kristal gaat niet werken op een 16f870'...

Met verkeerde been uit bed gestapt?

Ik doelde er alleen op dat het niet zinnig zou gaan werken, en dus praktisch onbruikbaar. Iets wat praktisch onbruikbaar is kan je ook omschrijven als onwerkbaar. Onwerkbaar is iets waar je niet mee kan werken.

Iedere PIC heeft een interne oscillator

Is dus niet zo.

waarop je een kristal, resonator, of r/c combinatie op kunt aansluiten...

Een kristal sluit je niet aan op de interne oscilator maar op een kristal versterker schakeling die ook in de pic zit.

Sorry, maar het is een oscillatorschakeling (handjevol inverters), maar het is idd verwarrend om te zeggen dat elke PIC een interne oscillator heeft, dat is niet zo.

OK,

Interne oscillatorschakeling dan...

okee ik kan hier uit concluderen dat ik beter geen PIC 16F870 ken hebben. best stom eigenlijk want ik zat het nog eens na te lezen en ik zie inderdaad geen int.osc

welke is dan de beste oplossing volgens jullie?
- 28 dip pins
- Usart
- timers 8/16bit = 2/1

ik zit zo eens te kijken maar ik zie weining 28 dip pins met een int. osc van de 16Fxxxx serie

MVG Sjors;)

(jullie hadden het erover dat me programma nu op 4Mhz werkt. dat vind ik eigenlijk te weinig dus wil verhogen naar 20Mhz, maar Benleentje jij had het erover dat ik dan sommige waardes moest veranderen. nou is mijn vraag welke eigenlijk?? hij wordt toch alleen maar nauwkeuriger)

16F882/883/886...
4 of 20MHz kan allebei prima. Als het alleen een klok is, maakt het weinig uit.

oke stel ik laat hem gewoon op 4Mhz maar ik wil die 32.768 gebruiken voor me klok, kan dat dan gewoon??
dus hij draait op 4Mhz maar ik gebruik een kristal van 32.768 voor me klok?

(kan de PIC16F886 we worden geprogrammeer door de Wisp?:P)

[Bericht gewijzigd door sjors007 op (15%)]

Het kan wel, een extra kristal aan de timer1 oscillator, maar waarom zou je twee kristallen willen gebruiken?
De enige zinvolle reden die ik kan bedenken is bij gebruik op een batterij. (stroombeparing)

oke dus dat heeft geen nut:P dan regel ik gewoon een 20Mhz kristal, dit zorgt er hopelijk voor dat me klok beetje goed gaat lopen
als ik dit goed aan de praat krijg wil ik eventueel een RTC en MAX7219 gebruiken.

ik was net me vorige post nog aan het veranderen toen jij al antwoord gaf:P maar kan de 16F886 wel door de wisp geprogrammeert worden?

MVG Sjors;)

Volgens deze lijst wel: http://www.voti.nl/wisp648/
Waarom wil je trouwens een PIC met een interne RC oscillator, terwijl je die niet gebruikt? (Als je een kristal gebruikt, kun je iedere willekeurige PIC gebruiken...)

ik wil een kristal gebruiken! dus ja eigenlijk heb ik geen interne RC oscillator nodig. dan is het probleem over en kan ik gewoon de PIC16F870 gebruiken:D

MVg Sjors

Als je een PIC gebruikt met interne RC oscillator heb je voor normale programma's geen kristal nodig. Echter voor een klok werk dit niet zo goed omdat de RC oscillator niet nauwkeurig genoeg is.

Een kristal is dat wel dus zou je bij deze PIC een LP 32kHz kristal kunnen aansluiten.

Je kan ook de interne RC oscillator uitschakelen en er een kristal op aansluiten of een PIC nemen zonder interne RC oscillator.

4Mhz of 20MHz maakt helemaal niets uit. Ik zou gewoon de 4MHz nemen dan hoeft er niets meer te worden aangepast aan het programma.

oke ik begrijp het even niet:P

ik heb nu een pic16F870 + 20Mhz kristal besteld. nu is mijn vraag kan dat gewoon of niet?
ik sluit me kristal op me pic aan en zet in de code:


xtal 20

zou dit dan werken en me klok redelijk laten lopen??
mvg sjors;)

Ja het werkt wel alleen loopt je klok nu 5x sneller. Je moet dit n je programma aanpassen omdat ik ben uitgegaan van een 4MHz klok. Als je zover bent post dan even het complete programma.

heb me spullen besteld dus en ben bijna klaar met maken van me code dus zal daarna even posten

edit
ik moet nog een andere device en fuses instellen maar voor de rest lijkt ie me goed.

DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL true

;Logische constanten
SYMBOL off         = 0
SYMBOL AAN         = 0
SYMBOL UIT         = 1
SYMBOL ON          = 1
SYMBOL Tijd        = 2000

SYMBOL Schakelaar1 = PORT.???
SYMBOL Schakelaar2 = PORT.???

DIM Sec1           AS BYTE
DIM Sec2           AS BYTE
DIM Min1           AS BYTE
DIM Min2           AS BYTE
DIM Uur1           AS BYTE
DIM Uur2           AS BYTE 
DIM DigitTeller    AS BYTE
DIM DisplayOutput  AS BYTE
DIM Cijfers        AS BYTE
DIM Klok           AS BYTE
DIM TerugTijd      AS BYTE
DIM IntTeller      AS WORD

IF Cijfers >= 10 THEN Cijfers = 0
SELECT Cijfers
;Segment   abcdefg.
;PoortB    76543210      
CASE 0 
Cijfers = %00000011
CASE 1
Cijfers = %10011111
CASE 2
Cijfers = %00100101
CASE 3
Cijfers = %00001101
CASE 4
Cijfers = %10011001
CASE 5
Cijfers = %01001001
CASE 6
Cijfers = %01000001
CASE 7
Cijfers = %00011111
CASE 8
Cijfers = %00000001
CASE 9
Cijfers = %00001001
END SELECT

IF Klok >=7 THEN Klok = 1
SELECT Klok
;PoortA 76543210
CASE 1
Klok = %11111110
CASE 2
Klok = %11111101
CASE 3
Klok = %11111011
CASE 4
Klok = %11110111
CASE 5
Klok = %11101111
CASE 6
Klok = %11011111
END SELECT

SYMBOL GIE      = INTCON.7 
SYMBOL PEIE     = INTCON.6
SYMBOL TMR2IF   = PIR1.1
SYMBOL TMR2IE   = PIE1.1
SYMBOL TMR2ON   = T2CON.2

On_Hardware_Interrupt GOTO ISR
GOTO HoofdProgramma

ISR:

TMR2IF = 0
PORTA = 0
PORTB = 0
PORTA = Klok[DigitTeller]                ;Dit selecteert dus een hele digit van het display wat om dat moment geactiveerd word.
PORTB = Cijfers[DisplayOutput]
INC IntTeller                                   
INC DigitTeller
CONTEXT RESTORE


;        76543210 
PORTA = %00000000                       ;Eerst alle PORTA uitgang registers uit (laag maken)
PORTB = %00000000
TRISA = %11100001                       ;Alle PORTB poorten zijn uitgangen, behalve PORTB.0
TRISB = %11110000

PORTB_PULLUPS ON

Sec1 = 0 : Sec2 = 0
Min1 = 0 : Min2 = 0
Uur1 = 0 : Uur2 = 0


T2CON = %00000111                       ; Postscaler 1:1, Prescaler 1:16
PR2 = 124                               ; 124 ticks geeft 2 millisec / int.
TMR2IE = 1 : PEIE = 1 : GIE = 1         ; Enable interrupts
TMR2ON = 1                                  



HoofdProgramma:

WHILE 1 = 1
IF IntTeller >= 500 THEN
INC Sec1
IntTeller = 0
ENDIF
IF Sec1 >=10 THEN
INC Sec2 
Sec1 = 0
ENDIF
IF Sec2 = 6 THEN
INC Min1
Sec2 = 0
ENDIF
IF Min1 >=10 THEN
INC Min2 
Min1 = 0
ENDIF
IF Min2 >=6 THEN
INC Uur1
Min2 = 0
ENDIF
IF Uur1 >=10 THEN
INC Uur2
Uur1 = 0
ENDIF
IF Uur2 = 2 AND Uur1 = 4 THEN
CLEAR Uur1 
CLEAR Uur2
CLEAR Min1
CLEAR Min2
CLEAR Sec1
CLEAR Sec2
ENDIF 

IF DigitTeller >=6 THEN DigitTeller = 0
SELECT DigitTeller
CASE 0 
DisplayOutput = Sec1
CASE 1
DisplayOutput = Sec2
CASE 2
DisplayOutput = Min1
CASE 3
DisplayOutput = Min2
CASE 4
DisplayOutput = Uur1
CASE 5
DisplayOutput = Uur2
END SELECT

IF Schakelaar1 OR Schakelaar2 = AAN THEN GOSUB KlokWijzigen
WEND
END

KlokWijzigen:

TerugTijd = 0
WHILE Schakelaar1 OR Schakelaar2 = AAN : WEND
WHILE 1 = 1
INC TerugTijd
IF Schakelaar1 = AAN THEN
INC Min1
ENDIF
IF Min1 >=10 THEN
INC Min2
Min1 = 0
ENDIF
IF Min2 >=6 THEN Sec2 = 0

IF Schakelaar2 = AAN THEN
INC Uur1
ENDIF
IF Uur1 >= 10 THEN 
INC Uur2
Uur1 = 0
ENDIF
IF Uur2 >=2 AND Uur1 >=4 THEN
CLEAR Uur2
CLEAR Uur1
CLEAR Min2
CLEAR Min1
CLEAR Sec2
CLEAR Sec1
ENDIF
IF Schakelaar1 OR Schakelaar2 = AAN THEN CLEAR TerugTijd
IF TerugTijd = Tijd THEN RETURN
WEND

[Bericht gewijzigd door sjors007 op (95%)]


IF Cijfers >= 10 THEN Cijfers = 0
SELECT Cijfers
;Segment   abcdefg.
;PoortB    76543210      
CASE 0 
Cijfers = %00000011
CASE 1
Cijfers = %10011111
CASE 2
Cijfers = %00100101
CASE 3
Cijfers = %00001101
CASE 4
Cijfers = %10011001
CASE 5
Cijfers = %01001001
CASE 6
Cijfers = %01000001
CASE 7
Cijfers = %00011111
CASE 8
Cijfers = %00000001
CASE 9
Cijfers = %00001001
END SELECT

Deze code wordt maar 1x uitgevoerd bij opstarten...
Normaal wordt altijd bit 0 voor segment a gebruikt. (maar voor de werking maakt dat natuurlijk niet uit...)

oke deze moet ik dus even in de main loop zetten;) wat moet nou veranderd worden als ik een 20 Mhz ga gebruiken??

Sjors;)

Er staat ook een blok code achter de ISR na de content restore en voor het label hoofdprogramma. Deze blok code zal nooit uitgevoerd worden.

Ik zal morgen eens beter naar de code kijken het is nu laat.

EDIT

HoofdProgramma:

WHILE 1 = 1
IF IntTeller >= 500 THEN
INC Sec1
IntTeller = 0
ENDIF
IF Sec1 >=10 THEN
HoofdProgramma:

WHILE 1 = 1
IF IntTeller >= 500 THEN
  INC Sec1
  IntTeller = 0
  ENDIF

IF Sec1 >=10 THEN

Zoek de verschillen. Zo zie je in een keer welke code er bij elkaar hoort en waarneer er weer een nieuwe IF begint.

[Bericht gewijzigd door benleentje op (49%)]

jaa klopt hij zal nu natuurlijk naar hoofdprogramma gaan en zal daardoor:

;        76543210 
PORTA = %00000000                       ;Eerst alle PORTA uitgang registers uit (laag maken)
PORTB = %00000000
TRISA = %11100001                       ;Alle PORTB poorten zijn uitgangen, behalve PORTB.0
TRISB = %11110000
 
PORTB_PULLUPS ON
 
Sec1 = 0 : Sec2 = 0
Min1 = 0 : Min2 = 0
Uur1 = 0 : Uur2 = 0
 
 
T2CON = %00000111                       ; Postscaler 1:1, Prescaler 1:16
PR2 = 124                               ; 124 ticks geeft 2 millisec / int.
TMR2IE = 1 : PEIE = 1 : GIE = 1         ; Enable interrupts
TMR2ON = 1 

niet meenemen
ik zal hoofdprgramma even ergens anders moet neerzetten en niet boven dit stukje want dan zorgt ie ervoor dat me klok de hele tijd op 00:00:00 blijftr staan:P

Edit
hier de nieuwe code: (ben er nog niet over uit of die T2CON enzo goed staan in me programma

;          Poort bezettingen

DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL true

;Logische constanten
SYMBOL off         = 0
SYMBOL AAN         = 0
SYMBOL UIT         = 1
SYMBOL ON          = 1
SYMBOL Tijd        = 2000

SYMBOL Schakelaar1 = PORT.???
SYMBOL Schakelaar2 = PORT.???

DIM Sec1           AS BYTE
DIM Sec2           AS BYTE
DIM Min1           AS BYTE
DIM Min2           AS BYTE
DIM Uur1           AS BYTE
DIM Uur2           AS BYTE 
DIM DigitTeller    AS BYTE
DIM DisplayOutput  AS BYTE
DIM Cijfers        AS BYTE
DIM Klok           AS BYTE
DIM TerugTijd      AS BYTE
DIM IntTeller      AS WORD

Sec1 = 0 : Sec2 = 0
Min1 = 0 : Min2 = 0
Uur1 = 0 : Uur2 = 0

;        76543210 
PORTA = %00000000                       ;Eerst alle PORTA uitgang registers uit (laag maken)
PORTB = %00000000
TRISA = %11100001                       ;Alle PORTB poorten zijn uitgangen, behalve PORTB.0
TRISB = %11110000

PORTB_PULLUPS ON

SYMBOL GIE      = INTCON.7 
SYMBOL PEIE     = INTCON.6
SYMBOL TMR2IF   = PIR1.1
SYMBOL TMR2IE   = PIE1.1
SYMBOL TMR2ON   = T2CON.2

On_Hardware_Interrupt GOTO ISR
GOTO HoofdProgramma

ISR:

TMR2IF = 0
PORTA = 0
PORTB = 0
PORTA = Klok[DigitTeller]                ;Dit selecteert dus een hele digit van het display wat om dat moment geactiveerd word.
PORTB = Cijfers[DisplayOutput]
INC IntTeller                                   
INC DigitTeller
CONTEXT RESTORE




HoofdProgramma:

T2CON = %00000111                       ; Postscaler 1:1, Prescaler 1:16
PR2 = 124                               ; 124 ticks geeft 2 millisec / int.
TMR2IE = 1 : PEIE = 1 : GIE = 1         ; Enable interrupts
TMR2ON = 1                                  

WHILE 1 = 1
IF IntTeller >= 500 THEN
  INC Sec1
  IntTeller = 0
ENDIF

IF Sec1 >=10 THEN
  INC Sec2 
  Sec1 = 0
ENDIF

IF Sec2 = 6 THEN
  INC Min1
  Sec2 = 0
ENDIF

IF Min1 >=10 THEN
  INC Min2 
  Min1 = 0
ENDIF

IF Min2 >=6 THEN
  INC Uur1
  Min2 = 0
ENDIF

IF Uur1 >=10 THEN
  INC Uur2
  Uur1 = 0
ENDIF

IF Uur2 = 2 AND Uur1 = 4 THEN
  CLEAR Uur1 
  CLEAR Uur2
  CLEAR Min1
  CLEAR Min2
  CLEAR Sec1
  CLEAR Sec2
ENDIF 

IF DigitTeller >=6 THEN DigitTeller = 0
SELECT DigitTeller
CASE 0 
DisplayOutput = Sec1
CASE 1
DisplayOutput = Sec2
CASE 2
DisplayOutput = Min1
CASE 3
DisplayOutput = Min2
CASE 4
DisplayOutput = Uur1
CASE 5
DisplayOutput = Uur2
END SELECT

IF Cijfers >= 10 THEN Cijfers = 0
SELECT Cijfers
;Segment   abcdefg.
;PoortB    76543210      
CASE 0 
Cijfers = %00000011
CASE 1
Cijfers = %10011111
CASE 2
Cijfers = %00100101
CASE 3
Cijfers = %00001101
CASE 4
Cijfers = %10011001
CASE 5
Cijfers = %01001001
CASE 6
Cijfers = %01000001
CASE 7
Cijfers = %00011111
CASE 8
Cijfers = %00000001
CASE 9
Cijfers = %00001001
END SELECT

IF Klok >=7 THEN Klok = 1
SELECT Klok
;PoortA 76543210
CASE 1
Klok = %11111110
CASE 2
Klok = %11111101
CASE 3
Klok = %11111011
CASE 4
Klok = %11110111
CASE 5
Klok = %11101111
CASE 6
Klok = %11011111
END SELECT

IF Schakelaar1 OR Schakelaar2 = AAN THEN GOSUB KlokWijzigen
WEND
END


;Subroutine
KlokWijzigen:

TerugTijd = 0
WHILE Schakelaar1 OR Schakelaar2 = AAN : WEND
WHILE 1 = 1
INC TerugTijd
IF Schakelaar1 = AAN THEN
  INC Min1
ENDIF

IF Min1 >=10 THEN
  INC Min2
  Min1 = 0
ENDIF

IF Min2 >=6 THEN Sec2 = 0

IF Schakelaar2 = AAN THEN
  INC Uur1
ENDIF

IF Uur1 >= 10 THEN 
  INC Uur2
  Uur1 = 0
ENDIF

IF Uur2 >=2 AND Uur1 >=4 THEN
  CLEAR Uur2
  CLEAR Uur1
  CLEAR Min2
  CLEAR Min1
  CLEAR Sec2
  CLEAR Sec1
ENDIF

IF Schakelaar1 OR Schakelaar2 = AAN THEN CLEAR TerugTijd
IF TerugTijd = Tijd THEN RETURN
WEND

vandaag spullen binnen gehad!

alles aangesloten maar deed niks...:S

ik zie niks op me display's dus ik denk dat ie de digits niet hoog maakt???
zien jullie misschien een foutje in de code;)

MVg Sjors

Je gaat ook helemaal verkeerd te werk. Je begint met een klein programma waarin je 1 digit doet knipperen. Check, ok dat werkt. En zo verder.

Als je er direct een groot programma inploft begrijp je toch zelf dat het probleem op vele plaatsen kan zitten.

Het is inderdaad geen goed idee, om een ongetest compleet programma uit te testen op hardware waarvan je nog niet eens weet of die (naar behoren) werkt. Eerst een simpel testprogramma om alle hardware te testen...

dan zal ik morgen eerst alle poorten hoog en laag maken kijken of alle segmenten het doen;)

oke heb de displays aangesloten en ze werken gewoon. heb hem laten tellen van 0 tot 9 werkt perfect!;)
ik denk dat het probleem het in porta zit. hij maakt deze gewoon niet hoog(5V)
ik gebruik deze instelling:


;        76543210 
PORTA = %00000000                       ;Eerst alle PORTA uitgang registers uit (laag maken)
PORTB = %00000000
TRISA = %11111111                       ;Alle PORTB poorten zijn uitgangen, behalve PORTB.0
TRISB = %00000000

ik weet niet zeker of dit goed is. ik denk het wel want ik laat nu allen uitgangen met 5V laden. maar als ik meet met mijn multimeter staat ie op 0.4V
dus ik denk dat daar ergens de fout zit!

MVG Sjors

PortA zijn alle maal ingangen en portB allemaal uitgangen. Welk probleem heb je dan en specifiek met welke pin op de port.

Pin RA4 is multiplexed with the Timer0 module clock
input to become the RA4/T0CKI pin. The RA4/T0CKI
pin is a Schmitt Trigger input and an open drain output.

RA4 zal en kan nooit hoog worden deze kan enkel stroon sinken en niet sourcen.`Dus als deze pin laag is kan er stroom in. Maar als deze hoog is gebeurt er niets en spert dus.