16f88 PORTB.1 als uitgang

Ik krijg op een 16f88 poort B1 niet werkend als digitale uitgang.
Wat doe ik verkeerd ?

pic basic code:

Device 16F88
 
@CONFIG_REQ
@__CONFIG _CONFIG1, CP_OFF & CCP1_RB0 & DEBUG_OFF & WRT_PROTECT_OFF & CPD_OFF & LVP_OFF & BODEN_ON & MCLR_OFF & PWRTE_ON & WDT_OFF & INTRC_IO
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF
 
Xtal 8
 
; OSCCON Oscillator Control Register:
; bit 7: unimpl. read as 0
; bit 6-4: frequency (IRCF):
; 110: 4 mhz
; 111: 8 mhz
; bit 3: OSTS: 1 (run from primary system clock), 0 (run from T1OSC or INTRC as a secondary system clock)
; bit 2: IOFS: INTOSC Freq. stable bit (1 stable, 0 not stable)
; bit 1-0: ; SCS<1:0>
; 00: OSC mode defined by fuse / configuration bits (FOSC<2:0>)
; 01: T1OSC is used for system clock
; 10: Internal RC is used for system clock
; 11: Reserved (don't use it)
OSCCON = %01111000
 
Declare Adin_Res 10
;Declare ADIN_TAD FRC
; Allow ?? us sample time, typical is 50-100, this allows
; adequate charge time without losing too much conversion speed.
; According to page 119 of the 16F88 datasheet, typical AD
; conversion takes 11-12 TAD. Using FRC nets an average of 4
; us per TAD. A minimum of 48 us is therefore recommended. But
; TAD time of FRC varies between 2-6 us! So worst-case, conversion
; takes 12 * 6 = 72 us. To be sure, use ADIN_STIME 75.
Declare Adin_Stime 75

Symbol OUT_HHaccu    = PORTA.4
Symbol OUT_Backlight = PORTA.6
Symbol Switch        = PORTA.7
Symbol OUT_STaccu    = PORTB.0
Symbol OUT_HH__ST    = PORTB.1
 
Dim UPAN As Dword
Dim POTM As Dword
Dim UST As Dword
Dim UHH As Dword
Dim Teller As Word
Dim UDelta As Word 
Dim HH_max As Word
Dim ST_max As Word
Dim Tellerbacklight As Byte
Dim Tellerreturn As Word
; Disable comparators, CMCON = 7
CMCON  = %00000111
; All pins of port A low
PORTA  = %00000000
; AN1 as an input
TRISA  = %10001111
; AN1 is analog
ANSEL  = %00001111
; Use FRC, Channel 1 (RA1/AN1, pin 18), clear GO/DONE bit (is
; automatically set by ADIN when converting), and turn on ADC.
; This is why ADIN_TAD is commented out above, the use of
; FRC can also be set directly into ADCON0 (2 MSB's):
ADCON0 = %11001001
; Right justified (A/D Result), AD clock divide by 2 disabled,
; voltage ref. config bits set to 00 (AVdd = Vref+, AVss = VRef-).
ADCON1 = %00000000
Declare LCD_ENPin PORTB.2
Declare LCD_RSPin PORTB.3
Declare LCD_DTPin PORTB.4 
Clear

Hoe weet je dat die poort niet werkt? uit dit stuk code kan ik dat niet opmaken.

pic basic code:

Device 16F88
 
@CONFIG_REQ
@__CONFIG _CONFIG1, CP_OFF & CCP1_RB0 & DEBUG_OFF & WRT_PROTECT_OFF & CPD_OFF & LVP_OFF & BODEN_ON & MCLR_OFF & PWRTE_ON & WDT_OFF & INTRC_IO
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF
 
Xtal 8
 
; OSCCON Oscillator Control Register:
; bit 7: unimpl. read as 0
; bit 6-4: frequency (IRCF):
; 110: 4 mhz
; 111: 8 mhz
; bit 3: OSTS: 1 (run from primary system clock), 0 (run from T1OSC or INTRC as a secondary system clock)
; bit 2: IOFS: INTOSC Freq. stable bit (1 stable, 0 not stable)
; bit 1-0: ; SCS<1:0>
; 00: OSC mode defined by fuse / configuration bits (FOSC<2:0>)
; 01: T1OSC is used for system clock
; 10: Internal RC is used for system clock
; 11: Reserved (don't use it)
OSCCON = %01111000
 
Declare Adin_Res 10
;Declare ADIN_TAD FRC
; Allow ?? us sample time, typical is 50-100, this allows
; adequate charge time without losing too much conversion speed.
; According to page 119 of the 16F88 datasheet, typical AD
; conversion takes 11-12 TAD. Using FRC nets an average of 4
; us per TAD. A minimum of 48 us is therefore recommended. But
; TAD time of FRC varies between 2-6 us! So worst-case, conversion
; takes 12 * 6 = 72 us. To be sure, use ADIN_STIME 75.
Declare Adin_Stime 75

Symbol OUT_HHaccu    = PORTA.4
Symbol OUT_Backlight = PORTA.6
Symbol Switch        = PORTA.7
Symbol OUT_STaccu    = PORTB.0
Symbol OUT_HH__ST    = PORTB.1
 
Dim UPAN As Dword
Dim POTM As Dword
Dim UST As Dword
Dim UHH As Dword
Dim Teller As Word
Dim UDelta As Word 
Dim HH_max As Word
Dim ST_max As Word
Dim Tellerbacklight As Byte
Dim Tellerreturn As Word
; Disable comparators, CMCON = 7
CMCON  = %00000111
; All pins of port A low
PORTA  = %00000000
; AN1 as an input
TRISA  = %10001111
; AN1 is analog
ANSEL  = %00001111
; Use FRC, Channel 1 (RA1/AN1, pin 18), clear GO/DONE bit (is
; automatically set by ADIN when converting), and turn on ADC.
; This is why ADIN_TAD is commented out above, the use of
; FRC can also be set directly into ADCON0 (2 MSB's):
ADCON0 = %11001001
; Right justified (A/D Result), AD clock divide by 2 disabled,
; voltage ref. config bits set to 00 (AVdd = Vref+, AVss = VRef-).
ADCON1 = %00000000
Declare LCD_ENPin PORTB.2
Declare LCD_RSPin PORTB.3
Declare LCD_DTPin PORTB.4 
Clear
DelayMS 500
Cls
OUT_STaccu = 0
OUT_HHaccu = 0
OUT_HH__ST = 0
OUT_Backlight = 1 
DelayMS 500
While 1 = 1
Toggle OUT_HH__ST
DelayMS 3000
Wend
End
Arco

Special Member

Wat heb je aangesloten op RB1?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

De uitgang RB1 van de pic is aangesloten op een ingang van een ULN2803.
RA4, RA6 en RB0 zijn ook aangesloten op dezelfde ULN2803 en werken wel.

Arco

Special Member

Zou moeten werken. Is de ULN niet gewoon kapot? (of de RB1 pin van de 16F88?)

[Bericht gewijzigd door Arco op zondag 8 april 2018 11:07:16 (24%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ik weet vrijwel niks van Pic basic dus misschien dat er onder water van alles gebeurt en ik een onzinnige opmerking maak, maar waarom initialiseer je wel trisa en niet trisb?

In dit geval zou ik de code terugbrengen tot zijn meest simpele vorm, dus alleen die pin aan en uit zetten, en dan liefst met LOW en HIGH, om te checken of de output pin en de ULN nog werken. Mij gebeurt het met enige regelmaat dat ik er zo achter kom dat ik de verkeerde pin gebruik.

Als ik de pic er uit haal en dan pin 7 met de 5v verbind schakelt het relais via de ULN.
Nieuwe pic er in gezet en bovenstaande programma aangevuld;

pic basic code:

Clear
DelayMS 500
Cls
DelayMS 500
Print At 1, 1, "test lcd voor while"
OUT_STaccu = 0
OUT_HHaccu = 0
OUT_HH__ST = 0
OUT_Backlight = 1 
DelayMS 2000
While 1 = 1
Toggle OUT_HH__ST
Print At 3, 1, "test lcd in while"
DelayMS 3000
Wend
End

test lcd voor while --> Tekst goed op lcd
test lcd in while --> gaat niet goed op lcd TEQT@LAD@IL@UHILE

Een fout in de configuratie ?
maar waar

Op 8 april 2018 11:26:21 schreef Paulussie:
, maar waarom initialiseer je wel trisa en niet trisb?

Da's gewoon /de/ fout. Spijker op z'n kop en zo.

Ik heb geen verstand van PICs maar zoals verwacht initialiseert TRISB op "alles input" (alle bitjes hoog).

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

Picbasic schijnt een pin automatisch te definieren als output wanneer je er naartoe schrijft... (maar trisb is misschien wat netter)
Wat bedoel je met lcd test "gaat niet goed"? (zie je helemaal niks?)
En wat stelt " TEQT@LAD@IL@UHILE" voor??

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Maar doet PicBasic dat ook als je zoals hier een poort als variabele definieert en dan de waarde direct wijzigt? Commando's als LOW en HIGH zullen tris wel setten maar als je een bit op een output port verandert gebeurt dat wellicht niet. Althans, niet in de code die uit mijn C compiler rolt :-)

Arco

Special Member

Schijnbaar wel. Maar daar zal 't trouwens niet aan liggen als de lcd_write wel werkt buiten de while loop en niet erin...
Ik heb het nooit zo op 'zelfdenkende' compilers die dingen doen die ik niet wil, doe ik zelf wel...

[Bericht gewijzigd door Arco op zondag 8 april 2018 12:08:32 (29%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Print At 1, 1, "test lcd voor while" wordt weergegeven test lcd voor while.

Print At 3, 1, "test lcd in while" wordt weergegeven als TEQT@LAD@IL@UHILE

Ik heb het geprobeerd met low en high, maakt geen verschil.
Als PORTB.1 niet gebruikt wordt in het programma dan wordt alles goed weergegeven op het display.

Als PORTB.1 laag of hoog gemaakt wordt dan gaat het mis, onleesbare teksten op het display.

Als ik TRISB = %00000000 er in zet gaat het niet goed met het display,
onleesbare teksten.

Arco

Special Member

Als je de pin een 'normale' naam geeft werkt het ook niet? (zonder dubbele underscores. Namen die met een underscore beginnen vindt picbasic n.l. ook niet fijn)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lambiek

Special Member

Als je iets onder "DECLARE" zet hoef je verder niets in te stellen onder "TRISA, TRISB, TRISC, enz." maar als je dat niet doet, moet je altijd "TRIS" neer zetten.

Dat is ook de reden dat je display wel werkt, en je uitgang niet.

pic basic code:


Declare LCD_ENPin PORTB.2
Declare LCD_RSPin PORTB.3
Declare LCD_DTPin PORTB.4
Als je haar maar goed zit, GROETEN LAMBIEK.

Als PORTB.1 niet gebruikt wordt in het programma dan wordt alles goed weergegeven op het display.

Als PORTB.1 laag of hoog gemaakt wordt dan gaat het mis, onleesbare teksten op het display.

Even voor de zekerheid: Ik begrijp nu dat:

- Poort B1 niet (nooit) werkt als output.
- Het PRINT commando wel werkt in de while loop als er vlak daarvoor geen TOGGLE commando wordt gegeven
- Het PRINT commando niet werkt in de while loop als er vlak daarvoor wel een TOGGLE commando wordt gegeven

Komt er ook een list file (een file waarin je kunt zien in welke assembler de Picbasic commando's vertaald zijn) uit de compiler?

Want zowel TOGGLE als PRINT zullen trisb zetten. Misschien dat daar iets fout mee gaat?

En nogmaals: trim het programma terug naar het bare minimum en kijk of je die poort dan wel kunt besturen. Gewoon iets in de trant van:

pic basic code:

DEVICE 16F88                ;We gebruiken een 16F88 type
CONFIG wat_er_nodig_is_om_een 16F88_te_laten_starten
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

Opnieuw:                      ;Label met zelf te verzinnen naam
TOGGLE PORTB.1                ;Aan moet uit, uit moet aan
DELAYMS 500                   ;500 milliseconden = 0,5 seconde
GOTO Opnieuw                  ;Spring naar 'Opnieuw' en ga zo steeds door 

END                           ;Einde programma

Met dank aan http://www.picbasic.nl/

Arco

Special Member

Op 8 april 2018 12:24:02 schreef Lambiek:
Dat is ook de reden dat je display wel werkt, en je uitgang niet.

Dat verklaart niet waarom lcd write in de while loop niet, en daarbuiten wel werkt... Schijnbaar 'schrikt' de compiler van die 'OUT_HH__ST'

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lambiek

Special Member

Ja, dat is ook vreemd. Maar ik vind de hele opbouw van het programma vreemd, maar misschien zijn het stukjes van de code. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

print at 3, x veronderstelt een lcd met 3 (nog nooit gezien) of 4 regels. aangezien de meeste lcd's maar 2 regels hebben zou de fout hier wel eens in kunnen zitten

Just find out what you like and let it kill you
Arco

Special Member

Ik nam aan dat het ook een 4 regel display was... ;)
Maar er zijn ook wat displays die afwijkend ik mekaar steken. Bijv. sommige 1x16 displays bestaan intern uit 2 regels van 8 karakters...
Bij vroegere 4x20/4x40/2x40 displays waren er ook soortgelijke eigenaardigheden.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Declare LCD_Lines 1,2 or 4
If the declare is not used in the program, then the default number is 2.
(rtfm)
@arco: nooit zomaar iets aannemen tenzij je in de bouw zit...

[Bericht gewijzigd door hadv op maandag 9 april 2018 13:15:58 (23%)

Just find out what you like and let it kill you