PIC utan Kristall
OK. Om du inte har för avsikt att faktiskt köra med bootloader
i framtiden, så är det enklast att låta bli den...
För att testa UART'en behövs det 10-15 rader asm kod.
- Välj en lämplig baudrate och hastighet. T.ex 9600 och 20 Mhz.
- Kolla tabell 11-4, -> SPBRG = 129 (decimalt !)
- Sätt upp UART enligt punkterna högst upp på sid 103 (rev B).
(Hoppa över allt om "9-bit")
- Skriv ett eller flera tecken till TXREG. Kolla TXIF mellan skrivningarna.
Jag har antagligen något i något litet testprogram som kan användas,
men det är inte mer än vad jag beskriver ovan.
i framtiden, så är det enklast att låta bli den...
För att testa UART'en behövs det 10-15 rader asm kod.
- Välj en lämplig baudrate och hastighet. T.ex 9600 och 20 Mhz.
- Kolla tabell 11-4, -> SPBRG = 129 (decimalt !)
- Sätt upp UART enligt punkterna högst upp på sid 103 (rev B).
(Hoppa över allt om "9-bit")
- Skriv ett eller flera tecken till TXREG. Kolla TXIF mellan skrivningarna.
Jag har antagligen något i något litet testprogram som kan användas,
men det är inte mer än vad jag beskriver ovan.
Provade enklast möjliga kod utan framgång. Körde medföljande UART koden från Hi-tech. La till för att kör på den inbyggda oscillatorn. Hur kan jag felsöka det?
Kan MAX kretsen paja om man sätter RX och TX fel på picen?
Programmeringen fungerar utan problem men den kanske inte går via samma omvandlare?
Har nog inga kondingar hemma för att kunna köra extern oscillator.
Om det är interna oscillatorn som inte går rätt. Hur trimmar man den då? Jag vet vilket register det är men hur mäter man upp? Kör man intern oscillator med klockutgång och mäter med oscillioskåp?
Det borde inte vara oscilltorns trimning i och med att jag borde få ut blaj text i alla fall om kontakten fungerar.
MAX232-kretsen som sitter på Wisp628 kör med 1uF kondingar. Går det att byta ut den mot en MAX232 som bara behöver 0.1uF kondingar utan att byta kondingarna?
Kan MAX kretsen paja om man sätter RX och TX fel på picen?
Programmeringen fungerar utan problem men den kanske inte går via samma omvandlare?
Har nog inga kondingar hemma för att kunna köra extern oscillator.
Om det är interna oscillatorn som inte går rätt. Hur trimmar man den då? Jag vet vilket register det är men hur mäter man upp? Kör man intern oscillator med klockutgång och mäter med oscillioskåp?
Det borde inte vara oscilltorns trimning i och med att jag borde få ut blaj text i alla fall om kontakten fungerar.
MAX232-kretsen som sitter på Wisp628 kör med 1uF kondingar. Går det att byta ut den mot en MAX232 som bara behöver 0.1uF kondingar utan att byta kondingarna?
> Provade enklast möjliga kod...
> Hur kan jag felsöka det?
På vanligt sätt, antar jag.
Men om du vill ha hjälp med det, så får du nog visa vad du har gjort...
> Kan MAX kretsen paja om man sätter RX och TX fel på picen?
Osannlikt, men det är ju enkelt att kolla att den är OK.
Pilla lite med in och ut gångarna och mät upp att du får rätt
signaler på "andra sidan". Jag skulle inte tro att den är paj.
> Programmeringen fungerar utan problem men den kanske inte går via samma omvandlare?
Hm, du menar på Wisp628 ?
Jag har inte använt möjligheten till serieåterkoppling genom den
speciellt mycket (kör hellre med en separat MAX232), så jag vet inte.
> Om det är interna oscillatorn som inte går rätt.
Den ska gå *tillräckligt* rätt för en enkel test.
> Hur trimmar man den då?
> Jag vet vilket register det är men hur mäter man upp?
Antingen externt med någon instrument som kan mäta tid/frek.
Eller internt genom att mäta en känd tid/frek m.h.a koden.
Men, som sagt, lämna OSCTUNE = h'00', den ska gå tillräckligt rätt
för en test.
> MAX232-kretsen som sitter på Wisp628 kör med 1uF kondingar.
> Går det att byta ut den mot en MAX232 som bara behöver 0.1uF
> kondingar utan att byta kondingarna?
Hade du inte en extra MAX232 ?
Är det inte enklare att köra med den och låta Wisp628 vara som den är ?
Får du någon signal på TX pinnen när du försöker skicka (skriva till TXREG) ?
> Har nog inga kondingar hemma för att kunna köra extern oscillator.
Du menar två st (ca) 22 pF ?
Får jag en adress, så postar jag en gäng idag...
> Hur kan jag felsöka det?
På vanligt sätt, antar jag.

