Tussen al het kundige praktsiche handwerk hierboven door is het misschien leuk om even naar een programmeer puzzeltje te kijken ? Niet dat ik erop vastloop maar gewoon uit nieuwsgierigheid waar hier de storing zit. Ben er zelf meerdere uren mee bezig geweest maar ik heb hiervoor nog te weinig programmeer kennis. Deze pagina bevat drie interrupt voorbeelden, twee ervan werken goed zowel in Simulide als in het echt op breadboard; alleen de eerste Serial Interrupt is niet gelukt:
https://embetronicx.com/t...f877a-interrupt-tutorial/
Daarbij zit een Github
https://github.com/Embetr...nterrupt/Serial_Interrupt
waarvan ik de volgende drie files in MPLab 5.45 heb gezet en gecompileerd:
https://github.com/Embetr...t/Serial_Interrupt/code.c
https://github.com/Embetr...pt/Serial_Interrupt/lcd.h
https://github.com/Embetr...Serial_Interrupt/serial.h
Om #include<pic.h> te kunnen gebruiken is een DFP instelling van 1.2.33 nodig op XC8 V2.20.
Om
void interrupt ser() gecompileerd te krijgen heb ik het aangepast tot
void __interrupt() ser(void).
Het programma werkt zo dat indien er een toets wordt ingedrukt er tekst op een LCD HD44780 verschijnt dat weer verdwijnt via
cmd(0x01); // Clear Display na een tijdje via
delay;delay; totdat er weer een toets wordt ingedrukt, enz. De maker gebruikt Proteus maar die heb ik niet met PIC vergunning vandaar dat ik Simulide heb als alternatief. En op breadboard natuurlijk maar in het algemeen kan wel gesteld worden dat indien het in Simulide werkt het ook op breadboard werkt.
Toets O ingedrukt maar de interrupt wordt niet aangesproken
Ik ben met debug door het programma gestapt en de registers nageplozen volgens het datablad van de PIC16F877A
https://ww1.microchip.com...nts/DataSheets/39582C.pdf
INTCON code.c pagina 24
PIE1 code.c pagina 25
TXSTA serial.h pagina 111
RCSTA serial.h pagina 112
SPBRG serial.h pagina 113
RCREG serial.h en code.c pagina 118
PIR1 die de vlaggen TXIF en RCIF bevat op pagina 26
In de comments onder het hoofdartikel staat trouwens dat dit Read-only is en dat deze regels dus geen effect zouden hebben?
TXIF=RCIF=0; en is zowel in code.c als in serial.h te vinden.
lcd.h bevat geen registers maar wel commands die hier terug te vinden zijn
https://www.8051projects.net/lcd-interfacing/commands.php
0x80 staat voor positie 0 op regel 1.
0xC0 staat voor positie 0 op regel 2, 0xC8 staat voor positie 8 op regel 2
Deze regel in serial.h vind ik wat vreemd
TRISC6=TRISC7=1; waardoor zowel pin TX als RX op input worden gezet, maar goed, er hoeft niets ontvangen te worden op de Terminal dus ik neem aan dat dit geen foutje is. Een aangebrachte wijziging hierin had geen effect. Hier een pin-out van het IC dat hetzelfde is als in Simulide.
https://images.theenginee...duction-to-PIC16F877a.png
Mocht iemand het leuk vinden om de code te bekijken en eventueel een tip kan geven over iets wat er te proberen valt dan hoor ik het graag
***************************************************************************** Edit:
Doet het ineens

Na enkele dagen
__CONFIG( FOSC_HS & WDTE_OFF & PWRTE_OFF & CP_OFF & BOREN_ON & LVP_OFF & CPD_OFF & WRT_OFF & DEBUG_OFF);
vervangen met :
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#define _XTAL_FREQ 11059200 |
Maar dat maakte geen verschil volgens mij. Soms is lastig te bepalen wat het precies is want kan ook een combinatie van zijn geweest. Zo werd Delay 2x defined in code.c en lcd.h dus heb in code.c er delay2 van gemaakt om de warning eruit te krijgen.
TXIF=RCIF=0; commented in code.c hielp aanvankelijk ook niet, pas nadat ik een zelfde regel in serial.h commented had kwam het LCD, dus de interrupt op gang
Mijn comments op het scherm waren ooit net zo grijs als het code blokje hierboven maar dat is aangepast
via Tools > Options > Fonts & Colors > Comment
*************************
SPBRG pagina 114 op decimaal 31 gezet voor 9600 bij 20 MHz want een 11.0592 MHz kristal heb ik niet en
#define _XTAL_FREQ 20000000 en HTerm als serial terminal erbij geopend.
Helaas geen reactie IRL bij de breadboard opstelling maar dat zou eventueel door gammele draadjes kunnen komen
**********************
Edit3
Bleek inderdaad aan gammele aansluitingen te liggen, in het breadboard zelf
Heb een tweede IC besteld als een controleboardje ernaast. Gaat veel tijd inzitten dat eigenlijk verloren tijd is op wat ervaring krijgen met foutzoeken na.
.
[
Voor 29% gewijzigd door
kitao op 14-08-2025 03:31
. Reden: typo ]