oke dan zal ik daar even kijken als het niet lukt horen jullie het wel:P

oke nu kom ik er even niet uit:S

bij een 4MHz komen er 1.000.000 instructie cycles
en dan had ik mijn PR2 op 250 gezet want dan had je precies
1.000.000 / 250 = 4000 interrupts per seconden
en dan had ik me prescaler op 1:16
zodat je uitkwam op 4000 / 16 = 250 zo hoefde ik een tellertje te maken die tot 250 telde
maar nu ....
jullie zeggen dat de pre- en postscaler op 1:1 moeten staan
maar nou moet ik een teller maken die tot 128 telt dus 128 interrupts per seconden

en de 32.768Hz levert 32768 pulsen per seconden
dus ik dacht...
32768 / 128 = 256
aangezien pre- en postscaler 1:1 staan kan ik toch gewoon bij PR2 256 opschrijven??

graag jullie reactie

[Bericht gewijzigd door Henry S. op (83%)]

PR2 = 256 = 0 :P.
Dat doet hij al automatisch en is daarom niet nodig.

Ik ga idd van een 32,768khz kristal uit. De kristal ingang telt direct de kristal frequentie daar geld de /4 niet. Maar weet het niet 100% zeker zou ik of jij de datasheet even moeten nakijken.

Je bent natuurlijk vrij om een ander kristal aan te sluiten. Met 250 int/sec krijg je ook kortere tijden voor het updaten van je display.

Dan kom je op 1/250 = 4mS uit dat is zelfs beter.

Ik denk dat je die PR2 moet instellen in de subroutine want dat is de waarde die het moet hebben. Maar ook dat moet je even nakijken.

ik hoorde ook dat je misschien beter 60Hz ken gebruiken ipv 50Hz
maar die 32768 hoeveel Hz is dat?
en hoeveel Hz geeft een 20mhz dan?:P misschien is het heel simpel maar ik weet het niet zeker

ik had ook wat gelezen over TCXO is dit een betere manier?

MVG Sjors

ps die formulie die ik had gebruikt klopt?

en wat houd de /4 regeling in?

Hoe kom je nu weer bij 50 of 60Hz? Dat is de frequentie van het lichtnet. Dat kan je ook gebruiken om een klok te maken maar daar zijn we nu niet mee bezig.

Wij gebruiken een 32768Hz kristal. We gebruiken die exacte frequentie omdat die mooi deelbaar is om exact 1 seconde te krijgen. Dit kristal heeft niets te maken met 20Mhz.

Je kan een 20Mhz kristal gebruiken als voor de PIC. Jij kan dat echter niet want aan de kristal-pinnen hebben we al de 32768 kristal hangen. Je moet gewoon de interne 4Mhz oscillator gebruiken. LET OP: Dit is de oscillator die de PIC aan de gang houdt! Heeft niets te maken met de timers.

De /4 regel geldt alleen als je de timer hebt draaien op de interne oscillator. Wij gebruiken het externe 32768 kristal dus geen /4 regel.

Heb je uberhaupt al een PIC op je breadboard? Want je ziet volgens mij door de bomen het bos niet meer. Stap voor Stap.

Een PIC werkt intern met een /4 instructie klok. Dus als je kristal 4mHz is dan worden de instructie met 1Mhz afgewerkt. De pic heeft namelijk precies 4 stappen nodig om elke instructie uit te voeren.

Een insructie moet namelijk
gelezen worden uit het gehuigen
Vertaald worden.
De bewerking worden uitgevoerd.
Worden opgeslagen in registers. port a en b zijn ook registers.

32,768kHz = 32768hz
20Mhz = precies 20.000.000hz +/- de tolerantie voor dat kristal.
Ik heb geen idee wat een TXCO is.
Ja je formule was goed.

In de datasheet staat altijd aangegeven op welke snelheid een klokpuls werkt.

Kijk in de datasheet naar Timer2.
Fosc in de datasheet is dan de frequentie van het kristal of van de interne oscillator.
Fosc/4 wat je het meest ziet is dan 1/4 van de snelheid van Fosc.

Ik heb duidelijk een denkfout gemaakt. Alleen aan timer1 kan je direct een kristal hangen en dan direct daarvan tellen.
Maar maakt verder niet uit voor je programma. Je bent echter wel verplicht om een kristal aan te sluiten. Dit omdat preciezer is dan de interne oscillator. En je wilt natuurlijk dat je klok zo nauwkeurig mogelijk loopt.

