Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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'...
benleentje
Golden Member
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.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
sjors007
...
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)
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
sjors007
...
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%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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)
sjors007
...
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;)
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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...)
sjors007
...
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
benleentje
Golden Member
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.
sjors007
...
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 20zou dit dan werken en me klok redelijk laten lopen??
mvg sjors;)
benleentje
Golden Member
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.
sjors007
...
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%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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...)
sjors007
...
oke deze moet ik dus even in de main loop zetten;) wat moet nou veranderd worden als ik een 20 Mhz ga gebruiken??
Sjors;)
benleentje
Golden Member
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 THENHoofdProgramma:
WHILE 1 = 1
IF IntTeller >= 500 THEN
INC Sec1
IntTeller = 0
ENDIF
IF Sec1 >=10 THENZoek 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%)]
sjors007
...
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
sjors007
...
vandaag spullen binnen gehad!
alles aangesloten maar deed niks...
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
plantrekker
True story bro!
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.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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...
sjors007
...
sjors007
...
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
benleentje
Golden Member
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.