Schuifregister doet ingangen hoog bij latch

Pagina: 1
Acties:
  • 216 views sinds 30-01-2008
  • Reageer

  • leejoow
  • Registratie: Juni 2007
  • Niet online

leejoow

Dat ben ik!

Topicstarter
Ik ben bezig met een 8-kanaals PWM projectje en loop tegen een probleem aan waar ik geen oplossing voor kan vinden:

Ik heb een 74HC595 verbonden met een PIC 16F628A en ik kan hier ondertussen bytes op weergeven. Wil ik dit echter een groot aantal keer per seconde doen, dan gaan alles LEDS op de uitgangen van het schuifregister lichtjes branden. Na trial and error kwam ik erachter dat dit waarschijnlijk komt doordat op het moment dat de latch hoog gemaakt wordt de ledjes even gaan branden (ook als ze niet zouden moeten).

Heeft iemand anders dit probleem ook gehad en hoe zou ik dit kunnen oplossen?

Ontwikkelaar van de Heatpump Listener en Itho Daalderop warmtepomp control module


  • virus.elektro
  • Registratie: Januari 2002
  • Laatst online: 04-02 17:01

virus.elektro

profesionele monitor sloper

ik heb even data sheet van de chip er bij gepakt. op de chip zit een "output enable" ingang als je deze hoog maakt als je gaat schuiven zou het weg moeten zijn.

wat je nu ziet zijn de enen die voorbij schuiven.
uitleg
ik heb een kamer met acht deuren. door elke deur kan je binnen komen. als de deuren allemaal open staan kan ik iemand langs zien lopen. als alle deuren dicht zijn kan niemand zien langs lopen. met "output enable" doe je zeg maar alle deuren tegelijk open of dicht

elektrotechniek is leuk (nog wel). ik ga dus weer verder met leuke dingen ontwerpen. amd 2200+ 256mb 333mhz,gf4 440mx, 120gb,16X dvd. jarr-url


  • leejoow
  • Registratie: Juni 2007
  • Niet online

leejoow

Dat ben ik!

Topicstarter
virus.elektro schreef op zondag 20 januari 2008 @ 14:29:
ik heb even data sheet van de chip er bij gepakt. op de chip zit een "output enable" ingang als je deze hoog maakt als je gaat schuiven zou het weg moeten zijn.
Dit heb ik geprobeerd en nog steeds blijven de LEDs knipperen. Ik heb geprobeerd de output enable te doen rondom de regels dat ik de latch hoog en laag maak én rondom de gehele PWM code. Helaas werkt het in beide gevallen niet.

Als ik de output enable hoog maak en niet meer laag, dan blijven (zoals verwacht) alle LEDs uit.

Ik heb de code van mijn programma bij dit bericht gezet, misschien dat ik echt over iets heel stoms heenkijk, maar ik zie het niet meer :/

Op bit 0 van PORTB zit de data
Op bit 1 van PORTB zit de clock
Op bit 2 van PORTB zit de latch
Op bit 3 van PORTB zit de output enable

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
; Assign your microcontroller
  LIST P=16F628A
  include <P16F628A.INC>

  ; Predefine your configuration Word
  ;__CONFIG            Configuration Word
  ;_CP_OFF             Code Protection 
  ;_DATA_CP_OFF        EEPROM Code Protection
  ;_BODEN_OFF          Under Voltage Reset
  ;_MCLRE_ON           Master Clear Enable(Reset)
  ;_PWRTE_ON           Powerup Timer 
  ;_WDT_OFF            WatchDog Timer
  ;_INTRC_OSC_NOCLKOUT Internal RC oscilator(pins RA6/RA7 can be used voor I/O)
  ;_LVP_OFF            Low Voltage Programming

  __CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF

  ; Disable warning : Register in operand not in bank 0
  ERRORLEVEL -302 
  
  cblock 0x20
    LED1
    LED2
    LED3
    LED4
    LED5
    LED6
    LED7
    LED8
    TELLER
  endc

  org 0x00
  goto    INIT

  org 0x04
