Ik heb een vreemd iets waar ik niet uit kom, misschien iets simpels en kleins maar ik zie het dan vast over t hoofd... Het volgende: Heb een piezo buzzertje van 5V ( < 10mA ) en deze hangt rechtstreeks met de + aan PORTC.2 van mijn PIC en met de - aan GND. Als ik deze poort hoog maak hoor ik een mooi pieptoon, echter zodra ik ook maar 1 van de andere C Poorten hoog maak wordt de uitgang laag. Ik heb heel mijn programma nu gereduceerd tot het onderstaande als test maar het blijft. Ik heb uiteraard alle Oscillator instellingen en snelheden geprobeerd. De printplaat is ruimschoots voorzien van 100nfjes en als voeding USB/Adapter/Labvoeding geprobeerd met hetzelfde resultaat.
Wie o wie ?
Device 18F14K22
Xtal = 64 ' = 16 mhz interne OSC * 4 PLL
Config_Start
FOSC = IRC ;HS ; Internal RC oscillator
PLLEN = OFF ; PLL is under software control
PCLKEN = OFF ; Primary clock is under software control
FCMEN = OFF ; Fail-Safe Clock Monitor disabled
IESO = OFF ; Oscillator Switchover mode enabled
PWRTEN = OFF ; PWRT enabled
BOREN = OFF ; Brown-out Reset enabled and controlled by software (SBOREN is enabled)
BORV = 30 ; VBOR set to 2.2 V nominal
WDTEN = OFF ; WDT is controlled by SWDTEN bit of the WDTCON register
WDTPS = 64
MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
HFOFST = OFF ; The system clock is held off until the HF-INTOSC is stable.
STVREN = OFF ; Stack full/underflow will cause Reset
LVP = Off ; Single-Supply ICSP enabled
BBSIZ = OFF ; 1kW boot block size
XINST = Off ; Instruction set extension and Indexed Addressing mode enabled
Cp0 = OFF ; Block 0 code-protected
CP1 = OFF ; Block 1 (002000-003FFFh) code-protected
CPB = OFF ; Boot block (000000-0007FFh) code-protected
CPD = OFF ; Data EEPROM code-protected
WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
WRTB = OFF ; Boot block (000000-0007FFh) not write-protected
WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
WRTD = OFF ; Data EEPROM not write-protected
EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
EBTRB = OFF ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks
Config_End
' 76543210
OSCCON = %01110000 ' 16MHz, Internal oscillator ' Bit 1 en 0 moeten allebei op 0 staan om PPL te KUNNEN activeren.
OSCTUNE.6 = 1 ' Daadwerkelijk PLL activeren.
All_Digital TRUE ;Alle ingangen digitaal
; 76543210
PORTA = %00000000
PORTB = %00000000
PORTC = %00000000
TRISA = %00000000
TRISB = %00000000
TRISC = %00000000
DelayMS 500 ' PIC laten rusten voor opstarten..
PORTC.2 = 1 ' Poort van de Piezo buzzer..
DelayMS 2000
Main:
PORTC.1 = 1
GoTo Main
End
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Zal aan de grote capacitieve belasting van de poort liggen door de piezo.
Je moet ook LATC.1/2 gebruiken, en niet PORTC.1/2, dan heb je ook geen problemen...
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Da's altijd beter. Maar blijft ook dat je altijd de LATx registers moet gebruiken voor output als de PIC die heeft (16F1xxx, 18F en hoger...)
PORTx register is voor input, LATx register is voor output.
Hunter
Damn the torpedoes, full speed ahead!
Volgens Microchip;
A write operation to the LATx register has the same effect as a write to the corresponding PORTx register. A read of the LATx register reads of the values held in the I/O PORT latches, while a read of the PORTx register reads the actual I/O pin value.
Wat gebeurt er als je de buzzer vervangt door een led?
Treedt het probleem ook op als je een andere port gebruikt?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Een bit-write naar een LATx register doet een operatie op de laatst daarin geschreven waarde.
Bij PORTx wordt de bit-operatie uitgevoerd op de actueel ingelezen i/o poort waarde. (bij capacitieve belasting als een piezo krijg je dan verkeerde waardes)
sommige pics hebben een read modify write probleem. Daarbij volgt de uitgang bijvb PORTB niet alijd wat je naar PORTB schrijft. De uitgangbit veranderd te traag, en de pic leest ergens de nog niet veranderde uitgang terug in. Staat ergens in de manuals hoe precies
Kan opgelost worden door LAT te gebruiken, zoals reeds aangehaald ofwel een tijdelijke buffer gebruiken (byte ) , en daar eerst uw bewerkingen uit te voeren (bcf, bsf, etc) en dan op het einde die tijdelijke buffer naar uw PORT te schrijven.
Hunter
Damn the torpedoes, full speed ahead!
Er wordt hier een bit geset, dat heeft niks te maken met de waarde die aanwezig was.
Een "piezo-buzzer van 5v (<10 mA)" lijkt mij gewoon een rommelige dc-belasting en geen capacitieve.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Als je in een register een bit verandert, is dat altijd een read/modify/write operatie. Register wordt gelezen, bit(s) worden gewijzigd en dan terug geschreven.
Als je dan bijv. de piezo aanzet, en vervolgens een andere pin in die poort wijzigt, zal de piezopin nog niet de juiste waarde hebben en dus fout worden teruggeschreven.
(ik raad aan de datasheet over R-M-W eens door te lezen)
Piezo is een lichte belasting. Maar als het echt 10mA is, dan is dat ook te veel (max 8.5mA sink en 3.5mA source om geen RMW effect te krijgen)
Hunter
Damn the torpedoes, full speed ahead!
@ Arco. Heb ondertussen TB3009 gelezen. Dank, is dat de datasheet die je bedoelde, of is er nog meer?
Uit de opmerking 5V (<10 mA) maak ik op dat het een DC-buzzer is, waarin een lf oscillator is ingebouwd. Die oscillator kan dan zorgen voor een (door mij zo grnoemde) rommelige belasting. Misschien helpt het om een buffercondensator over de buzzer te zetten. De laatste keer dat ik zo'n buzzer uit elkaar heb gehaald zat er ook een spoeltje in. Dat maakt het als belasting iets complexer.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Staat o.a. in de PicMicro Mid-Range MCU Family Reference Manual (DS33023A)
Ik zie 'm zo gauw niet meer op de Microchip site, zie bijlage. (zie hoofdstuk 9.10 - I/O considerations)
De snelste had het ook meteen goed.. LATC gebruiken. Nooit geleerd en dus ook nooit geweten, vanaf nu doen we het goed .. Thanx daarvoor. Voor nu werkt het prima, in het hoe en waarom ga ik mij later in verdiepen want dit soort tijdrovende eigenaardigheden blijf ik liever voor.
Of een led hetzelfde gedrag vertoond kan ik nu niet testen ( daar zou ik het project nu helemaal voor open moet schroeven, doen we op een later moment vast nog wel ... )
Ondanks dat het nu werkt, in de toekomst toch een transistor er voor gebruiken 
Dank aan allen !