Dim Tel as word.

main:

While 1 = 1

Tel = 12345     ;word groote
 
digi1 = Dig Tel , 0        ; 1e getal opslaan
digi2 = Dig Tel , 1        ; 2e getal opslaan  
digi3 = Dig Tel , 2        ; 3e getal opslaan
digi4 = Dig Tel , 3        ; 4e getal opslaan
digi5 = Dig Tel , 4        ; 5e getal opslaan

If digi1 = 0 Then
 PORTB.4 = 0  ; A
 PORTB.5 = 0  ; B
 PORTB.6 = 0  ; C
 PORTB.7 = 0  ; D
 EndIf 
If digi1 = 1 Then
 PORTB.4 = 1  ; A
 PORTB.5 = 0  ; B
 PORTB.6 = 0  ; C
 PORTB.7 = 0  ; D
 EndIf 
If digi1 = 2 Then
 PORTB.4 = 0  ; A
 PORTB.5 = 1  ; B
 PORTB.6 = 0  ; C
 PORTB.7 = 0  ; D
 EndIf   
If digi1 = 3 Then
 PORTB.4 = 1  ; A
 PORTB.5 = 1  ; B
 PORTB.6 = 0  ; C
 PORTB.7 = 0  ; D
 EndIf
If digi1 = 4 Then
 PORTB.4 = 0  ; A
 PORTB.5 = 0  ; B
 PORTB.6 = 1  ; C
 PORTB.7 = 0  ; D
 EndIf 
If digi1 = 5 Then
 PORTB.4 = 1  ; A
 PORTB.5 = 0  ; B
 PORTB.6 = 1  ; C
 PORTB.7 = 0  ; D
 EndIf
If digi1 = 6 Then
 PORTB.4 = 0  ; A
 PORTB.5 = 1  ; B
 PORTB.6 = 1  ; C
 PORTB.7 = 0  ; D
 EndIf
If digi1 = 7 Then
 PORTB.4 = 1  ; A
 PORTB.5 = 1  ; B
 PORTB.6 = 1  ; C
 PORTB.7 = 0  ; D
 EndIf
If digi1 = 8 Then
 PORTB.4 = 0  ; A
 PORTB.5 = 0  ; B
 PORTB.6 = 0  ; C
 PORTB.7 = 1  ; D 
 EndIf
If digi1 = 9 Then
 PORTB.4 = 1  ; A
 PORTB.5 = 0  ; B
 PORTB.6 = 0  ; C
 PORTB.7 = 1  ; D
 EndIf
Wend

GoTo main

Ik ben al een poosje bezig om dig te ontdekken, maar hij doet nog niet wat ik graag wil.
Ik wil het getal :12345 op digi1 laten zien.
Op de een of andere manier krijg ik het getal niet door de dig omzetter heen.
Er gaan geen leds branden, mijn pic loopt wel.
Soms moet je eerst weer terug naar de basis, nu dus.

Iemand een idee waar dit mis gaat?

tris registers niet ingesteld?

Staan als uitgang ingesteld.
Ik wou eerst een word serieel ontvangen en daarna deze met dig omzetten om zo 7 segment aan te sturen dmv bcd in een 4511.
Aangezien dit niet lukte terug naar simpel begin.

ik ken geen pic basic,

maar doen de uitgangen het wel als je gewoon,

digi1 = 1 ;

op regel 13 zet?

en wat doen PORTB.0 t/m PORTB.3 ?

mvg,
noone.

[Bericht gewijzigd door noone op (11%)]

Ik werk niet met basic (dus kan niet antwoorden op je vraag) maar dat hele if-gedoe... Vervang dat door 1 regel:

PORTB = digi1 << 4;

Eventueel nog gebruik maken van een mask als je de andere poortpinnen (0,1,2,3 van PORTB) nog gebruikt voor wat anders want nu zullen die steeds als 0 overschreven worden.

@plantrekker :

wat doet dit eigenlijk?

PORTB = digi1 << 4;

mvg,
noone.

zoek ens in je datasheet naar "read-modify-write"
je moet in een keer een word naar de tris toe schieten, enkel een bit na bit aanpassen werkt niet.

Digi1 is '1', dus portb4...7 is ook '1000'. Je ziet dus altijd '1000' op port B...

Tris was dus wel 1 van de problemen.
Door het vaak veranderen erin geslopen.

Ik kan nu het getal in Tel wel presenteren, prima dus.
Dank U.

Fijn dat het werkt, maar ik zie niet echt in hoe bovenstaande code '12345' kan laten zien?...

Als volgt:

Tel = 12345 ;word groote

digi1 = Dig Tel , 0 ; 1e getal opslaan
digi2 = Dig Tel , 1 ; 2e getal opslaan
digi3 = Dig Tel , 2 ; 3e getal opslaan
digi4 = Dig Tel , 3 ; 4e getal opslaan
digi5 = Dig Tel , 4 ; 5e getal opslaan

If digi1 = 5 Then
PORTB.4 = 1 ; A
PORTB.5 = 0 ; B
PORTB.6 = 1 ; C
PORTB.7 = 0 ; D
EndIf

De bovenste regel: digi1 = Dig Tel , 0 haalt nu digit nummer 0(volgens compiler is rechtse 0) uit Tel en dus 5, want dat is de meest rechtse digit.
Daarna ga ik als digi1 = 5 dan de poorten aansturen.