ISR
  incf    TELLER, F ; Hoog teller op

  ;Regel LED 1 (7 cycles)
  movfw   TELLER
  subwf   LED1, W
  btfsc   STATUS, C
  bsf     PORTB, 0  ; DATA hoog
  bsf     PORTB, 1  ; CLOCK hoog
  bcf     PORTB, 1  ; CLOCK laag
  bcf     PORTB, 0  ; DATA laag

  ;Regel LED 2 (7 cycles)
  movfw   TELLER
  subwf   LED2, W
  btfsc   STATUS, C
  bsf     PORTB, 0  ; DATA hoog
  bsf     PORTB, 1  ; CLOCK hoog
  bcf     PORTB, 1  ; CLOCK laag
  bcf     PORTB, 0  ; DATA laag

  ;Regel LED 3 (7 cycles)
  movfw   TELLER
  subwf   LED3, W
  btfsc   STATUS, C
  bsf     PORTB, 0  ; DATA hoog
  bsf     PORTB, 1  ; CLOCK hoog
  bcf     PORTB, 1  ; CLOCK laag
  bcf     PORTB, 0  ; DATA laag

  ;Regel LED 4 (7 cycles)
  movfw   TELLER
  subwf   LED4, W
  btfsc   STATUS, C
  bsf     PORTB, 0  ; DATA hoog
  bsf     PORTB, 1  ; CLOCK hoog
  bcf     PORTB, 1  ; CLOCK laag
  bcf     PORTB, 0  ; DATA laag

  ;Regel LED 5 (7 cycles)
  movfw   TELLER
  subwf   LED5, W
  btfsc   STATUS, C
  bsf     PORTB, 0  ; DATA hoog
  bsf     PORTB, 1  ; CLOCK hoog
  bcf     PORTB, 1  ; CLOCK laag
  bcf     PORTB, 0  ; DATA laag

  ;Regel LED 6 (7 cycles)
  movfw   TELLER
  subwf   LED6, W
  btfsc   STATUS, C
  bsf     PORTB, 0  ; DATA hoog
  bsf     PORTB, 1  ; CLOCK hoog
  bcf     PORTB, 1  ; CLOCK laag
  bcf     PORTB, 0  ; DATA laag

  ;Regel LED 7 (7 cycles)
  movfw   TELLER
  subwf   LED7, W
  btfsc   STATUS, C
  bsf     PORTB, 0  ; DATA hoog
  bsf     PORTB, 1  ; CLOCK hoog
  bcf     PORTB, 1  ; CLOCK laag
  bcf     PORTB, 0  ; DATA laag

  ;Regel LED 8 (7 cycles)
  movfw   TELLER
  subwf   LED8, W
  btfsc   STATUS, C
  bsf     PORTB, 0  ; DATA hoog
  bsf     PORTB, 1  ; CLOCK hoog
  bcf     PORTB, 1  ; CLOCK laag
  bcf     PORTB, 0  ; DATA laag

  bsf     PORTB, 3  ; OUTPUT ENABLE hoog

  bsf     PORTB, 2  ; LATCH hoog
  bcf     PORTB, 2  ; LATCH laag

  bcf     PORTB, 3  ; OUTPUT ENABLE laag

  bcf     INTCON, T0IF

  retfie

INIT
  BANKSEL TRISB
  movlw   b'00000000'
  movwf   TRISB           ; PORTB allemaal uitgangen
  BANKSEL CMCON

  movlw   b'00000111'
  movwf   CMCON           ; comparators uit
  clrf    PORTB           ; PORTB allemaal laag

  movlw   d'0'          ; Alle LEDS instellen
  movwf   LED1
  movwf   LED2
  movwf   LED3
  movwf   LED4
  movwf   LED5
  movwf   LED7
  movwf   LED8
  
  movlw   d'255'
  movwf   LED6

  ;movlw   d'128'
  ;movwf   LED6

  clrf    PORTB          ; PORTB laag
  clrf    TELLER         ; Zet teller op 0
  clrf    TMR0           ; Zet timer teller op 0  

  BANKSEL OPTION_REG     ; Enable de interrupts
  movlw   b'00000000' 
  movwf   OPTION_REG
  bsf     INTCON, GIE
  bsf     INTCON, T0IE
  bcf     OPTION_REG, T0CS
  BANKSEL TMR0

  
MAIN

  goto    MAIN           ; Oneindige loop

  end


Mijn excuses voor deze lap code 8)

Ontwikkelaar van de Heatpump Listener en Itho Daalderop warmtepomp control module


  • _ferry_
  • Registratie: Januari 2002
  • Niet online

_ferry_

Moderator Tweaking

Nipple Tweaker

eerst maar eens beginnen om daaar iets korters voor te nemen? :P

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
movlw    b'00001000' ;welke leds moeten er aan?
    call    schuifregister1
;-------------------------------------------------------------
schuifregister1
movwf    Var1        ; zet de waarde vanuit w in Var1. dit is het getal wat geklokt moet worden
        movlw    D'8'        ;zet de waarde 8 in het werkregister
        movwf    bits1        ;sla de waarde 8 uit w op in bits1 dis is het aantal bits wat ingeklokt moet worden