De prescaler moet dan op 1:16 staan
pr2 moet met 250 geladen worden en dat hoeft maar 1 keer te gebeuren maar wel voordat je timer2 aan zet.
Je krijgt nu 250 int/sec die elk om de 4mS voorbij komen.

Oja dat is waar Benleentje.

Enkel als je timer1 gebruikt hoef je geen rekening te houden met /4 .

Een 32768 kristal is dus ook enkel mogelijk als je timer1 gebruikt voor de timing, en de interne oscillator voor de PIC zelf.

Als je timer2 gebruikt moet inderdaad bijvoorbeeld een 20M Hz kristal gebruiken, en deze oscillator ook selecteren voor de PIC zelf. Nu heb je dus wel de /4 factor.

Ik vind de eerste optie het handigst.

60Hz als multiplexfrequentie is meestal OK.
(50Hz kan problemen geven als de klok naast bijv. een TL buis hangt, je krijgt dan hele nare inteferentie effecten...)

okee maar moet ik nu timer 1 of timer 2 gebruiken
ik denk timer 1
timer1 heeft tog geen pr2??

De prescaler moet dan op 1:16 staan
pr2 moet met 250 geladen worden en dat hoeft maar 1 keer te gebeuren maar wel voordat je timer2 aan zet.
Je krijgt nu 250 int/sec die elk om de 4mS voorbij komen

als ik het zo lees lijkt het alsof u bedoelt dat timer1 en 2 samen gaan werken?

wanneer ik timer1 maakt het natuurlijk voor het pogramma niet uit moet alleen de registers enzo. veranderen.

dan kan ik toch gewoon de prescaler op 1:1 laten staan
dan krijg je nog steeds 128 interrups per seconden?
of heb ik het mis..??
het mooiste is als je meer interrups per seconden ken krijgen.

MVG Sjors

60Hz is dan 16mS dat betekent dat je om de 4 interrupts je display kan updaten. Betekent weer een extra teller die dat bijhoud.

Is 250Hz voor het display ook goed of is dat weer te hoog.

EDIT
Nee daar het ik het toch echt over timer2 maar was enkel niet zeker van Fosc/4. Maar ben daar nu wel zeker van.

Timer2 werkt net even iets makkelijker zoals ik het nu zie dus gebruik die maar.
Je kan zelfs met timer 2 makkelijk meer interrupts krijgen. Als je pr2 met 3 laad dan krijg je
Fosc/4 /pr2 = 1000.000 /4 = 250.000 int/sec = 4µS

EDIT2
pr2 moet niet met 250 maar met 249 geladen worden.

woww 4us is bar weinig:P

oke ik gebruik dus nu Timer2
pr2 = 3
pre- en postscaler blijven 1:1

Symbol GIE = INTCON.7
Symbol PEIE = INTCON.6
Symbol TMR2IF = PIR1.1
Symbol TMR2IE = PIE1.1
Symbol TMR2ON = T2CON.2
dit blijft gewoon staan
alleen die Fosc/4 moet nog ik zal morgen even in de datasheet kijken hoe je die in je programma moet zetten!

MVG Sjors

Op 62.5 Hz refreshrate gaan zitten, dan een periodetijd van 16 msec, dus elke digit 4 msec aan (12 msec uit.). Intern 250 rondjes tellen van 4 msec elk, 250 * 4 msec = 1 sec. (tijdpunten : op 125 aan/uit blinken.)
Op die interne teller kun je allerlei functies hangen. Zie: http://attiny.com/avrklok.htm

Ik weet nu niet meer hoeveel displays je eigenlijk wilt. Eerst zei je 2, toen 4, en later 6...
Bij 6 displays kun je PR2 op 124 zetten, prescaler 1:4, postscaler 1:1.
Je krijgt dan een interrupt iedere 2mS, multiplex frequentie wordt dan 500/6 = 83.33Hz (12mS)

@arco
Ik dacht dat je met 60Hz bedoelde de snelheid waarmee je naar het volgende digit schakelde maar het moet zijn voor een complete ronde.

