PIC18LF1320 på etsat kretskort med display mm enligt schemat.
Jag märkte att displayen visade olika saker varje gång jag anslöt matningspänningen till kortet.
Ibland initierades den inte ordentligt (övre raden, av två, var svart), ibland visade den test-texten jag ville visa, ibland på rad 1 & kolumn 1, ibland i slutet på rad två, ibland var displayen tom.
Därför lödde jag dit kondingarna uppe vid displayen, för att se om det hjälpte. Tyvärr blev det ingen skillnad.
Då plockade jag bort motstånden R2 och R3 (inringade i schemat) för att se om reläerna hade något med saken att göra. Ingen skillnad.
Nästa debug-steg var att plocka bort displayen och sätta dit en liten rad med lysdioder (inkl motstånd).
Gjorde en liten kodsnutt som växlade mellan att växelvis tända lysdioderna kopplade till RB0 - RB3 respektive RA0 - RA2.
Men jag fick samma oregelbundna resultat där när jag ansluter matningspänningen:
Ibland blinkar lysdioderna som de ska. Ibland lyser först de som är anslutna till RB0 - RB3, sedan slocknar de och de som är kopplade till RA0 - RA2, sedan förblir de sistnämnda tända och inget mer händer. Ibland tänds lysdioden kopplad till RB2 för att kort där efter (uppskattningsvis 100ms) slockna och tända de som är kopplade till RA0 - RA2.
Jag har gjort 3-4 olika källkoder, 2st i assembler och 1st i MikroBasic. Pga alla debug-tester så är inte assemblerkoden så fin längre (inte MikroBasic-koden heller för den delen), men det här är iallafall den senaste koden, den som jag använt under LED-blink-testerna:
Kod: Markera allt
' HSPLL_OSC IESO_OFF FSCM_OFF BOR_OFF PWRT_ON WDT_OFF MCLRE_ON BKBUG_ON LVP_OFF STVR_OFF
' CONFIG_7L ska vara "ON" på båda i Device Flags.
'
' Kristall på 10MHz. Använder 40MHz, dvs HSPLL.
'------------------------------
sub procedure Init
TRISA.0 = 0 ' LCD_RS
TRISA.1 = 0 ' LCD_E
TRISA.2 = 0 ' LCD_RW
TRISA.3 = 0 ' Knapp_steg <-- Satt till utgång i debugsyfte.
TRISA.4 = 0 ' Encoder2 <-- Satt till utgång i debugsyfte.
TRISA.5 = 1 ' MCLR
TRISA.6 = 1 ' OSC2
TRISA.7 = 1 ' OSC1
TRISB.0 = 0 ' LCD_D4
TRISB.1 = 0 ' LCD_D5
TRISB.2 = 0 ' LCD_D6
TRISB.3 = 0 ' LCD_D7
TRISB.4 = 0 ' Encoder1 <-- Satt till utgång i debugsyfte.
TRISB.5 = 0 ' Start / Stopp <-- Satt till utgång i debugsyfte.
TRISB.6 = 0 ' Relä (och PGC)
TRISB.7 = 0 ' PGD
PORTA = $00
PORTB = $00
LCD_RW = 0
T0CON.TMR0ON = 0 ' Stops Timer0
T1CON.TMR1ON = 0 ' Stops Timer1
T2CON.TMR2ON = 0 ' Stops Timer2
T3CON.TMR3ON = 0 ' Stops Timer3
CCP1CON.CCP1M3 = 0 ' Capture/Compare/PWM off
CCP1CON.CCP1M2 = 0 ' Capture/Compare/PWM off
CCP1CON.CCP1M1 = 0 ' Capture/Compare/PWM off
CCP1CON.CCP1M0 = 0 ' Capture/Compare/PWM off
RCSTA.SPEN = 0 ' Serialport (RX/TX) disabled
ADCON0.ADON = 0 ' A/D converter disabled
ADCON1 = $FF ' AD0 - AD6 configurated as digital i/o
LVDCON.LVDEN = 0 ' Low-voltage detect power disabled
WDTCON.SWDTEN = 0 ' Watchdog timer OFF
INTCON.GIE = 0 ' Global interrupt enable bit <---------- OFF
INTCON.PEIE = 0 ' Peripheral interrupt enable bit <------ OFF
INTCON.TMR0IE = 0 ' TMR0 Overflow interrupt
INTCON.INT0IE = 0 ' INT0 External interrupt
INTCON.RBIE = 0 ' RB port change interrupt <---- OFF
INTCON.TMR0IF = 0 ' TMR0 overflow interrupt flag
INTCON.INT0IF = 0 ' INT0 external interrupt flag
INTCON.RBIF = 0 ' RB port change interrupt flag <----
INTCON2.RBPU = 1 ' PortB pull-ups are disabled
INTCON2.INTEDG0 = 1 ' External interrupt 0 on rising edge
INTCON2.INTEDG1 = 1 ' External interrupt 1 on rising edge
INTCON2.INTEDG2 = 1 ' External interrupt 2 on rising edge
INTCON3.INT2IE = 0 ' External INT2 interrupt enable bit
INTCON3.INT1IE = 0 ' External INT1 interrupt enable bit
INTCON3.INT2IF = 0 ' INT2 external interrupt flag
INTCON3.INT1IF = 0 ' INT1 external interrupt flag
PIR1.TMR1IF = 0 ' TMR1 overflow interrupt flag
PIR2.TMR3IF = 0 ' TMR3 overflow interrupt flag
PIE1.ADIE = 0 ' A/D converter interrupt disabled
PIE1.RCIE = 0 ' EUSART recieve interrupt disabled
PIE1.TXIE = 0 ' EUSART transmit interrupt disabled
PIE1.CCP1IE = 0 ' CCP1 interrupt disabled
PIE1.TMR2IE = 0 ' TMR2 to PR2 match interrupt disabled
PIE1.TMR1IE = 0 ' TMR1 overflow interrupt disabled
PIE2.OSCFIE = 0 ' Oscillator fail interrupt disabled
PIE2.EEIE = 0 ' Data EEPROM/Flash-write interrupt disabled
PIE2.LVDIE = 0 ' Low-voltage detect interrupt disabled
PIE2.TMR3IE = 0 ' TMR3 overflow interrupt disabled
RCON.IPEN = 0 ' Disable priority levels on interrupt
OSCCON.IDLEN = 0 ' CPU core is clocked in Run modes
OSCCON.SCS1 = 0 ' Primary oscillator
OSCCON.SCS0 = 0 ' Primary oscillator
WDTCON.0 = 0 ' WDT Off
end sub
sub procedure LED_1
LCD_D7 = 1
LCD_D6 = 1
LCD_D5 = 1
LCD_D4 = 1
LCD_RS = 0
LCD_E = 0
LCD_RW = 0
end sub
sub procedure LED_2
LCD_D7 = 0
LCD_D6 = 0
LCD_D5 = 0
LCD_D4 = 0
LCD_RS = 1
LCD_E = 1
LCD_RW = 1
end sub
main:
Init
while 1 = 1
LED_1
delay_ms(500)
LED_2
delay_ms(500)
LED_1 ' Klistrar in fler rader trots while-loopen.
delay_ms(500)
LED_2
delay_ms(500)
LED_1
delay_ms(500)
LED_2
delay_ms(500)
LED_1
delay_ms(500)
LED_2
delay_ms(500)
LED_1
delay_ms(500)
LED_2
delay_ms(500)
LED_1
delay_ms(500)
LED_2
delay_ms(500)
wend
end.
Någon som ser något galet? Jag börjar bli lite blind efter att ha suttit med detta i två dagar.
edit:
Jag missade att klistra in första delen av koden i rutan här över:
Kod: Markera allt
symbol LCD_RS = PORTA.0
symbol LCD_E = PORTA.1
symbol LCD_RW = PORTA.2
symbol LCD_D4 = PORTB.0
symbol LCD_D5 = PORTB.1
symbol LCD_D6 = PORTB.2
symbol LCD_D7 = PORTB.3