en wat doe je met PORTB.0 t/m PORTB.3?

mvg,
noone.

Als het van rechts telt, is digi1 inderdaad 5, maar ik zie niet hoe je '12345' op de poort kunt krijgen met die code...

@Arco,

ik denkt dat de cijfers van het getal 12345 na elkaar op de poort verschijnen.

mvg,
noone.

Niet met de code die in de startpost staat...

Ah, bedoel je dat,

de code in de startpost verwerkt alleen digi1,

het hele programma wordt voor alle cijfers erg groot,

kan veel korter, denk ik.

mvg,
noone.

Klopt, het is alleen voor digit1.

Code is vrij lang (alle poorten setten)maar niet ingewikkeld.

OK, maar wat doe je met PORTB.0 t/m PORTB.3?

dit is geen strikvraag, 'niks' is ook goed,

je kunt je dig naar PORTB.4 t/m PORTB.7 omzetter veel kleiner maken,
door een rekenkundige bewerking.

mvg,
noone.

Het is zelfs niet met een rekenkundige bewerking...

digi1 heeft al de exacte binaire waarde die hij op een poort naar buiten wil brengen...

Alleen omdat hij die binaire waarde op de most significant nibble van de poort wil, moet hij 4 keer shiften. Zo dus:

PORTB = digi1 << 4;

Op die manier wordt de laagste nibble wel altijd met 0 overschreven. Wil je dat niet, dan doe je het zo:

PORTB = (PORTB & 0x0F) | (digi1 << 4);

(ik weet dat ik c-code schreef)

ik wilde digi1 vermenigvuldigen met 16 (24),

komt op hetzelfde neer.

mvg,
noone.

Op 20 juli 2010 13:27:53 schreef noone:
OK, maar wat doe je met PORTB.0 t/m PORTB.3?

dit is geen strikvraag, 'niks' is ook goed,

je kunt je dig naar PORTB.4 t/m PORTB.7 omzetter veel kleiner maken,
door een rekenkundige bewerking.

mvg,
noone.

Met B.0 t/m B.3 word een andere bcd voor een ander display aangestuurd.
Ik kan dus niet beide in bv : portb = %00001111 doen, want dan beïnvloed ik ook het andere display die iets heel anders moet aangeven.

Doe je het voor het andere display (die op portb.0 tm 3 zit) hetzelfde als hier? dus elke bit van portb apart aansturen?
Dan kan je ook beide displays in 1 keer aansturen, "Waarde" is even de waarde van het display wat aan portb.0 tm 3 zit:

DIM Tel AS WORD
DIM Digi[5] AS BYTE
DIM Teller AS BYTE
DIM Waarde AS BYTE ;waarde komt al met 0 tm 9 zonder berekening

PORTB = %00000000
TRISB = %00000000

WHILE 1 = 1
 
    Tel = 12345     ;word groote
    Waarde = 5
    
    FOR Teller = 1 TO 5 
        Digi[Teller] = DIG Tel , Teller - 1       ; getal opslaan
        Digi[Teller] = Teller << 4                ; 00001001 --> 1001000 conversie (bijv.)
        PORTB = Digi[Teller] + Waarde ;10010000 + 00001010 = 10011010(bijv.)
        DELAYMS 1000
    NEXT
WEND

Op 21 juli 2010 08:46:42 schreef loopycoaster:
Doe je het voor het andere display (die op portb.0 tm 3 zit) hetzelfde als hier? dus elke bit van portb apart aansturen?
Dan kan je ook beide displays in 1 keer aansturen, "Waarde" is even de waarde van het display wat aan portb.0 tm 3 zit:

DIM Tel AS WORD
DIM Digi[5] AS BYTE
DIM Teller AS BYTE
DIM Waarde AS BYTE ;waarde komt al met 0 tm 9 zonder berekening

PORTB = %00000000
TRISB = %00000000

WHILE 1 = 1
 
    Tel = 12345     ;word groote
    Waarde = 5
    
    FOR Teller = 1 TO 5 
        Digi[Teller] = DIG Tel , Teller - 1       ; getal opslaan
        Digi[Teller] = Teller << 4                ; 00001001 --> 1001000 conversie (bijv.)
        PORTB = Digi[Teller] + Waarde ;10010000 + 00001010 = 10011010(bijv.)
        DELAYMS 1000
    NEXT
WEND

Ik zal me hier eens in gaan verdiepen.

Digi[Teller] = DIG Tel , Teller - 1 ; getal opslaan
Digi[Teller] = Teller << 4 ; 00001001 --> 1001000 conversie (bijv.)
PORTB = Digi[Teller] + Waarde ;10010000 + 00001010 = 10011010(bijv.)

moet dat niet zijn:

Digi[Teller] = DIG Tel , Teller - 1 ; getal opslaan
Digi[Teller] = Digi[Teller] << 4 ; 00001001 --> 1001000 conversie (bijv.)
PORTB = Digi[Teller] + Waarde ;10010000 + 00001010 = 10011010(bijv.)

mvg,
noone.

Oh ja sorry!
Klopt noone, ik had het even over moeten lezen voor de fouten!
Het kwam er anders uit op mijn scherm dan het in mijn hoofd zat.