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



        

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...

Gewoon met een uitgangstranistortje.

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.

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?

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.

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.

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)

@ 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.

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)

16xxref-man.pdf

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 !