PIC-kretsen låser sig vid olika tillfällen

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
JimmyAndersson
Inlägg: 26526
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

PIC-kretsen låser sig vid olika tillfällen

Inlägg av JimmyAndersson »

Nu ska vi se..

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
Nu så. :)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av sodjan »

> Jag märkte att displayen visade olika saker varje gång jag anslöt matningspänningen till kortet.

Är det stabilt om du gör en "soft-reset" (d.v.s utan att bryta spänningen) av kortet ?

Ser du till att displayen får starta ordetnligt innan du försöker skriva till den ?
Exakt tid varierar med controller, men ha gärna c en sekunds delay i koden
innan LCD rutinerna körs.
TotteBasicPic
Inlägg: 36
Blev medlem: 30 december 2008, 11:38:08
Ort: Halmstad

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av TotteBasicPic »

D0-D3 på Displayen
Måste vara jordade

H/Thomas
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av sodjan »

> D0-D3 på Displayen måste vara jordade.

Nej.
Användarvisningsbild
JimmyAndersson
Inlägg: 26526
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av JimmyAndersson »

Det blir likadant vid en soft-reset.

Nu vill sällan displayen initeras korrekt när jag ansluter spänningen eller gör en soft-reset.
Har testat att lägga in en 2sek paus initiering och en 2sek-paus innan jag försöker skriva till den, men det blir likadant.

De senaste ca 10 gångerna har inte displayen initierats korrekt. Lysdiodstestet blinkar bara en gång, samma grejj efter en soft-reset.

Testade att byta PIC-krets nu. En PIC18F1320 (utan L alltså, vilket visserligen har någon betydelse här.)
Nu initieras displayen varje gång. Testkoden ska skriva ut "Fungerar" på rad 1, kolumn 1.
När jag ansluter spänning eller reset så får jag detta resultat:
Först skriver den "urar" på rad 1, kolumn 1. Ca 1 sekund senare töms displayen och en blinkande markör
kommer fram på rad 1, kolumn 1. Sedan försvinner den och det dyker upp något som ser ut som "=u->q"
längst till höger på rad 2. (istället för "->" ska det vara en pil åt höger.)
Detta resultat har jag fått 4 av 5 gånger. Ibland initeras bara övre raden och det skrivs ut """""""""" på hela den raden.
Andra raden är tom. Efter någon sekund så skriver den ut "=u->q" längst till höger på rad 2.

Det låter nästan som om jag kastat om pinnarna på displayen, men jag har kollat schemat och jämfört med koden.

...

Testade att låta en lysdiod tändas i taget. RB3 (D7), RB2 (D6), RB1 (D5), RB0 (D4), RA2 (RW), RA1 (E), RA0 (RS).
Displayens pinnar inom parantes. Denna ordning skulle göra att de tändes en efter en, som de sitter på stiftlisten,
för att enkelt se om allt var som det skulle.

Men när jag tittar på lysdioderna så är RW och E omkastade.
De lyser alltså såhär:
1000000
0100000
0010000
0001000
0000010
0000100
0000001

Schemat och databladet för PIC-kretsen stämmer. Koden stämmer med schemat. Lysdioderna sitter rätt.
Men.. någonstans är det uppenbarligen fel.

Tyvärr har jag inget datablad för displayen så jag kan inte jämföra den med schemasymbolen för displayen,
men det är en 2x16 HD44780-display av märke Sharp, utan backlight, som jag köpt av dig, Sodjan.
(Den modellen brukar kallas "Sodjan-displayen" här på forumet. :) )


edit: Hittade en lapp på displayen där det står LM16A211. Icecap verkar ha databladet på sin sajt. Länk.
Men ingen pinout.. Hm, får leta vidare.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av sodjan »

Användarvisningsbild
JimmyAndersson
Inlägg: 26526
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av JimmyAndersson »

Tack! :)

Jag har hittat ett "fel": Pinnarna på displaysymbolen i schemat var lite annorlunda numrerade: ...3,4,6,5...
Resten stämmer, så det var lätt att missa. Upphovsmannen ville väl inte göra det för logiskt antar jag,
eller så ville han/hon ha RS, E och R/W i den ordningen. :)

Då ska vi se.. Då stämmer ju lysdiodstestet och displayen är rätt kopplad, eftersom jag gick efter namnen (RS, E och R/W, osv)
istället för pinnarnas nummer när jag gjorde schemat.

Så då är det något annat fel.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av sodjan »

Måste du läsa från LCD'n ? Annars är det vanligt att man bara lägger R/W fast till GND.
Jag har kört den där LCD'n flera gånger utan problem, även om det är några
år sedan sist nu. Måste vara något skitfel någonstans...
Användarvisningsbild
JimmyAndersson
Inlägg: 26526
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av JimmyAndersson »

Precis.
Jag har också använt den displayen flera gånger tidigare och det har aldrig varit något problem. (förutom slarvfel i början då förstås. :) )

Men nu har jag hittat något:

Jag provade att köra med HS istället för HSPLL och nu visar displayen vad den ska. Har även testat koppla i/ur nätagget och gjort några soft-reset'ar.

Kristallen (10MHz) med tillhörande kondingar (22pF) sitter 2-3mm ifrån IC-hållaren (med ca 2-3mm långa kopparbanor).
PIC-kretsens avkopplingskonding (100nF) sitter lödd precis under PIC-kretsens matningspinnar.
Det sitter en 1µF elektrolytkonding direkt under kontakten för matningspänningen på kretskortet. Därfrån är det ca 2cm långa kopparbanor till PIC-kretsen.
Alla pinnar är satta till utgångar.


Visserligen klarar jag mig med 10MHz, men det vore lite intressant att veta vad som ligger bakom problemet med att
det inte fungerar när jag använder PLL'en och kör med 40MHz.
Användarvisningsbild
Icecap
Inlägg: 26628
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av Icecap »

Oftast är det för att man inte kommunicerar med LCD-modulen i lagom hastighet, öka alltså på fördröjningen.
Användarvisningsbild
JimmyAndersson
Inlägg: 26526
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av JimmyAndersson »

Då måste jag byta tillbaka till assembler igen. Jag anar att det är delay-funktionerna i MikroBasic som blir fel.
Jag återkommer lite senare med lite (förhoppningsvis) trevlig asm-kod. :)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av sodjan »

> Jag anar att det är delay-funktionerna i MikroBasic som blir fel.

De bygger väl på att man talar om för MikroBasic vilken hastighet
man tänker använda !?
Användarvisningsbild
JimmyAndersson
Inlägg: 26526
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av JimmyAndersson »

Japp. När jag har kört med HSPLL så har jag (förutom att ställa in rätt config-bitar, se koden) knappat in 40MHz.
När jag har kört med HS så har jag skrivit in 10MHz.
bearing
Inlägg: 11670
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av bearing »

Kan hända att delayfunktionerna är begränsade till 8bitars tal.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-kretsen låser sig vid olika tillfällen

Inlägg av sodjan »

Nej, deras exempel har tal upp till 2000.
Men de säger också att giltiga värden på konstanten
beror på klockhastigheten, men inte *hur* eller *vilka*
giltiga värden som gäller. Bekräftar bara att Mikroelektronikas
dokumentation tyvärr är ganska soppig. Har alltid tyckt det...
Skriv svar