Op 22 augustus 2009 23:00:16 schreef sjors007:
woww 4us is bar weinig:P
alleen die Fosc/4 moet nog ik zal morgen even in de datasheet kijken hoe je die in je programma moet zetten!

Fosc/4 hoef je niet in te stellen dat doet het ding nu eenmaal. Je moet het alleen gebruiken in de berekening zoals we nu hebben gedaan.

Aan 4µS heb je niets doe zoals arco zegt en maak er 2mS van. Die heeft meer ervaring met 7-segment dan ik.
Een ander punt is dat je intterrupt routine dan te lang is voor 4µS. Het doet er al langer over om er naartoe te springen en dan weer terug te gaan naar het hoofdprogramma. En dan moet het de instructies in de routine nog uitvoeren. Onmogelijk dus.

Als je interrupt tijden van 4µS wilt zal dat enkel lukken met een 20MHz kristal en dan nog blijft er na de uitvoer van de routine maar heel erg weinig tijd over voor je programma.

oke ik heb nu me register allemaal bijgesteld
PR2 = 123 ; 124 ticks geeft 2 millisec / int.
T2CON = %0000011 ; Postscaler 1:1, Prescaler 1:4

nou moet ik alleen nog een teller maken die tot:
32768 / 1 / 4 / 124 = 66.065
dan zou ik een teller moeten maken die tot 66 telt. toch?

MVG Sjors;)

Chatwaarschuwing voor sjors007: Gebruik de edit of wacht 24 uur of op de volgende poster! CO is geen prive chatbox.

sjors al je het zelf had nagerekend dat had je gezien dat 2mS niet overeen komt met 66,065Hz. 2Ms is 500Hz Dus je teller moet tot 500 kunnen tellen. Daarvoor moet je de intteller als een word instellen.



dim intteller as word

Arco is blijkbaar van een 1Mhz kristal uitgegaan.

Als je een 4Mhz kristal neemt dan krijg je het volgende.
Pr2=124
Prescaler 1:16
Postscaler 1:1

1.000.000 /1 /16 /125 = 500Hz
Dus 1 sec duurt 500 interrups >> intteller 0 tot 500

Je hebt gelijk. Prescaler moet 16 zijn ipv 4. In ieder geval wel PR2 op 124, en niet op 123 zoals TS voorstelt. (123 geeft een interrupt iedere 1984µS en het is uiteraard een nachtmerrie om daar een fatoenlijke klok uit te maken...)

Op 22 augustus 2009 22:32:39 schreef Arco:
60Hz als multiplexfrequentie is meestal OK.

Maar ik lees hier:

Op 22 augustus 2009 23:23:17 schreef Arco:
Je krijgt dan een interrupt iedere 2mS, multiplex frequentie wordt dan 500/6 = 83.33Hz (12mS)

dus opzich is 83Hz voldoende om ervoor te zorgen dat je het niet knipperen.
1 / 83 = 0.012sec ik denk niet dat ik dat zie:P

anders kon je misschien een interrupt maken van 1ms dan word dat 1000Hz

1000Hz / 6 = 166 Hz multiplexfrequentie
1 / 166 = 0.006 seconden
dat lijkt me niet nodig:P

ik had nog 1 vraagje:


T2CON = %00001111                    ; Postscaler 1:1, Prescaler 1:16

geeft deze (00001111) de goede binieare getallen op van postscaler 1:1 en Prescaler 1:16??

MVG sjors

Nee, dat is postscaler 1:2 (zie datasheet). Moet zijn 0x07 (00000111)

Hallo iedereen!!:D

ik ben verder met me programma en heb een vraagje.
Welke transistor kan ik het beste nemen om een Digit te selecteren
het gaat om Common Anode display
kan ik hiervoor een PNP-transistor (de basis via 1K naar me PIC) gebruiken
of gewoon een NPN transistors (de basis via 1K naar me pic)
de transistors worden overigs 5Volt gevoed

MVG Sjors

Common anode = Common +:P.

Je moet dus spanning zetten op het display dan heb je PNP nodig.


     |
     |
   |< 
  -|  Basis naar de PIC via 1k
   |\    BC557
     |
     |
  Display