loop1
        rlf        Var1,1        ;rotate left trough carry en sla het resultaat op in Var1. Eerste bit zit nu in de carry 
        btfss    STATUS, C    ; lees de carry uit. Is carry= 1?
        bcf        data1        ;zo nee, zet de datalijn naar 0
        btfsc    STATUS, C    ; is carry 0?
        bsf        data1        ;zo nee data is 1

        bsf        klok1
        nop        
        bcf        klok1        ;bitje is nu ingeklokt

        decfsz    bits1,f        ;verlaag bits1 met één totdat die nul is
        goto    loop1        ; is bits1 0? dan "return" zo nee ga naar loop1
        return

Zie hier voor meer info: [HOWTO] LED kubus 5*5*5 met 74HC595

[ Voor 3% gewijzigd door _ferry_ op 20-01-2008 16:59 ]


Verwijderd

virus.elektro schreef op zondag 20 januari 2008 @ 14:29:
ik heb even data sheet van de chip er bij gepakt. op de chip zit een "output enable" ingang als je deze hoog maakt als je gaat schuiven zou het weg moeten zijn.

wat je nu ziet zijn de enen die voorbij schuiven.
uitleg
ik heb een kamer met acht deuren. door elke deur kan je binnen komen. als de deuren allemaal open staan kan ik iemand langs zien lopen. als alle deuren dicht zijn kan niemand zien langs lopen. met "output enable" doe je zeg maar alle deuren tegelijk open of dicht
Ik heb ook verschillende projectjes gedaan met een HC595. Volgens mij wordt dit probleem niet veroorzaakt door de "output enable" pin. de HC595 bevat een shift register en een storage register. Met de storage puls (pin 12) wordt het schift register ingeklokt in het storage register. Indien de OE pin laag is zie je data van het storage register direct op de uitgangen, indien deze hoog is dus niet. Maar de data ingeklokte data wordt dus in ieder geval pas zichtbaar op de uitgang nadat een storage puls is gegeven. De data in de vorm van 1 en 0 zie je dus niet voorbij komen tijdens het inklokken op de uitgangen ook al heb je OE gewoon laag staan. tenzij je na elk bitje wat je ingeklokt hebt ook een strorage puls geeft, maar dit is volgens mij niet het geval gezien de code die gepost is ( ook al gebruik ik zelf nooit asm). Het probleem wordt dus waarschijnlijk ergens anders door veroorzaakt. Ik heb zelf een keer problemen gehad toen de MR niet goed bleek aangesloten op de 5 volt. dus dan wordt ie elke keer gereset. En een keer had ik een slecht GND contact toen ging het ook half mis. Check dus even of je deze 2 pinnen goed hebt aangesloten lijkt me. Zelf knoop ik de MR pin altijd direct aan de 5 volt.

[ Voor 9% gewijzigd door Verwijderd op 20-01-2008 17:27 ]


  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:37

Onbekend

...

Je hebt toch wel de chip goed ontkoppeld met 100nF?
Je zit wel hoogfrequent datasignalen in te sturen.

Speel ook Balls Connect en Repeat


  • leejoow
  • Registratie: Juni 2007
  • Niet online

leejoow

Dat ben ik!

Topicstarter
_ferry_ schreef op zondag 20 januari 2008 @ 16:58:
eerst maar eens beginnen om daaar iets korters voor te nemen? :P
Zie hier voor meer info: [HOWTO] LED kubus 5*5*5 met 74HC595
Ik heb gekozen voor deze lap code om met behulp van de bytes LED1 t/m LED8 in 256 stappen de LEDs te kunnen regelen. Ik kan het fout hebben (ik programmeer nog niet zo lang is assembly :P), maar volgens mij is dit niet mogelijk met de code die jij mij laat zien.
Verwijderd schreef op zondag 20 januari 2008 @ 17:22:
Ik heb zelf een keer problemen gehad toen de MR niet goed bleek aangesloten op de 5 volt. dus dan wordt ie elke keer gereset. En een keer had ik een slecht GND contact toen ging het ook half mis. Check dus even of je deze 2 pinnen goed hebt aangesloten lijkt me. Zelf knoop ik de MR pin altijd direct aan de 5 volt.
Dit heb ik gehad toen ik de LEDs statisch aanstuurde (eenmaal alle bits inklokken en weergeven) en dit heb ik toen ook verholpen. Nu hangt de MR aan de +5 en de GND hangt aan de ground. :)
Onbekend schreef op zondag 20 januari 2008 @ 17:25:
Je hebt toch wel de chip goed ontkoppeld met 100nF?
Je zit wel hoogfrequent datasignalen in te sturen.
Dit had ik eerst niet, maar deze heb ik nu toegevoegd. Ik heb een condensator van 100nF over de Vcc en GND van de HC595 geknoopt, helaas helpt dit niets. :'(


