Ploink schreef op vrijdag 20 februari 2015 @ 22:40:
Met PIC16 heb ik hardware I2C of SPI eigenlijk nooit gebruikt. Het was veel simpeler vond ik om dat gewoon te bit-bangen in ASM.
De PIC hardware was me ook te variabel, had je net peripheral code voor de ene chip geschreven, was voor de andere chip alles weer anders en er zijn wel honderd varianten lijkt het wel.
Ik wil twee dezelfde devices gebruiken als master en slave, dus dat zou an sich niet zo'n probleem zijn. Maar inderdaad, al die peripherals die anders zijn. Niet veel, maar wel net even anders.
Afijn, ik heb
hier de actuele mastercode staan.
Aantal rode en groene LED's toegevoegd (en het raster bovenin aangepast). Een LED, de zgn. lifeled, die zo nu en dan een knipper moet geven (op bepaalde regels in het programma). RC6. Blijft aan staan. RC5 is een groen LEDje, is voor mij makkelijker, dat pas in de 2e helft van het programma aan moet gaan (op het moment dat RC6 na een uitschakeling ook weer inschakelt). Wordt aan het begin van het I2C circus ook nog uitgezet (en aan het einde nogmaals). Zowel RC5 als RC6 branden continue.
Hebben we tot slot nog RC3 en RC7. Aan RC3 hangt een rood LEDje, als de gelezen data niet overeen komt met wat ik gestuurd heb, moet die rood worden. RC7 is groen, als de gelezen data wel overeen zou komen met wat ik naar de EEPROM heb gestuurd. Doen allebij helemaal niets.
Delays zijn niet te lang, een delay van 100.000 levert een LEDje op dat in 3 seconde een keer of 4-5 knippert.
Het programma blijft dus hangen in de read, maar waar?
Ik vermoed zelf in de i2c_wait loop... EDIT: Hij blijft hangen op de while(!BF); in het i2c_read loopje. Commentaar ik die dan loopt hij wel door en licht iedere keer het rode LEDje uit het IF statement (wel of geen correcte data) op.
code:
1
2
3
4
5
6
7
8
9
| unsigned char i2c_read(void)
{
// unsigned char tdlk; // tijdelijke data
RCEN = 1; // maak lezen en data ontvangen mogelijk, receive mode
===> while(!BF); // wachten tot buffer//SSPBUF is gevuld met ontvangen data
tdlk = SSPBUF; // tijdelijk kopiëren van SSPBUF naar tijdelijk (tdlk)
i2c_wait(); // wacht op overdracht
return tdlk; // doe iets met tijdelijk, geef tijdelijk vrij aan code
} |
Hier dus
[
Voor 15% gewijzigd door
Pizza_Boom op 20-02-2015 23:47
]