Let wel op met deze schakeling

  • De spanning over de tor mag niet groter zijn dan 5,5V max. Anders komt er via de basis meer dan 5V op de pin van de PIC te staan.
  • De bc557 schakeld omgekeert. Als de PIC 0 is dan kan de output stroom sinken( geleiden naar de massa). Hierdoor kan er door de basis stroom vloeien waardoor het schakeld. Een 1 betekend 5V op de uitgang van de PIC. De basis is nu op 5V en de Emitter ook op 5V. De tor spert.

die 5.5Volt haal ik niet want ik heb een 7805 staan en daar komt 5.01V uit dus daar maak ik me geen zorgen over;)

waarom is het eigenlijk nodig om voor de basis een weerstand te hebben?

en dan nog even iets
straks wil ik grotere 7segment displays aanschaffen. die vragen 10V
dus hoe kan ik dat dan oplossen?
want jij zegt dat wanneer je meer dan 5.5V op Emitter zet dat de basis meer dan 5 Volt word. dus ik zat dan te denken om het zo te doen:


      5V                10V
       |                 |
      |                  |
    |<                   |
1K -|                   |
    |\  BC557          |
      |              |<
      |___________  -|
                     | \  BC557
                        |
                        | 
                       Display 10V

graag jullie reactie hierover?
MVG Sjors

EDIT
ik heb de oplossing al gevonden;)
http://www.circuitsonline.net/forum/view/65112/1/7+Segment+display

Ik hoop dat je dan deze bedoelt
http://www.winpicprog.co.uk/pic_tutorial_extras.htm

En dan het schema rechts boven de titel input in het rood.

Beter kan je de UDN2985A nemen. Hierin zitten dan 8 van die transistor paren en kan je direkt met 5V aansturen. Die kan per kanaal 250mA aansturen.
Je hebt op je display 7 segmenten dus per segment kan je dan max 240/7 = 34mA opnemen. Als je displays meer stroom per segment nodig hebben moet je een andere IC nemen of je schakeling bouwen.

IC is makkelijker:P

Op 26 augustus 2009 19:45:33 schreef sjors007:
waarom is het eigenlijk nodig om voor de basis een weerstand te hebben?

  1. Omdat de basis een enkel diode overgang is. Een diode gaat geleiden vanaf 0,7V en heeft daarna praktisch geen weerstand meer. De weerstand is noodzakelijk om de stroom door de basis te begrenzen. De spanning die over de weerstand komt te staan is dan 5V - 0,7V = 4,3V.
  2. De stroom door de PIC mag ook niet te groot worden. Direct 4,3V op een pin die aan het sourcen is kan dan ook niet. Om de stroom te begrenzen er een weerstand voor.

34mA per segment word al eens wat denk:P

ik neem aan dat je deze dan bedoelt.
deze dingen zijn toch alleen voor Segment A/G maar wat heb dat te maken met de voeding van de 7 segments displays? dat gebeurt toch gewoon via torrenhttp://www.100y.com.tw/product_jpg_original/A005541.jpg

Beide kunnen voor beide dingen. Huuh.

Je kan de segmenten en de displays of met torren of met deze chips aansturen.
Als je enkel 3 displays hebt is het makkelijker om 3 torren te gebruiken. Moet je voor hogere spanningen dan worden dat al 6 torren en 6 weerstanden.

6 x tor = 6 x 3 = 18 pootjes of  9 voor 5V
6 x R   = 6 x 2 = 12 pootjes of  6 voor 5V
                  30 pootjes of 15
UDN2985           18    
ULN2803           18

Dus zelfs met 3 torren en 3 weerstanden kom je al dicht bij de 18 pootjes voor het hele IC. Dat is waar ic's goed in zijn veel torretjes in 1 huisje. Je maakt gewoon de afweging wat is handiger veel torretje of een enkel IC. Als het gene wat je wilt schakelen ver weg zit dan kan losse torren weer handig zijn.

Ik zou in jouw geval dan voor beide IC's gaan. Het kan mag ook een andere UDN zijn je hebt ze met 2,4 en 8 kanalen. Minder kanalen is dan vaak meer stroom. Maar kan ook hogere spanning zijn.

UDN = Highside driver. Voor om de + door te schakelen er komt als het ware een +. De + noemen we ook wele de hoge kant = highside
ULN = Lowside driver bekent neem ik aan?

EDIT
Het is niet zo dat UDN hihgside betekent, maar zo ver ik het gezien heb betreft het alle highside drivers.