Ik heb de prescaler van de timer een factor 4 groter gemaakt en de leds knipperen nu ook met een factor vier langzamer... Het moet dus echt in die code zitten die tijdens het timerinterrupt wordt uitgevoerd. Als ik het hele interrupt uitschakel en in de main loop de latch hoog maak en niet meer laag gaan de leds niet branden.

Ontwikkelaar van de Heatpump Listener en Itho Daalderop warmtepomp control module


  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:37

Onbekend

...

Zelf ben ik even eruit met het PIC programmeren, maar zou er hier iets in kunnen zitten?
; Disable warning : Register in operand not in bank 0


En heb je al geprobeerd om handmatig (dus langzaam) data in het schuifregister te klokken?

[ Voor 13% gewijzigd door Onbekend op 21-01-2008 08:05 ]

Speel ook Balls Connect en Repeat


  • leejoow
  • Registratie: Juni 2007
  • Niet online

leejoow

Dat ben ik!

Topicstarter
Onbekend schreef op maandag 21 januari 2008 @ 08:05:
Zelf ben ik even eruit met het PIC programmeren, maar zou er hier iets in kunnen zitten?
; Disable warning : Register in operand not in bank 0
Het enige dat dit doet is compiler waarschuwingen verbergen, ik zal als ik thuis ben eens kijken wat er gebeurd als ik deze regel weghaal. Kan het me niet voorstellen, maar misschien zit ergens naar de verkeerde bank te schrijven...
En heb je al geprobeerd om handmatig (dus langzaam) data in het schuifregister te klokken?
Ik heb een keer 8 bits ingeklokt en op de output gezet. Dit ging goed. Zoals ik al aangaf lijkt het erop dat de LED alleen gaat branden op het moment dat ik de latch puls geef.

Ik begin eerder te twijfelen aan het schuifregister zelf, dat dat misschien kapot is of zo...

Ontwikkelaar van de Heatpump Listener en Itho Daalderop warmtepomp control module


  • leejoow
  • Registratie: Juni 2007
  • Niet online

leejoow

Dat ben ik!

Topicstarter
Ik voel mij zo DOM |:(

Ik heb heel erg sterk het gevoel dat er een fout in mijn assembly code zit: in LED1 hou ik de gewenste waarde bij. Ik laat een tellertje lopen en ik trek de waarde van de teller af van de gewenste waarde. Als deze uitkomst negatief is wordt de led hoog, anders laag.

Op het moment dat de teller overflowed naar 0 gaat het natuurlijk fout: gewenste waarde (0) - teller waarde (0) gaat uiteraard niet negatief en daardoor wordt de uitgang hoog gemaakt...

Vanavond toch maar eens kijken hoe ik dit beter kan oplossen. In elk geval bedankt voor de hulp! _/-\o_

Ontwikkelaar van de Heatpump Listener en Itho Daalderop warmtepomp control module


  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:37

Onbekend

...

leejoow schreef op maandag 21 januari 2008 @ 12:09:
[...]
Het enige dat dit doet is compiler waarschuwingen verbergen, ik zal als ik thuis ben eens kijken wat er gebeurd als ik deze regel weghaal. Kan het me niet voorstellen, maar misschien zit ergens naar de verkeerde bank te schrijven...
Heb je al de waarschuwing uitgezocht/opgelost? Je lees/schijft namelijk in de verkeerde geheugenbank en daardoor kan je vreemde waardes krijgen.

Speel ook Balls Connect en Repeat


  • leejoow
  • Registratie: Juni 2007
  • Niet online

leejoow

Dat ben ik!

Topicstarter
Onbekend schreef op dinsdag 22 januari 2008 @ 07:58:
[...]

Heb je al de waarschuwing uitgezocht/opgelost? Je lees/schijft namelijk in de verkeerde geheugenbank en daardoor kan je vreemde waardes krijgen.
Ik schrijf in de goede geheugenbanken :) Om de een of andere reden vindt de compiler het nodig om mij te waarschuwen dat ik mogelijkerwijs wel eens een fout zou kunnen maken en of dat ik gecontroleerd heb of ik wel in de goede bank schrijf. Lang leve de intelligentie van compilers _/-\o_

Ontwikkelaar van de Heatpump Listener en Itho Daalderop warmtepomp control module

Pagina: 1