Men om du vill ha hjälp med det, så får du nog visa vad du har gjort...
> Kan MAX kretsen paja om man sätter RX och TX fel på picen?
Osannlikt, men det är ju enkelt att kolla att den är OK.
Pilla lite med in och ut gångarna och mät upp att du får rätt
signaler på "andra sidan". Jag skulle inte tro att den är paj.
> Programmeringen fungerar utan problem men den kanske inte går via samma omvandlare?
Hm, du menar på Wisp628 ?
Jag har inte använt möjligheten till serieåterkoppling genom den
speciellt mycket (kör hellre med en separat MAX232), så jag vet inte.
> Om det är interna oscillatorn som inte går rätt.
Den ska gå *tillräckligt* rätt för en enkel test.
> Hur trimmar man den då?
> Jag vet vilket register det är men hur mäter man upp?
Antingen externt med någon instrument som kan mäta tid/frek.
Eller internt genom att mäta en känd tid/frek m.h.a koden.
Men, som sagt, lämna OSCTUNE = h'00', den ska gå tillräckligt rätt
för en test.
> MAX232-kretsen som sitter på Wisp628 kör med 1uF kondingar.
> Går det att byta ut den mot en MAX232 som bara behöver 0.1uF
> kondingar utan att byta kondingarna?
Hade du inte en extra MAX232 ?
Är det inte enklare att köra med den och låta Wisp628 vara som den är ?
Får du någon signal på TX pinnen när du försöker skicka (skriva till TXREG) ?
> Har nog inga kondingar hemma för att kunna köra extern oscillator.
Du menar två st (ca) 22 pF ?
Får jag en adress, så postar jag en gäng idag...
Lyckades bränna picen på wisp628 nu också. Körde in 20V istället för 5V. Men efter en snabb runda till ELFA så lirar den nu.
Tack sodjan för erbjudandet av kondigar men jag skaffade ett par när jag ändå var till elfa.
Jag funderar på om det kan vara adress 2008h som spökar med Fail-safe för klockan. Vet inte hur jag konfar den adressen i Hi-tech eller via xwisp2w. Någon som vet?
Provade en 16f877a också nu som jag inte heller fick fungera.. hmm
Tack sodjan för erbjudandet av kondigar men jag skaffade ett par när jag ändå var till elfa.
Jag funderar på om det kan vara adress 2008h som spökar med Fail-safe för klockan. Vet inte hur jag konfar den adressen i Hi-tech eller via xwisp2w. Någon som vet?
Provade en 16f877a också nu som jag inte heller fick fungera.. hmm
Vadå "spökar" ?
Du ställer väl in den CONFIG som du ska ha på något sätt i källkoden ?
Alltså med __CONFIG om du kör assembler, eller på annat sätt
om du använder något annan verktyg. Dokumentationen till Hi-Tech
borde beskriva det. Jag tror inte att jag har sett något verktyg där man
inte kan speca CONFIG.
Eller menar du att du har problem specifikt med just den *andra*
CONFIG adressen ? Alltså med register CONFIG2 ?
> Provade en 16f877a också nu som jag inte heller fick fungera..
Jag har inte en aning om vad "fungera" betyder här...
Om det ska vara någon mening att posta problem/frågar alls, så
får du nog försöka åstakomma lite tydligare och genomtänka
inlägg som går att förstå.
Du ställer väl in den CONFIG som du ska ha på något sätt i källkoden ?
Alltså med __CONFIG om du kör assembler, eller på annat sätt
om du använder något annan verktyg. Dokumentationen till Hi-Tech
borde beskriva det. Jag tror inte att jag har sett något verktyg där man
inte kan speca CONFIG.
Eller menar du att du har problem specifikt med just den *andra*
CONFIG adressen ? Alltså med register CONFIG2 ?
> Provade en 16f877a också nu som jag inte heller fick fungera..
Jag har inte en aning om vad "fungera" betyder här...
Om det ska vara någon mening att posta problem/frågar alls, så
får du nog försöka åstakomma lite tydligare och genomtänka
inlägg som går att förstå.
Jag ska försöka förtydliga mig. Som det är nu så kan jag programmera både 16f877 och 16f88 men vilken kod jag än kör in och om jag använder lös max232 eller wisp628 inbyggda så får jag inte datakommunikationen att fungera.
Något gör så att jag inte får datakommunikationen att fungera. Ska testa att koppla till en LCD och se om den lirar som den ska.
Något gör så att jag inte får datakommunikationen att fungera. Ska testa att koppla till en LCD och se om den lirar som den ska.
Här kommer lite kod..
Dioden blinkar som den ska., alltså ungefär 2 blink / sek.,
Dioden blinkar som den ska., alltså ungefär 2 blink / sek.,
Kod: Markera allt
/*
* LCD interface example
* Uses routines from delay.c
* This code will interface to a standard LCD controller
* like the Hitachi HD44780. It uses it in 4 bit mode, with
* the hardware connected as follows (the standard 14 pin
* LCD connector is used):
*
* PORTB bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
* PORTA bit 2 is connected to the LCD RS input (register select)
* PORTA bit 3 is connected to the LCD EN bit (enable)
*
* To use these routines, set up the port I/O (TRISA, TRISB) then
* call lcd_init(), then other routines as required.
*
*/
#include <pic.h>
#include "lcd.h"
#include "delay.h"
__CONFIG(0x2F78);
static bit LCD_RS @ ((unsigned)&PORTA*8+2); // Register select
static bit LCD_EN @ ((unsigned)&PORTA*8+3); // Enable
#define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0))
/* write a byte to the LCD in 4 bit mode */
void main(void)
{
OSCCON=0b01110000;
DelayMs(200);
ANSEL=0;
TRISA=0;
TRISB=0;
lcd_init();
lcd_puts("HEJ!!");
while (1) {
RA0=1;
DelayMs(200);
RA0=0;
DelayMs(200);
}
}
void
lcd_write(unsigned char c)
{
PORTB = (PORTB & 0xF0) | (c >> 4);
LCD_STROBE;
PORTB = (PORTB & 0xF0) | (c & 0x0F);
LCD_STROBE;
DelayUs(40);
}
/*
* Clear and home the LCD
*/
void
lcd_clear(void)
{
LCD_RS = 0;
lcd_write(0x1);
DelayMs(2);
}
/* write a string of chars to the LCD */
void
lcd_puts(const char * s)
{
LCD_RS = 1; // write characters
while(*s)
lcd_write(*s++);
}
/* write one character to the LCD */
void
lcd_putch(char c)
{
LCD_RS = 1; // write characters
PORTB = (PORTB & 0xF0) | (c >> 4);
LCD_STROBE;
PORTB = (PORTB & 0xF0) | (c & 0x0F);
LCD_STROBE;
DelayUs(40);
}
/*
* Go to the specified position
*/
void
lcd_goto(unsigned char pos)
{
LCD_RS = 0;
lcd_write(0x80+pos);
}
/* initialise the LCD - put into 4 bit mode */
void
lcd_init(void)
{
LCD_RS = 0; // write control bytes
DelayMs(15); // power on delay
PORTB = 0x3; // attention!
LCD_STROBE;
DelayMs(5);
LCD_STROBE;
DelayUs(100);
LCD_STROBE;
DelayMs(5);
PORTB = 0x2; // set 4 bit mode
LCD_STROBE;
DelayUs(40);
lcd_write(0x28); // 4 bit mode, 1/16 duty, 5x8 font
lcd_write(0x08); // display off
lcd_write(0x0F); // display on, blink curson on
lcd_write(0x06); // entry mode
}
Här kommer kod för rs232 som jag inte får att lira. I simulatorn fungerar allt prima men IRL får jag bara att LEDen att blinka.
Koden är hämtad från sample codes till hi-tech pic c så det borde lira. Förstår inte vad som är felet.
Har provat med extern oscillator utan framgång. Konfade självklart __CONFIG för att köra HS oscillator (20Mhz) och sedan ändrade jag oscillatorfrekvensen i delay.h och serial.h
Koden är hämtad från sample codes till hi-tech pic c så det borde lira. Förstår inte vad som är felet.
Har provat med extern oscillator utan framgång. Konfade självklart __CONFIG för att köra HS oscillator (20Mhz) och sedan ändrade jag oscillatorfrekvensen i delay.h och serial.h
Kod: Markera allt
#include <stdio.h>
#include <pic.h>
#include "usart.h"
#include "delay.h"
/* A simple demonstration of serial communications which
* incorporates the on-board hardware USART of the Microchip
* PIC16Fxxx series of devices. */
__CONFIG(0x2F78);
void main(void){
unsigned char input;
OSCCON=0b01110000;
DelayMs(200);
TRISA=0;
RA0=0;
DelayMs(200);
RA0=1;
DelayMs(200);
RA0=0;
INTCON=0; // purpose of disabling the interrupts.
init_comms(); // set up the USART - settings defined in usart.h
// Output a message to prompt the user for a keypress
printf("\rPress a key and I will echo it back:\n");
while(1){
input = getch(); // read a response from the user
printf("\rI detected [%c]",input); // echo it back
}
}
Kod: Markera allt
#ifndef _USART_H_
#define _USART_H_
#define BAUD 9600
#define FOSC 8000000L
#define NINE 0 /* Use 9bit communication? FALSE=8bit */
#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
#define HIGH_SPEED 1
#if NINE == 1
#define NINE_BITS 0x40
#else
#define NINE_BITS 0
#endif
#if HIGH_SPEED == 1
#define SPEED 0x4
#else
#define SPEED 0
#endif
#if defined(_16F87) || defined(_16F88)
#define RX_PIN TRISB2
#define TX_PIN TRISB5
#else
#define RX_PIN TRISC7
#define TX_PIN TRISC6
#endif
/* Serial initialization */
#define init_comms()\
RX_PIN = 1; \
TX_PIN = 1; \
SPBRG = DIVIDER; \
RCSTA = (NINE_BITS|0x90); \
TXSTA = (SPEED|NINE_BITS|0x20)
void putch(unsigned char);
unsigned char getch(void);
unsigned char getche(void);
#endif
Äntligen har jag fått den att skriva ut i terminalen på datorn., Det är en hel del fel i texten men nu har jag något att utgå ifrån i alla fall.
Verkar som att den interna 8Mhz osc. inte är så kallibrerad. Det fungerade bättre med extern oscillator.
Nu blir jobbet all kallibrera den interna. Hur ska jag göra? Något man kan göra enkelt utan oscilloskåp eller måste jag dra mig till skolan ock fixa det?
Verkar som att den interna 8Mhz osc. inte är så kallibrerad. Det fungerade bättre med extern oscillator.
Nu blir jobbet all kallibrera den interna. Hur ska jag göra? Något man kan göra enkelt utan oscilloskåp eller måste jag dra mig till skolan ock fixa det?
Felen är alla möjliga. Det verkar vara fel pga baudhastigheten inte stämmer.
Vissa bokstäver försvinner, byts ut eller liknande. Man kan ana vad det ska stå men inte alltid. Särskillt när radbrytningarna försvinner.
Det blev perfekt med extern oscillator.
Min pic var inte tillräckligt bra kalibrerad i alla fall. Kan inte mäta upp här men kan göra det i skolan. Hoppas jag kan få till den då med lite kalibrering. 9600 baud på den interna oscillatorn lirade inte tillräckligt bra i alla fall..
Vissa bokstäver försvinner, byts ut eller liknande. Man kan ana vad det ska stå men inte alltid. Särskillt när radbrytningarna försvinner.
Det blev perfekt med extern oscillator.
Min pic var inte tillräckligt bra kalibrerad i alla fall. Kan inte mäta upp här men kan göra det i skolan. Hoppas jag kan få till den då med lite kalibrering. 9600 baud på den interna oscillatorn lirade inte tillräckligt bra i alla fall..
> Det blev perfekt med extern oscillator.
OK, missförstog dig på den punkten...
Vill du kolla INTOSC kan du göra ett litet testprogram
som t.ex blinkar långsamt. Sedan är det bara att räkna blink över
en tid och räkna ut hastigheten i Mhz.
Eller låta processorn mäta en känd signal, t.ex 50/100 Hz från en
nätdel.
Vad har du gjort för att debugga ?
T.ex att byta ut "DIVIDER" i koden mot värden som du har räknat ut själv ?
Hur har du verifierat att beräkningarna i koden ger korrekta värden för SPBRG ?
> Min pic var inte tillräckligt bra kalibrerad i alla fall.
Kanske, men du har inte levererat något bevis på det än.
Det är mycket mer troligt att ditt program inte ställer in USART'en korrekt,
än att fabrikskallibreringen skulle vara fel. Inte omöjligt men osannolikt...
På en F88 finns det inget sätt att "radera" kallibrerigen av misstag, som
det gör på de PIC's som har den äldre INTOSC/INTRC.
OK, missförstog dig på den punkten...
Vill du kolla INTOSC kan du göra ett litet testprogram
som t.ex blinkar långsamt. Sedan är det bara att räkna blink över
en tid och räkna ut hastigheten i Mhz.
Eller låta processorn mäta en känd signal, t.ex 50/100 Hz från en
nätdel.
Vad har du gjort för att debugga ?
T.ex att byta ut "DIVIDER" i koden mot värden som du har räknat ut själv ?
Hur har du verifierat att beräkningarna i koden ger korrekta värden för SPBRG ?
> Min pic var inte tillräckligt bra kalibrerad i alla fall.
Kanske, men du har inte levererat något bevis på det än.
Det är mycket mer troligt att ditt program inte ställer in USART'en korrekt,
än att fabrikskallibreringen skulle vara fel. Inte omöjligt men osannolikt...
På en F88 finns det inget sätt att "radera" kallibrerigen av misstag, som
det gör på de PIC's som har den äldre INTOSC/INTRC.